我有一个触发器来验证字段是否为空:
create or replace trigger trig1
after insert on table_1
for each row
begin
if ((select table2.column2 from table2 where table2.id= :new.id) isnull) then
update table2 set table2.column2 = :new.column1 where table2.id = :new.id;
end if;
end trig1;
.
run;
我收到错误,指出未正确创建触发器。我不知道问题是什么。我使用的是Oracle SQL * Plus 10.2.0
答案 0 :(得分:7)
PL / SQL语法不允许在IF子句中包含SQL语句。
正确的方法是分离出SELECT语句,然后测试其结果。那就是:
create or replace trigger trig1
after insert on table_1
for each row
declare
v table2.column2%type;
begin
select table2.column2
into v
from table2
where table2.id= :new.id;
if v is null
then
update table2
set table2.column2 = :new.column1
where table2.id = :new.id;
end if;
end trig1;
请注意,这不会处理匹配条件的table2
中存在多个行,或者确实没有匹配的行。它也不处理锁定。
另外,请记住,像这样的代码在多用户环境中不能很好地运行。这就是我提到锁定的原因。您应该使用过程逻辑来处理这些类型的需求。尽管通常是错误构想触发器的情况,但真正的罪魁祸首是数据模型不佳。 table2.column2
应该已经标准化了。