您是否可以在触发器内检索序列

时间:2011-09-26 12:46:06

标签: oracle triggers sequence declaration

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

3 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:2)

如果您使用的是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 :(得分:1)

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

SELECT SEQ_X_LOGSUBNO.NEXTVAL INTO GROUPID FROM DUAL;