2011-05-30 125 views
3
create or replace trigger insert_test_id 
before insert on test 
where(test.name='Ash') 
begin 
insert into test(s_no) values('def'); 
end 

我的表是条件触发

测试 ID整数 名VARCHAR2(200) S_NO VARCHAR2(250)

请你告诉我,什么是在这个触发错误。我无法知道。

+1

请发布错误消息! – Tim 2011-05-30 07:46:16

+0

ORA-04079:无效的触发规范 这是错误消息 – 2011-05-30 07:49:52

回答

5

快速浏览一下online documentation会告诉你条件语法是WHEN不是WHERE。

您还应该使用NEW关键字而不是表名引用列。正如加里正确地指出,我们只能申请行级的条件子句触发:

SQL> create or replace trigger insert_test_id 
    2 before insert on t23 
    3 for each row 
    4 when (new.name='Ash') 
    5 begin 
    6  insert into t23(name) values('def'); 
    7 end; 
    8/

Trigger created. 

SQL> insert into t23 values ('abc') 
    2/

1 row created. 

SQL> select name from t23 
    2/

NAM 
--- 
abc 

1 rows selected. 

SQL> 

条件的作品太...

SQL> insert into t23 values ('Ash') 
    2/

1 row created. 

SQL> select name from t23 
    2/

NAM 
--- 
abc 
def 
Ash 

3 rows selected. 

SQL> 

它甚至适用于多行....

SQL> insert into t23 
    2 select txt from t42 
    3/

4 rows created. 

SQL> select name from t23 
    2/

NAM 
--- 
abc 
def 
Ash 
XXX 
ZZZ 
ABC 
DEF 

7 rows selected. 

SQL> 

那么是什么问题?此:

SQL> create or replace trigger insert_test_id 
    2 before insert on t23 
    3 for each row 
    4 when (new.name='def') 
    5 begin 
    6  insert into t23(name) values('def'); 
    7 end; 
    8/

Trigger created. 

SQL> insert into t23 values ('def') 
    2/
insert into t23 values ('def') 
      * 
ERROR at line 1: 
ORA-00036: maximum number of recursive SQL levels (50) exceeded 
ORA-06512: at "APC.INSERT_TEST_ID", line 2 
ORA-04088: error during execution of trigger 'APC.INSERT_TEST_ID' 
ORA-06512: at "APC.INSERT_TEST_ID", line 2 
ORA-04088: error during execution of trigger 'APC.INSERT_TEST_ID' 
ORA-06512: at "APC.INSERT_TEST_ID", line 2 
ORA-04088: error during execution of trigger 'APC.INSERT_TEST_ID' 
ORA-06512: at "APC.INSERT_TEST_ID", line 2 
ORA-04088: error during execution of trigger 'APC.INSERT_TEST_ID' 
ORA-06512: at "APC.INSERT_TEST_ID", line 2 
ORA-04088: error during execution of trigger 'APC.INSERT_TEST_ID' 
ORA-06512: at "APC.INSERT_TEST_ID", line 2 
ORA-04088: error during execution of trigger 'APC.INSERT_TEST_ID' 
ORA-06512: at "APC.INSERT_TEST_ID", line 2 
ORA-04088: error during execution of trigger 'APC.INSERT_TEST_ID' 
ORA-06512: at "APC.INSERT_TEST_ID", line 2 
ORA-04088: error during execution of trigger 'APC.INSERT_TEST_ID' 
ORA-06512: at "APC.INSERT_TEST_ID", line 2 
ORA-04088: error during execution of trigger 


SQL> 

当然,我在这里作弊,以产生错误。如果测试值和替代值都是硬编码的,则可以避免这个问题。但是,如果要么查找,那么递归的风险就在那里。


如果你真正想要做的是更换输入值,而插入一个附加行,你应该使用simple assignment syntax posted by @Lukas

+1

您需要FOR EACH ROW – 2011-05-30 22:47:55

1

我不认为你可以像这样定义具有递归行为的触发器。做正确的做法是

create or replace trigger insert_test_id 
before insert on test 

-- note: it is "when", not "where" 
when(test.name='Ash') 
begin 

    -- this is how you override a field from within the trigger 
    :new.s_no := 'def'; 
end; 

然而,这只会插入一条记录,而不是两个,如果这是你的原意。

+0

感谢您的回复我的朋友。但是这不起作用。再次,它给错误'ORA-04077:WHEN子句不能用于表级触发器' – 2011-05-30 08:06:17

+0

请参阅DCookie的答案... – 2011-05-30 16:06:19

3

试试这一个,那么:

CREATE OR REPLACE TRIGGER insert_test_id 
BEFORE INSERT ON test 
WHEN(new.name='Ash') 
FOR EACH ROW 
BEGIN 
    :new.s_no := 'def'; 
END; 

的 “FOR EACH ROW” 使其成为一个语句级触发器,对受插入到表的每一行执行。这应该摆脱ora-04077