触发器中存在条件

问题描述 投票:0回答:2

我对PL / SQL很陌生,如果问题很明显,对不起

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

ORA-02251

  1. 00000 - “这里不允许使用子查询”

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

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

我错过了什么?

我的情况如下:

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部分执行此操作,但是:

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

如果另一个条件可能会这样做,我也很感兴趣。

sql oracle plsql triggers
2个回答
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;

0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.