oracle,如何保证向表A插入数据失败时,向表B插入一条失败记录(此条记录必能插入,不允许失败)

问一个数据库的问题。有2张表t_test和t_state我想做到,向t_test插入数据,如果插入失败,在t_state中插入一条记录。问:如何保证当往t_test插入数... 问一个数据库的问题。
有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.


没失恋过不懂爱情
2013-08-06 · TA获得超过166个赞
知道小有建树答主
回答量:112
采纳率:0%
帮助的人:102万
展开全部
插入表A的时候加一个异常判断,当出现错误是执行表B的插入语句就可以了。不过好像没有什么必须成功,不能失败的语句吧。
oracle的写法是

BEGIN
INSERT INTO A……;
EXCEPTION WHEN OTHERS THEN
INSERT INTO B……;
END;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Math_Ly
2013-08-06 · TA获得超过116个赞
知道小有建树答主
回答量:197
采纳率:0%
帮助的人:88.6万
展开全部
写存储过程 做 expection 捕获~~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式