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



选择。。。某物从…起在某处其中condition1和(如果更新则condition2,如果删除则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;
/

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

最新更新