oracle,如何保证向表A插入数据失败时,向表B插入一条失败记录(此条记录必能插入,不允许失败)
有2张表 t_test 和 t_state
我想做到,向t_test插入数据,如果插入失败,在t_state中插入一条记录。
问:如何保证当往t_test插入数据失败时,必能在t_state表插入一条记录。 展开
2013-08-07
这个可能是需要使用 Oracle 的 自治事务 的处理机制了。
也就是 如果 向t_test插入数据,如果插入失败 , 那么 插入 t_test 的数据就回滚掉了。
但是插入 t_state 又需要是提交的。
那么插入 t_state 的处理代码, 使用 自治事务 的处理机制。
无论 向t_test插入数据, 结果是 提交了, 或者回滚了, 插入 t_state 的事务,都提交。
问题就在于,你这个情况, 有点特殊, 是 失败了, 才插入 t_state表。
这样,就没法简单的使用 BEFORE 触发器来进行 t_state表的插入 处理。
那么你那里只能写2个存储过程。
一个是 使用 自治事务 的, 插入 t_state表 的存储过程。 (这个存储过程, 用于发生异常的时候去调用)
一个是插入 t_tes 的存储过程, 增加 错误捕获的代码, 当发生异常的时候, 调用前面那个存储过程。
下面是部分例子代码
首先是 关于 自治事务 的例子代码
SQL> select * from test_main;
ID VALUE
---------- --------------------
2 TWO
3 THREE
1 ONE
SQL> CREATE OR REPLACE PROCEDURE Autonomous_Insert
2 AS
3 -- 定义 “自治事务”
4 PRAGMA AUTONOMOUS_TRANSACTION;
5 BEGIN
6 INSERT INTO test_main(id, value) VALUES (5, 'FIVE');
7 COMMIT;
8 END;
9 /
Procedure created.
SQL> BEGIN
2 -- 非自治事务的语句.
3 INSERT INTO test_main(id, value) VALUES (4, 'FOUR');
4 -- 自治事务
5 Autonomous_Insert;
6 -- 非自治事务回滚,不影响自治事务.
7 rollback;
8 END;
9 /
PL/SQL procedure successfully completed.
SQL> select * from test_main;
ID VALUE
---------- --------------------
5 FIVE
2 TWO
3 THREE
1 ONE
然后是关于 异常捕获的例子代码
SQL> DECLARE
2 p_test_val INT;
3 BEGIN
4 -- 导致一个 除零错误
5 p_test_val := 1024 / 0;
6 dbms_output.put_line(TO_CHAR(p_test_val));
7
8 EXCEPTION
9 WHEN OTHERS THEN
10 -- 异常自己处理
11 dbms_output.put_line('Exception Happen!');
12 END;
13 /
Exception Happen!
PL/SQL procedure successfully completed.
oracle的写法是
BEGIN
INSERT INTO A……;
EXCEPTION WHEN OTHERS THEN
INSERT INTO B……;
END;