Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 否则就触发_Sql_Oracle_Triggers - Fatal编程技术网

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
关键字。啊!