【问题标题】:Are you allowed to retrieve sequence inside a trigger您是否允许在触发器内检索序列
【发布时间】:2011-11-25 04:44:45
【问题描述】:

我希望能够获取序列值并在触发器中的多个操作上使用相同的值来对表执行审计操作。因此,当更新表时,我想获取所有已更新的列。但是当我在数据库中注册更改的列时,我希望将它们分组为一个。有没有办法获取序列号并存储在触发器内的变量中。我能够编写的代码不断得到 PLS-00357。

CREATE OR REPLACE TRIGGER TRG_EMPLOYEE_CHANGED AFTER INSERT OR DELETE
 OR UPDATE ON EMPLOYEE  REFERENCING OLD AS old NEW AS new  FOR EACH ROW
DECLARE   
    GROUPID NUMBER := SEQ_POPERATIONLOG_LOGSUBNO.NEXTVAL; 
BEGIN

   OPERATION('FIRST_NAME', GROUPID, :old.FIRST_NAME, :new.FIRST_NAME); 
 OPERATION('LAST_NAME', GROUPID, :old.LAST_NAME, :new.LAST_NAME);  
 OPERATION('ADDRESS', GROUPID, :old.ADDRESS, :new.ADDRESS);  
 OPERATION('TELEPHONE', GROUPID, :old.TELEPHONE, :new.TELEPHONE); 
END;

【问题讨论】:

    标签: oracle triggers sequence declaration


    【解决方案1】:

    如果您使用的是 Oracle 10g 或更早版本,那么您需要从 Oracle 的虚拟表 DUAL 中选择序列下一个值。

    CREATE OR REPLACE 
    TRIGGER TRG_EMPLOYEE_CHANGED 
    AFTER INSERT OR DELETE  OR UPDATE 
    ON    EMPLOYEE  
    REFERENCING OLD AS old NEW AS new  
    FOR EACH ROW 
    DECLARE        
       GROUPID NUMBER;
    BEGIN
       SELECT SEQ_POPERATIONLOG_LOGSUBNO.NEXTVAL
         INTO GROUPID
         FROM dual;
    
       OPERATION('FIRST_NAME', GROUPID, :old.FIRST_NAME, :new.FIRST_NAME);   
       OPERATION('LAST_NAME', GROUPID, :old.LAST_NAME, :new.LAST_NAME);    
       OPERATION('ADDRESS', GROUPID, :old.ADDRESS, :new.ADDRESS);    
       OPERATION('TELEPHONE', GROUPID, :old.TELEPHONE, :new.TELEPHONE);  
    END; 
    

    【讨论】:

      【解决方案2】:

      在 11g 之前,唯一支持的从序列中获取值的语法是:

      DECLARE   
          GROUPID NUMBER ; 
      BEGIN
         SELECT  SEQ_POPERATIONLOG_LOGSUBNO.NEXTVAL
         INTO GROUPID
         FROM DUAL;
         ...
      

      另一种解决方案是在第一个 INSERT 语句中使用 NEXTVAL,并在其他语句中使用 CURRVAL(即本次会话中最近分配的值)。

      【讨论】:

        【解决方案3】:

        我想我通过使用 select into 得到了答案。

        SELECT SEQ_X_LOGSUBNO.NEXTVAL INTO GROUPID FROM DUAL;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多