0

我正在尝试获取触发器来更新报告编号和后缀并与 Coldfusion ORM 兼容。为了使这适用于具有单个键的表,我使用了下面示例的第一部分。在此表中,如果给出报告编号,我需要将后缀更新为下一个值。

CREATE TABLE tb1 ( reportnum NUMBER, suffix NUMBER );

CREATE SEQUENCE seq1 START WITH 1;

CREATE OR REPLACE TRIGGER "TRG1_TB1" BEFORE INSERT ON
tb1 FOR EACH ROW
BEGIN
    IF :NEW.reportnum IS NULL  THEN
        SELECT seq1.NEXTVAL INTO :NEW.reportnum FROM dual;

    ELSIF :NEW.REPORTNUM = ''  THEN
        SELECT seq1.NEXTVAL INTO :NEW.reportnum FROM dual;

    ELSIF :NEW.suffix = '' THEN
        SELECT MAX(suffix)+1 INTO :NEW.suffix FROM tb1 WHERE reportnum = :NEW.reportnum

    ELSIF :NEW.suffix = NULL THEN
        SELECT MAX(suffix)+1 INTO :NEW.suffix FROM tb1 WHERE reportnum = :NEW.reportnum

    END IF; 
END;

我得到的错误是他们的命令没有正确结束。

4

2 回答 2

1

;在后缀查询末尾添加

 ELSIF :NEW.suffix = '' THEN
    SELECT MAX(suffix)+1 INTO :NEW.suffix 
    FROM tb1 WHERE reportnum = :NEW.reportnum;

ELSIF :NEW.suffix = NULL THEN
    SELECT MAX(suffix)+1 INTO :NEW.suffix 
    FROM tb1 WHERE reportnum = :NEW.reportnum;

您还可以通过这样做来减少两者的 if 语句数量:例如:

 IF coalesce(:NEW.reportnum,-1) = -1  THEN
    SELECT seq1.NEXTVAL INTO :NEW.reportnum FROM dual;  

ELSIF coalesce(:NEW.suffix,-1) = -1 THEN
    SELECT MAX(suffix)+1 INTO :NEW.suffix 
    FROM tb1 WHERE reportnum = :NEW.reportnum;
END IF; 
于 2013-03-26T20:59:57.643 回答
0

您没有收到 Oracle PL/SQL 触发器错误,这是语法错误。尝试这个:

CREATE TABLE tb1 (reportnum NUMBER, 后缀 NUMBER);

创建序列 seq1 从 1 开始;

在插入 tb1 之前创建或替换触发器“TRG1_TB1”,如果:NEW.reportnum 为 NULL,则每行开始,然后从 dual 中选择 seq1.NEXTVAL INTO:NEW.reportnum;

ELSIF :NEW.suffix is NULL THEN
    SELECT MAX(suffix)+1 INTO :NEW.suffix FROM tb1 WHERE reportnum = :NEW.reportnum;

END IF;

结尾;

于 2013-03-31T18:03:12.040 回答