2017-02-12 69 views
-2

我嘗試使用before insert觸發器執行序列時遇到問題。SQL Developer中的綁定變量與Oracle 11g

CREATE TABLE personne (ID number, nom varchar2(250 char)); 

CREATE SEQUENCE s_inc_pers START WITH 1 INCREMENT BY 1; 

CREATE TRIGGER tr_inc_pers ON t1 BEFORE INSERT 
FOR EACH ROW 
DECLARE 
BEGIN 
    select s_inc_pers into :new.t1.ID from DUAL; 
END. 
+2

它通常是幫助人們回答更快,更好,如果您包括您所遇到的那種問題在原始問題中:例如,您遇到的錯誤消息或行爲,以及它與預期的不同 –

回答

2

甲骨文如果您嘗試引用一些與:NEW不在目標表中的列報告一個壞的綁定變量。在這種情況下,它可能會提示您輸入綁定值,因爲該語句格式錯誤。

The NEW pseudorecord引用正在受該語句影響的觸發表中的行。當您使用pseudorecord字段時,您不需要(也不一定)包含表名,因此:new.t1.ID應該只是:new.ID

若要get the next value from the sequence您需要使用nextval,您不僅可以提供序列名稱。

您的子句也是錯誤的順序,您需要DML事件(插入)在目標表中執行操作。

CREATE TRIGGER tr_inc_pers BEFORE INSERT ON t1 
FOR EACH ROW 
BEGIN 
    select s_inc_pers.nextval into :new.ID from DUAL; 
END; 

當您使用11g中,您甚至不必從雙重選擇,you can just assign the column value

CREATE TRIGGER tr_inc_pers BEFORE INSERT ON t1 
FOR EACH ROW 
BEGIN 
    :new.ID := s_inc_pers.nextval; 
END; 
+0

@mathguy - 哈哈,謝謝。 D'哦。 –

相關問題