首页 > 解决方案 > 如果插入子记录失败,Oracle 删除父记录

问题描述

我有一个 PL/SQL 问题如下:

我有一个父子表。

使用 PL/SQL LOOPS - 我将记录插入父项,然后将记录插入子项

我的要求如下:

  1. 如果插入父项失败 - 只需打印错误并继续循环
  2. 如果已填充父级,但子级失败,则也删除父级。

有什么想法吗?

标签: sqloracleplsql

解决方案


SAVEPOINT在插入父表之前建立一个。如果子记录失败,则回滚到保存点。

像这样:

BEGIN
  FOR (... your source data for parents ... ) LOOP
    BEGIN
      SAVEPOINT xxcust_pre_insert;
      INSERT INTO parent_table...
      FOR ( ... your source data for children ...) LOOP
        INSERT INTO child_table...
      END LOOP;
    EXCEPTION
      WHEN others THEN
        ROLLBACK TO xxcust_pre_insert;
        -- Log the error or do whatever else you want.  Don't swallow it.
        -- Execution will continue with the next parent record to be inserted
  END LOOP;
  COMMIT;   -- optional at this point.  May want later, depending on your design
END;

推荐阅读