如何从 PL/SQL 中的触发器回滚列
How to rollback a column from a trigger in PL/SQL
我有一个任务触发条件。我更新了触发器,这意味着我在触发器中添加了 GL_TP 列。但在交付该部分之前,我还必须回滚它以撤消触发器中的该列。
那么如何使用 sql 查询撤消触发器中的 GL_TP 列?
我愿意接受任何想法或建议吗?
CREATE OR REPLACE TRIGGER GL_DEF_TO_TRG
BEFORE INSERT OR DELETE OR UPDATE OF CDATE, CMPNY_DEF_ID, CUSER, DESCR, GL_DEF_ID,
MNY_TP_ID, ST, UDATE, UUSER, GL_TP ON FCBSADM.GL_DEF
FOR EACH ROW
DECLARE
BEGIN
IF INSERTING THEN
INSERT INTO MTTFOD.GL_DEF_TO
(SEQ_GLDEF_ID, GL_DEF_ID, DESCR, MNY_TP_ID, CMPNY_DEF_ID, ST, CDATE, CUSER, UDATE,
UUSER, CHANGE_TYPE, CHANGE_DATE, GL_TP)
VALUES
(MTTFOD.SEQ_GLDEF_ID.NEXTVAL, :NEW.GL_DEF_ID, :NEW.DESCR, :NEW.MNY_TP_ID,
:NEW.CMPNY_DEF_ID, :NEW.ST, :NEW.CDATE, :NEW.CUSER, :NEW.UDATE, :NEW.UUSER, 'I',
SYSDATE, :NEW.GL_TP);
ELSIF UPDATING THEN
INSERT INTO MTTFOD.GL_DEF_TO
(SEQ_GLDEF_ID, GL_DEF_ID, DESCR, MNY_TP_ID, CMPNY_DEF_ID, ST, CDATE, CUSER, UDATE,
UUSER, CHANGE_TYPE, CHANGE_DATE, GL_TP)
VALUES
(MTTFOD.SEQ_GLDEF_ID.NEXTVAL, :NEW.GL_DEF_ID, :NEW.DESCR, :NEW.MNY_TP_ID,
:NEW.CMPNY_DEF_ID, :NEW.ST, :NEW.CDATE, :NEW.CUSER, :NEW.UDATE, :NEW.UUSER, 'U',
SYSDATE,
NEW:GL_TP);
ELSIF DELETING THEN
INSERT INTO MTTFOD.GL_DEF_TO
(SEQ_GLDEF_ID, GL_DEF_ID, DESCR, MNY_TP_ID, CMPNY_DEF_ID, ST, CDATE, CUSER, UDATE,
UUSER, CHANGE_TYPE, CHANGE_DATE, GL_TP)
VALUES
(MTTFOD.SEQ_GLDEF_ID.NEXTVAL, :OLD.GL_DEF_ID, :OLD.DESCR, :OLD.MNY_TP_ID,
:OLD.CMPNY_DEF_ID, :OLD.ST, :OLD.CDATE, :OLD.CUSER, :OLD.UDATE, :OLD.UUSER, 'D',
SYSDATE, NEW:GL_TP);
END IF;
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001, 'ERROR: CODE:' || SQLCODE || ' MSG:' ||
SQLERRM || ' TRACE:' ||
SUBSTR(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(), 1, 3000));
END;
您的解释有点不清楚,但我假设这就是您要实现的目标。执行触发器后,将列 GL_TP 的值设置回旧值:
...
SYSDATE, NEW:GL_TP); --> note the typo here !
END IF;
-- to revert the change in GL_TP and set it to the old value
:NEW.GL_TP := :OLD.GL_TP;
-- or you could just set it to NULL like this
-- :NEW.GL_TP := NULL;
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001, 'ERROR: CODE:' || SQLCODE || ' MSG:' ||
SQLERRM || ' TRACE:' ||
SUBSTR(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(), 1, 3000));
END;
请注意,您的代码中有几个拼写错误。您有 NEW:GL_TP
- 这不是有效的 oracle 语法,应该是 :NEW.GP_TP
。
请注意,这不是回滚。 ROLLBACK是oracle中的一个概念,表示事务的撤销。没有“回滚列”这样的东西。
我有一个任务触发条件。我更新了触发器,这意味着我在触发器中添加了 GL_TP 列。但在交付该部分之前,我还必须回滚它以撤消触发器中的该列。 那么如何使用 sql 查询撤消触发器中的 GL_TP 列? 我愿意接受任何想法或建议吗?
CREATE OR REPLACE TRIGGER GL_DEF_TO_TRG
BEFORE INSERT OR DELETE OR UPDATE OF CDATE, CMPNY_DEF_ID, CUSER, DESCR, GL_DEF_ID,
MNY_TP_ID, ST, UDATE, UUSER, GL_TP ON FCBSADM.GL_DEF
FOR EACH ROW
DECLARE
BEGIN
IF INSERTING THEN
INSERT INTO MTTFOD.GL_DEF_TO
(SEQ_GLDEF_ID, GL_DEF_ID, DESCR, MNY_TP_ID, CMPNY_DEF_ID, ST, CDATE, CUSER, UDATE,
UUSER, CHANGE_TYPE, CHANGE_DATE, GL_TP)
VALUES
(MTTFOD.SEQ_GLDEF_ID.NEXTVAL, :NEW.GL_DEF_ID, :NEW.DESCR, :NEW.MNY_TP_ID,
:NEW.CMPNY_DEF_ID, :NEW.ST, :NEW.CDATE, :NEW.CUSER, :NEW.UDATE, :NEW.UUSER, 'I',
SYSDATE, :NEW.GL_TP);
ELSIF UPDATING THEN
INSERT INTO MTTFOD.GL_DEF_TO
(SEQ_GLDEF_ID, GL_DEF_ID, DESCR, MNY_TP_ID, CMPNY_DEF_ID, ST, CDATE, CUSER, UDATE,
UUSER, CHANGE_TYPE, CHANGE_DATE, GL_TP)
VALUES
(MTTFOD.SEQ_GLDEF_ID.NEXTVAL, :NEW.GL_DEF_ID, :NEW.DESCR, :NEW.MNY_TP_ID,
:NEW.CMPNY_DEF_ID, :NEW.ST, :NEW.CDATE, :NEW.CUSER, :NEW.UDATE, :NEW.UUSER, 'U',
SYSDATE,
NEW:GL_TP);
ELSIF DELETING THEN
INSERT INTO MTTFOD.GL_DEF_TO
(SEQ_GLDEF_ID, GL_DEF_ID, DESCR, MNY_TP_ID, CMPNY_DEF_ID, ST, CDATE, CUSER, UDATE,
UUSER, CHANGE_TYPE, CHANGE_DATE, GL_TP)
VALUES
(MTTFOD.SEQ_GLDEF_ID.NEXTVAL, :OLD.GL_DEF_ID, :OLD.DESCR, :OLD.MNY_TP_ID,
:OLD.CMPNY_DEF_ID, :OLD.ST, :OLD.CDATE, :OLD.CUSER, :OLD.UDATE, :OLD.UUSER, 'D',
SYSDATE, NEW:GL_TP);
END IF;
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001, 'ERROR: CODE:' || SQLCODE || ' MSG:' ||
SQLERRM || ' TRACE:' ||
SUBSTR(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(), 1, 3000));
END;
您的解释有点不清楚,但我假设这就是您要实现的目标。执行触发器后,将列 GL_TP 的值设置回旧值:
...
SYSDATE, NEW:GL_TP); --> note the typo here !
END IF;
-- to revert the change in GL_TP and set it to the old value
:NEW.GL_TP := :OLD.GL_TP;
-- or you could just set it to NULL like this
-- :NEW.GL_TP := NULL;
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001, 'ERROR: CODE:' || SQLCODE || ' MSG:' ||
SQLERRM || ' TRACE:' ||
SUBSTR(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(), 1, 3000));
END;
请注意,您的代码中有几个拼写错误。您有 NEW:GL_TP
- 这不是有效的 oracle 语法,应该是 :NEW.GP_TP
。
请注意,这不是回滚。 ROLLBACK是oracle中的一个概念,表示事务的撤销。没有“回滚列”这样的东西。