INSERT ALL - FIRST

Esistono due tipi di istruzione Multitables INSERT:

UNCONDITIONAL: tutti i risultati della subquery vengono inserti nelle clausole INTO.

S i n t a s s i
INSERT ALL
INTO nome_tabella_1 (colonna_1,..., colonna_h) VALUES (valore_1, ...valore_h)
INTO nome_tabella_2 VALUES (valore_1, ...valore_g)
.........
INTO nome_tabella_m
subquery;

R e g o l e

  • la parola chiave ALL è obbligatoria;
  • deve esserci almeno una clausola INTO;
  • il campo values_n può essere un valore  o coincide con il nome della colonna estratto dalla subquery alla quale può essere applicato una funzione di conversione o formattazione; 
  • i campi nelle clausole VALUES possono essere differenti;
  • la clausola VALUES può essere omessa e in questo caso nella tabella viene inserito il risultato della subqyery. Quindi la suddetta tabella deve avere lo stesso numero di colonne e tipo di dati (o comunque convertibili in automatico) della subquery;
  • la subquery deve essere sempre presente.



CONDITIONAL: i risultati della subquery vengono valutati dalla prima condizione WHEN e se true vengono inseriti nella corrispondente clausole INTO e poi si passa alla seconda WHEN; se sono tutte false viene valutata la clausola ELSE (opzionale).

S i n t a s s i
INSERT ALL|FIRST
WHEN espressione THEN 
INTO nome_tabella_1 (colonna_1,..., colonna_h) VALUES (valore_1, ...valore_h)
WHEN espressione THEN
INTO nome_tabella_2 VALUES (valore_1, ...valore_g)
WHEN espressione THEN
INTO nome_tabella_3
............
WHEN espressione THEN
INTO nome_tabella_m (colonna_1,..., colonna_f) VALUES (valore_1, ...valore_f)
ELSE 
INTO nome_tabella_n (colonna_1,..., colonna_l) VALUES (valore_1, ...valore_l)
subquery;

R e g o l e

  • la parola chiave ALL è di default e può essere omessa;
  • FIRST indica che verrà eseguita solo la clausola INTO corrispondente alla prima clausola WHEN a true; dopodiché si analizza il successivo record estratto dalla subquery;
  • i campi nelle clausole VALUES possono essere differenti;
  • la clausola VALUES può essere omessa e in questo caso nella tabella viene inserito il risultato della subqyery e quindi la suddetta tabella deve avere lo stesso numero di colonne e tipo di dati (o comunque convertibili in automatico) della subquery;
  • ELSE INTO non è obbligatorio ma deve essere posto alla fine;
  • la subquery deve essere sempre presente.

Se una INSERT va in errore viene effettuato il rollback di tutta le Insert.
Se nella subquery si usano delle alias per le tabelle, perché per esempio ci sono più tabelle in Join, le colonne estratte dalla subquery devono avere gli alias, altrimenti non vengono individuate dalla INSERT.

Post popolari in questo blog

ORA-12154: TNS: il listener non è attualmente a conoscenza del servizio richiesto nel descrittore di connessione

Create e Drop Pluggable Database