ловить созданные идентификаторы в цикле курсора

У меня есть следующий курсор (во всяком случае, что-то вроде него), который я использую для копирования записей для таблицы, которая является частью отношения «многие ко многим». Мне нужны новые идентификаторы, созданные во время оператора INSERT INTO B, для обновления таблицы соединений.

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?


person Casey    schedule 09.12.2010    source источник


Ответы (1)


Используйте условие RETURNING:

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;

Тем не менее, возможно, эта операция может быть выполнена без использования курсора.

person OMG Ponies    schedule 09.12.2010
comment
Знал о возвратной оговорке! Спасибо. Это своего рода надуманный пример того, над чем я работаю, для чего, как мне кажется, мне нужен курсор. - person Casey; 10.12.2010
comment
@Casey: Так и думал, просто расскажи о курсоре. IIRC, Oracle поддерживает предложение RETURNING с версии 9i. PostgreSQL также поддерживает это. - person OMG Ponies; 10.12.2010