触发if else

时间:2012-05-31 12:33:55

标签: sql oracle triggers

我有一个触发器来验证字段是否为空:

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

1 个答案:

答案 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应该已经标准化了。