【问题标题】:catching created IDs in cursor loop在游标循环中捕获创建的 ID
【发布时间】:2010-12-09 20:42:33
【问题描述】:

我有以下光标(无论如何都是类似的),我正在使用它来复制作为多对多关系一部分的表的条目。我需要在 INSERT INTO B 语句期间生成的新 ID 来更新联结表。

DECLARE

BEGIN
   FOR rec IN (SELECT id
                 FROM A
                WHERE group_id = 7)
   LOOP
      INSERT INTO B (b_id, thing2, ...stuff...);

      INSERT INTO C (rec.id, /* new ID generated by previous insert statement */
      COMMIT;
   END LOOP;
END;
/

如何捕获插入后的 b_id 值以在第二个 INSERT 语句中使用?

【问题讨论】:

    标签: sql oracle plsql oracle11g


    【解决方案1】:

    使用RETURNING clause

    DECLARE
    
      v_bid B.b_id%TYPE;
    
    BEGIN
       FOR rec IN (SELECT id
                     FROM A
                    WHERE group_id = 7)
       LOOP
         INSERT INTO B (b_id, thing2, ...stuff...) RETURNING b_id INTO v_bid;
    
         INSERT INTO C (rec.id, /* new ID generated by previous insert statement */
         COMMIT;
       END LOOP;
    END;
    

    也就是说,有可能不使用游标就可以执行此操作。

    【讨论】:

    • 知道退货条款!谢谢。这在某种程度上是我正在做的一个人为的例子,我相信我确实需要一个光标。
    • @Casey:想了这么多,只是把它放在那里关于光标。 IIRC,Oracle 从 9i 开始就支持 RETURNING 子句。 PostgreSQL 也支持它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2017-02-28
    相关资源
    最近更新 更多