Oracle
 sql >> Database >  >> RDS >> Oracle

Inserimento di più righe con sequenza in Oracle

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.