1

我创建了一个触发器,如下所示:

CREATE OR REPLACE TRIGGER trigger_test
AFTER INSERT ON trigger_1
FOR EACH ROW
DECLARE
t_identifier VARCHAR2(10);
t_name VARCHAR2(20);
BEGIN
t_identifier := (:NEW.IDENTIFIER);
t_name := (:NEW.NAME);
INSERT INTO trigger_2(IDENTIFIER,NAME)VALUES(t_identifier,t_name);
COMMIT;
END;

我正在尝试在 trigger_1 中插入一行

INSERT INTO trigger_1(IDENTIFIER,NAME)
VALUES('1234567','Vijay');

它给了我错误:

ORA-04092: cannot COMMIT in a trigger
ORA-06512: at "LVSDBO46.TRIGGER_TEST", line 8
ORA-04088: error during execution of trigger 'LVSDBO46.TRIGGER_TEST'

有人可以帮忙吗?

4

3 回答 3

6

只需删除

COMMIT;

从触发代码。触发器在正在进行的事务中执行,因此您不能进行单独的提交。当事务提交时,您在 trigger_2 中的插入也将被提交。

于 2010-02-15T08:24:50.713 回答
2

我可以建议缩短一点。

CREATE OR REPLACE TRIGGER trigger_test
  AFTER INSERT ON trigger_1
  FOR EACH ROW
  BEGIN
    INSERT INTO trigger_2 (IDENTIFIER,NAME) VALUES (:NEW.IDENTIFIER,:NEW.NAME);
  END;
于 2010-02-15T08:57:12.620 回答
0

如果您真的需要提交(可能您不必这样做,但以防万一……)您可以使用 AUTONOMOUS_TRANSACTION PRAGMA 创建一个过程。

于 2010-02-15T09:29:17.390 回答