触发器中存在条件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了触发器中存在条件相关的知识,希望对你有一定的参考价值。
我对PL / SQL很陌生,如果问题很明显,对不起
根据TRIGGER documentation,触发器有一个WHEN(条件)。我想使用exists condition,它需要子查询,但是,我有以下错误:
ORA-02251
- 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部分执行此操作,但是:
- 它与触发器有关,而不是与业务逻辑本身有关
- 我想了解文档中遗漏的内容以及为什么不可能。
如果另一个条件可能会这样做,我也很感兴趣。
答案
我会用触发器本身的条件元素来写这个,比如说
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;
另一答案
我不知道使用了哪个Oracle文档。虽然Oracle 10.2文档没有提到这一点,但在Oracle 11.1 documentation中提到了限制:
WHEN子句中的表达式必须是SQL表达式,并且不能包含子查询。您不能在WHEN子句中使用PL / SQL表达式(包括用户定义的函数)。
如上所述,我现在无法想到检查触发器代码中的条件。
以上是关于触发器中存在条件的主要内容,如果未能解决你的问题,请参考以下文章