【问题标题】:Is it possible to change a where clause dynamically in a trigger (Oracle)?是否可以在触发器(Oracle)中动态更改 where 子句?
【发布时间】:2020-04-20 14:49:27
【问题描述】:

选择 ...something... from ...somewhere... 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;
/

【问题讨论】:

  • “select”语句如何更新?
  • 向我们展示您的触发代码尝试。
  • 已编辑,请看
  • PL/SQL 中完全灵活的动态 sql 是通过包 dbms_sql 完成的。 execute immediate 命令在占位符方面具有一定的灵活性,但不如dbms_sql 灵活。

标签: sql oracle plsql oracle11g where-clause


【解决方案1】:

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)
    ); 



【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-25
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    相关资源
    最近更新 更多