Le restrizioni sugli inserti multitavolo includono:
- Non è possibile specificare una sequenza in nessuna parte di un'istruzione di inserimento multitabella. Un inserimento multitabella è considerato una singola istruzione SQL. Pertanto, il primo riferimento a NEXTVAL genera il numero successivo e tutti i riferimenti successivi nell'istruzione restituiscono lo stesso numero.
Non è del tutto vero:puoi usare una sequenza, ottiene sempre lo stesso valore, quindi può essere utile creare record padre e figlio in una volta facendo riferimento alla stessa sequenza.
Se vuoi continuare a usare insert all
tu potresti aggirare il problema utilizzando una funzione non deterministica che ottiene il valore della sequenza:
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
Ma è un po' imbarazzante. Probabilmente stai meglio usando singole istruzioni di inserimento - l'utilizzo di un inserto multitabella in una singola tabella non ti sta comunque guadagnando molto - o un trigger per impostare la colonna univoca dalla sequenza o una vista CTE/inline per generare i valori da inserire.