Oracle
 sql >> Base de données >  >> RDS >> Oracle

Insertion de plusieurs lignes avec séquence dans Oracle

Les restrictions sur les insertions multitables incluent :

  • Vous ne pouvez spécifier une séquence dans aucune partie d'une instruction d'insertion multitable. Une insertion multitable est considérée comme une instruction SQL unique. Par conséquent, la première référence à NEXTVAL génère le numéro suivant et toutes les références suivantes dans l'instruction renvoient le même numéro.

Ce n'est pas tout à fait vrai - vous pouvez utiliser une séquence, elle obtient toujours la même valeur, il peut donc être utile de créer des enregistrements parent et enfant en une seule fois en se référant à la même séquence.

Si vous souhaitez continuer à utiliser insert all tu pourrais contournez cela en utilisant une fonction non déterministe qui obtient la valeur de séquence :

CREATE FUNCTION get_seq RETURN NUMBER IS
BEGIN
  RETURN postal_code_seq.nextval;
END;
/

INSERT ALL
  INTO POSTAL_CODE( postal_code,description)
    VALUES(get_seq,'Coimbatore')
  INTO POSTAL_CODE (postal_code,description)
    VALUES(get_seq,'Mumbai') SELECT * FROM DUAL;

2 rows inserted.

SELECT * FROM postal_code;

                            POSTAL_CODE DESCRIPTION        
--------------------------------------- --------------------
                                      1 Coimbatore          
                                      2 Mumbai              

Mais c'est un peu gênant. Vous feriez probablement mieux d'utiliser des instructions d'insertion individuelles - l'utilisation d'une insertion multitable dans une seule table ne vous rapporte pas vraiment beaucoup de toute façon - ou un déclencheur pour définir la colonne unique à partir de la séquence, ou une vue CTE/inline pour générer les valeurs à insérer.