将插入的记录键返回到Oracle临时表中

时间:2018-03-07 14:26:22

标签: oracle plsql temp-tables insert-into sql-returning

我有两张桌子,父母和孩子。 Parent拥有Child的外键。

我正在编写一个脚本,将 n 记录插入Child,我需要将新生成的主键从 n 子记录返回到临时表。另外,它需要存储Parent.Parent_Key,以便我可以将它用作稍后的查找(我可以在连接到Parent中获得)。

当我将 m 记录插入Parent时,我打算使用临时表,所有这些都在一次提交中。临时表基本上是一个查找表。

重新解释问题: 已填充父表和子表。为简单起见,让我们说Parent有主键Parent.Parent_key和外键Child.Child_key。 Child具有主键Child_key和Child_name属性。我试图插入重复的子行(用于修复),抓住那些新的child_keys,将它们与parent_key配对到临时表中,以便我可以将它用作查找。

以下是Child的插入查询因语法错误而无法正常工作 - 这种方法在ORACLE SQL中是否可行?

CREATE GLOBAL TEMPORARY TABLE DUPLICATE_CHILD (
  PARENT_KEY int,
  CHILD_KEY int); 

INSERT INTO CHILD (CHILD_NAME)
SELECT
  c.CHILD_NAME
FROM
  CHILD c
  JOIN PARENT p
    ON p.CHILD_KEY = c.CHILD_KEY
RETURNING p.PARENT_KEY, c.CHILD_KEY BULK COLLECT INTO DUPLICATE_CHILD;    

1 个答案:

答案 0 :(得分:1)

您是否可以撤销操作顺序?
将CHILD_NAME添加到DUPLICATE_CHILD,然后:

插入DUPLICATE_CHILD

INSERT INTO DUPLICATE_CHILD (PARENT_KEY, CHILD_KEY, CHILD_NAME) 
SELECT PARENT_KEY, (SELECT NVL(MAX(CHILD_KEY), 0) FROM CHILD) + ROWNUM, C.CHILD_NAME
  FROM
    CHILD C
    JOIN PARENT P
      ON P.CHILD_KEY = C.CHILD_KEY

使用生成的密钥

插入CHILD
INSERT INTO CHILD (CHILD_KEY, CHILD_NAME)
SELECT CHILD_KEY, CHILD_NAME  FROM DUPLICATE_CHILD;

commit;