Sql 否则就触发
我有一个触发器,用于验证字段是否为空:Sql 否则就触发,sql,oracle,triggers,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; en
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,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;
请注意,这不会处理表2中是否存在与标准匹配的多行,或者实际上没有匹配的行。它也不处理锁定
另外,请记住,这样的代码在多用户环境中无法正常工作。这就是我提到锁定的原因。您真的应该使用过程逻辑来处理这些类型的需求。尽管像通常情况一样,考虑不周的触发器,真正的罪魁祸首是糟糕的数据模型
table2.column2
应该已经标准化,不再存在。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;
请注意,这不会处理表2中是否存在与标准匹配的多行,或者实际上没有匹配的行。它也不处理锁定
另外,请记住,这样的代码在多用户环境中无法正常工作。这就是我提到锁定的原因。您真的应该使用过程逻辑来处理这些类型的需求。尽管像通常情况一样,考虑不周的触发器,真正的罪魁祸首是糟糕的数据模型<代码>表2。第2列应该已经正常化,不再存在。您能给我们错误代码/消息吗?对于我的触发器,没有错误消息,只是一个避免说明触发器是由编译错误创建的。您能给我们错误代码/消息吗?对于我的触发器,没有错误消息,这只是一个避免说,触发器是用编译错误创建的。它不起作用-它告诉我“触发器没有正确创建”错误行4。我们没有心灵感应。你需要告诉我们细节。运行SQL*PLus命令
显示错误
,或者使用以下查询:从用户错误中选择*。我不知道为什么。当我尝试运行触发器时,它显示错误:“ORA-04079”指向“v table2.column2%type;”第4行。仅此而已。我使用了您发布的模式。如果你没有一个带有列2的表2
,那么你需要替换真实姓名。另一件事是我省略了declare
关键字。啊!它不工作-它告诉我“触发器没有正确创建”错误行4。我们没有心灵感应。你需要告诉我们细节。运行SQL*PLus命令显示错误
,或者使用以下查询:从用户错误中选择*。我不知道为什么。当我尝试运行触发器时,它显示错误:“ORA-04079”指向“v table2.column2%type;”第4行。仅此而已。我使用了您发布的模式。如果你没有一个带有列2的表2
,那么你需要替换真实姓名。另一件事是我省略了declare
关键字。啊!