Вам разрешено получать последовательность внутри триггера - PullRequest
2 голосов
/ 26 сентября 2011

Я хочу иметь возможность получить значение последовательности и использовать одно и то же значение для нескольких операций в триггере для выполнения аудита для таблицы.Поэтому, когда таблица обновляется, я хочу получить все столбцы, которые были обновлены.Но я хочу, чтобы они были сгруппированы как единое целое, когда я регистрирую измененный столбец в базе данных.Есть ли способ получить порядковый номер и сохранить в переменной внутри триггера.Код, который я смог сделать, продолжает получать 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 ]

7 голосов
/ 26 сентября 2011

До 11g единственным поддерживаемым синтаксисом для получения значения из последовательности было:

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

Одним из альтернативных решений было бы использование NEXTVAL в первом операторе INSERT и CURRVAL (т. Е. Последний назначенныйзначение в этом сеансе ) для остальных.

2 голосов
/ 26 сентября 2011

Если вы используете 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; 
1 голос
/ 26 сентября 2011

Я думаю, что получил ответ, используя select into.

SELECT SEQ_X_LOGSUBNO.NEXTVAL INTO GROUPID FROM DUAL;
...