【问题标题】:Returning inserted record keys into Oracle temp table将插入的记录键返回到 Oracle 临时表
【发布时间】:2018-03-07 14:26:21
【问题描述】:

我有两张表,Parent 和 Child。 Parent 有一个来自 Child 的外键。

我正在编写一个将 n 条记录插入 Child 的脚本,我需要将 n 个 Child 记录中新生成的主键返回到临时表。此外,它需要存储 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;    

【问题讨论】:

  • CHILD_KEYCHILD_NAME 是从哪里来的——你似乎是根据现有记录创建重复名称,所以它们会自动获得新的子键吗?并且子表没有父PK的FK,而不是父引用它的子(ren)吗?也许如果你添加 DDL 和示例数据和结果会更清楚。
  • Returning 子句仅在 PLSQL 中有效,如果您使用 Select 语句进行插入,则它无法工作。如果您使用带有values 的插入语句,它应该可以工作。顺便说一句,你得到什么错误?
  • @AlexPoole 这些属性来自子表。没错,它们将是重复的,因此大概会生成新的 CHILD_KEY。 Parent 表保存着 Chlid 表的键 (Child_Key)。
  • @operationcwl 这是一条 SQL Developer 消息(当您将鼠标悬停在红线上时);如果你运行它,你会得到“ORA-00933 SQL 命令没有正确结束”。我仍然不确定你真正想要做什么......
  • 您应该edit your question 解释这一点,而不是试图在评论中这样做。同样,样本数据会有所帮助。尝试获取 new 子键也很重要;如果有效,您的代码将获得旧代码(c.CHILD_KEY,这是现有记录);你可以用insert all 做,但这对新的键值没有帮助....

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


【解决方案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;

【讨论】:

    猜你喜欢
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 2011-05-05
    • 2022-12-03
    相关资源
    最近更新 更多