基于布尔(Oracle)更改where子句中的条件

问题描述 投票:0回答:1
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 oracle oracle11g where-clause dynamic-sql
1个回答
0
投票

不,它不起作用。一个简单的例子:

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>
© www.soinside.com 2019 - 2024. All rights reserved.