如何为触发器中的每一行声明一个变量?

时间:2017-07-07 09:42:22

标签: oracle database-trigger

我有以下触发器:

create or replace TRIGGER MY_TIGGER_NAME   AFTER UPDATE ON MY_TABLE 
REFERENCING OLD AS OLD NEW AS NEW  FOR EACH ROW 
WHEN ( NEW.STATUS = ANY (10,40,42,44,46,50,60)  and OLD.STATUS != NEW.STATUS)        
DECLARE
   PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN   
  IF :NEW.ALERT is NULL  
  THEN      
    dbms_alert.signal('print_update_event','update_message');
  ELSE      
    dbms_alert.signal( :NEW.ALERT,'update_message');
  END IF;    
  commit;
END;

我想更改它,因为它会为每一行发送警报。如果ALERT列等于NULL的多行被更新,我想只发送一个警报,并且我想为ALERT列不等于NULL的每一行发送一个警报。

据我了解Oracle变量,我可以在触发器中声明局部变量,但是这个变量将针对每一行单独声明,因此后续更改没有任何意义:

create or replace TRIGGER MY_TIGGER_NAME   AFTER UPDATE ON MY_TABLE 
REFERENCING OLD AS OLD NEW AS NEW  FOR EACH ROW 
WHEN ( NEW.STATUS = ANY (10,40,42,44,46,50,60)  and OLD.STATUS != NEW.STATUS)        
DECLARE
   PRAGMA AUTONOMOUS_TRANSACTION;
   flag NUMBER(1,0) :=0;
BEGIN   
  IF :NEW.ALERT is NULL and flag=0 
  THEN      
    dbms_alert.signal('print_update_event','update_message');
    flag:=1;
  ELSE      
    dbms_alert.signal( :NEW.ALERT,'update_message');
  END IF;    
  commit;
END;

可以使用包变量代替局部变量,但我认为包变量是个坏主意,因为两个触发器可以并行执行。也许我错了。

我附上了触发器图表,显示了我想要实现的目标。

enter image description here 怎么做?

0 个答案:

没有答案