2010-12-09 4 views
1

J'ai le curseur suivant (quelque chose comme ça de toute façon) que j'utilise pour copier des entrées pour une table qui fait partie d'une relation plusieurs à plusieurs. J'ai besoin des nouveaux ID générés lors de l'instruction INSERT INTO B pour mettre à jour une table de jonction avec. Comment puis-je capturer la valeur b_id après l'insertion à utiliser dans la deuxième instruction INSERT?attraper les ID créés dans la boucle du curseur

Répondre

4

Utilisez le 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; 

Cela dit, il est possible que cette opération pourrait être réalisée sans l'utilisation d'un curseur.

+0

Connaissait la clause de retour! Merci. C'est un exemple un peu artificiel de ce sur quoi je travaille et pour lequel je crois avoir besoin d'un curseur. – Casey

+0

@Casey: Figuré autant, il suffit de le mettre sur le curseur. IIRC, Oracle a soutenu la clause RETURNING depuis 9i. PostgreSQL le supporte aussi. –

Questions connexes