触发器

时间:2015-06-04 12:49:00

标签: sql oracle plsql triggers

我对PL / SQL很陌生,如果问题很明显,很抱歉

根据TRIGGER documentation,触发器有一个WHEN(条件)。我想使用exists condition,这需要子查询,但是,我有以下错误:

  

ORA-02251

     
      
  1. 00000 - "此处不允许使用子查询"
  2.         

    *原因:声明中不允许使用子查询。

         

    *操作:从语句中删除子查询。

我错过了什么?

我的情况如下:

CREATE OR REPLACE TRIGGER mytrigger AFTER UPDATE OF column ON THIS_TABLE 
FOR EACH ROW 
WHEN (NEW.status = 'approved' AND EXISTS (
SELECT * FROM JUNCTION_TABLE WHERE THIS_TABLE_ID=NEW.this_table_id AND OTHER_TABLE_ID = 'SOMETHING'))
DECLARE
BEGIN
END;

我想检查该行是否与给定值相关联,我只能在联结表中找到该值。

我肯定可以在触发器的PL / SQL部分执行此操作,但是:

  • 它与触发器有关,而不是业务逻辑本身
  • 我想了解文档中遗漏的内容以及为什么不可能。

如果另一种情况可能会这样做,我也感兴趣。

2 个答案:

答案 0 :(得分:0)

我会用触发器本身的条件元素来写这个,比如

CREATE OR REPLACE TRIGGER mytrigger AFTER UPDATE OF column ON THIS_TABLE 
FOR EACH ROW 
WHEN (NEW.status = 'approved')

DECLARE
BEGIN
  IF EXISTS (
    SELECT * FROM JUNCTION_TABLE WHERE THIS_TABLE_ID=NEW.this_table_id AND OTHER_TABLE_ID = 'SOMETHING'))
...
END;

答案 1 :(得分:0)

我不知道使用了哪些Oracle文档。虽然Oracle 10.2文档没有提到这一点,但在Oracle 11.1 documentation中提到了限制:

  

WHEN子句中的表达式必须是SQL表达式,不能包含子查询。您不能在WHEN子句中使用PL / SQL表达式(包括用户定义的函数)。

如上所述,我现在无法想到检查触发器代码中的条件。