Oracle触发器 - 根据表A的条件更新表B.

时间:2016-02-25 16:21:15

标签: sql oracle triggers

我正在尝试创建一个Oracle触发器,它根据触发器中运行的select语句设置表B上列的值。

我希望能够在执行表A上的插入后,根据select语句将表B中'is_active'列的值设置为'N'。

我的查询如下:

CREATE OR REPLACE TRIGGER INACTIVE_STATE 
AFTER INSERT ON 
COMMENTS 
FOR EACH ROW  
DECLARE 
  inactive_id number;
BEGIN
  SELECT    distinct b.id 
  into    inactive_id
    from    comments a,
            modules b
    where   a.module_name=b.name
    and     a.type_id='FUNCTIONAL'
    and     a.module_id=b.id;
update  modules
set is_active='N'
where ID=:inactive_id
END INACTIVE_STATE;
/

当我尝试并编译此触发器时,我收到以下错误:

Error(15,1): PL/SQL: SQL Statement ignored
Error(17,10): PLS-00049: bad bind variable 'INACTIVE_ID'
Error(17,15): PL/SQL: ORA-00933: SQL command not properly ended
Error(19,1): PLS-00103: Encountered the symbol "/" when expecting one of the following:     ( begin case declare end exception exit for goto if loop mod    null pragma raise return select update while with    <an identifier> <a double-quoted delimited-identifier>    <a bind variable> << continue close current delete fetch lock    insert open rollback savepoint set sql execute commit forall    merge pipe purge 

它似乎不喜欢update语句,或者在此过程中没有解析绑定变量。

如果我将这些语句分成2个命令(使用var来处理绑定变量:inactive_id),它会按预期工作。

VAR INACTIVE_ID number
begin
    select  distinct b.id into :INACTIVE_ID
    from    comments a,
            modules b
    where   a.module_name=b.name
    and     a.type_id='FUNCTIONAL'
    and     a.module_id=b.id;
    end;
    /

PL/SQL procedure successfully completed.

SQL>
SQL> update    modules
     set is_active='N'
     where ID=:INACTIVE_ID  
     /

    1 row updated.

我可能会忽略任何想法?

2 个答案:

答案 0 :(得分:1)

正如Tony Andrews在原帖的评论中指出的那样,我在#34; inactive_id&#34;之前错误地使用了冒号。 where子句中的变量。

正确的代码应该是:

CREATE OR REPLACE TRIGGER INACTIVE_STATE 
AFTER INSERT ON 
COMMENTS 
DECLARE 
  inactive_id number;
BEGIN
  SELECT    distinct b.id 
  into    inactive_id
    from    comments a,
            modules b
    where   a.module_name=b.name
    and     a.type_id='FUNCTIONAL'
    and     a.module_id=b.id;
update  modules
set is_active='N'
where ID=inactive_id
END INACTIVE_STATE;
/

答案 1 :(得分:-2)

尝试使用

    PRAGMA AUTONOMOUS_TRANSACTION;
开始前