2017-02-12 81 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'哦。 –