繁体   English   中英

是否可以在触发器(Oracle)中动态更改 where 子句?

[英]Is it possible to change a where clause dynamically in a trigger (Oracle)?

Select...某事...来自...某处... where condition1 和(如果更新则 condition2 elsif 删除则 condition3)。 这当然只是伪代码。 有可能发表这样的声明吗? 当我尝试时,它会强调updating 我应该使用什么? 案子? 逻辑运算符? 一切似乎都是被禁止的。 这只是在触发器中开始之后。

CREATE OR REPLACE TRIGGER FIX_UPD_LIMITS
BEFORE UPDATE OR DELETE ON LIMITS
FOR EACH ROW
DECLARE
    is_deleted_dependant VARCHAR2(1 BYTE);
    is_editable_dependant VARCHAR2(1 BYTE);
BEGIN
    SELECT IS_DELETE, IS_EDITABLE 
    INTO is_deleted_dependant, is_editable_dependant
    FROM MAP_CALCULATION MC 
        INNER JOIN map_calculation_group MG ON MC.ID_CALC = MG.ID_CALC
    WHERE MG.ID_CALC = MC.ID_CALC
    AND ((UPDATING AND mg.id_group = :new.id_group)
        OR (DELETING AND :old.id_group = mg.id_group)
    ); 

    IF UPDATING AND (is_editable_dependant = 'F' OR is_deleted_dependant = 'T') THEN
        ...   
    ELSIF DELETING AND (is_editable_dependant = 'F' OR is_deleted_dependant = 'T') THEN
        ...
    END IF;

END;
/

UPDATING 和 DELETING 是 PL/SQL 关键字,仅在触发器主体中有效。 SQL 引擎不理解它们。 因此编译错误。

:NEW.GROUP_ID 将在您更新时填充,null 将在您删除时填充。 所以这应该适合你:

    SELECT IS_DELETE, IS_EDITABLE 
    INTO is_deleted_dependant, is_editable_dependant
    FROM MAP_CALCULATION MC 
        INNER JOIN map_calculation_group MG ON MC.ID_CALC = MG.ID_CALC
    WHERE MG.ID_CALC = MC.ID_CALC
    AND mg.id_group = coalesce(:new.id_group, :old.id_group)
    ); 



暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM