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.