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