2013-03-26 61 views
0

我試圖得到一個觸發器來更新reportnum和後綴,並與Coldfusion ORM兼容。要使用單個鍵爲表格工作,我已經使用了下面示例的第一部分。在這個表中,如果給出報告編號,我需要它將後綴更新爲下一個值。Oracle PL/SQL觸發器錯誤

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; 

我得到的錯誤是他們的命令沒有正確結束。

回答

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 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; 
+1

'REPORTNUM'和'SUFFIX'是數字。不會將它們與「'總是評估爲假?如果是這樣,你將不需要'COALESCE'。 – 2013-03-26 21:06:59

+0

這很簡單,我應該看到。感謝合併我認爲那裏可以簡化這個陳述。 – Aaron 2013-03-26 21:08:16

+0

@EdGibbs,你是對的,我沒有注意到數據類型,我看到OP正在檢查''並假定它們是字符類型。 – 2013-03-26 21:09:36

0

你沒有得到的Oracle PL/SQL觸發器錯誤,它是語法錯誤。 試試這個:

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雙;

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

END IF; 

END;