1

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

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

4

1 回答 1

8

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应该已经规范化不存在了。

于 2012-05-31T13:01:08.257 回答