CREATE OR REPLACE TRIGGER "EVGENIJ_BOBROVICH"."FIX_UPD_LIMITS"
BEFORE UPDATE OR DELETE ON "EVGENIJ_BOBROVICH"."MAP_CALCULATION_SHOP_LIMITS"
FOR EACH ROW
DECLARE
is_deleted_dependant VARCHAR2(1 BYTE);
is_editable_dependant VARCHAR2(1 BYTE);
OPERATION BOOLEAN := UPDATING OR DELETING;
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 MG.ID_GROUP =
(CASE WHEN UPDATING THEN :new.id_group WHEN DELETING THEN :old.id_group)
...
END;
/
如何根据更新和删除标志在where子句中更改这些检查?
不,它不起作用。一个简单的例子:
SQL> create table test as select * From dept;
Table created.
SQL> create or replace trigger trg_test
2 before update or delete on test
3 for each row
4 declare
5 l_cnt number;
6 begin
7 select count(*) into l_cnt
8 from emp where deptno = case when updating then :new.deptno
9 when deleting then :old.deptno
10 end;
11 end;
12 /
Warning: Trigger created with compilation errors.
SQL> show err
Errors for TRIGGER TRG_TEST:
LINE/COL ERROR
-------- -----------------------------------------------------------------
4/3 PL/SQL: SQL Statement ignored
5/46 PL/SQL: ORA-00920: invalid relational operator
SQL>
错误在这里:
8 from emp where deptno = case when updating then :new.deptno
^^^^
这意味着您必须执行以下操作:
SQL> create or replace trigger trg_test
2 before update or delete on test
3 for each row
4 declare
5 l_deptno test.deptno%type;
6 l_cnt number;
7 begin
8 if updating then
9 l_deptno := :new.deptno;
10 elsif deleting then
11 l_deptno := :old.deptno;
12 end if;
13
14 select count(*) into l_cnt
15 from emp where deptno = l_deptno;
16 end;
17 /
Trigger created.
SQL>