快速浏览online documentation 会告诉您条件语法是 WHEN 而不是 WHERE。
您还应该使用 NEW 关键字而不是表名来引用列。正如 Gary 正确指出的那样,我们只能将条件子句应用于 ROW LEVEL 触发器:
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。