我正在尝试创建一个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.
我可能会忽略任何想法?
答案 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;
开始前