INSERT

L'istruzione INSERT serve per inserire righe in una tabella perché in un database i dati vengono memorizzati sotto forma di righe nelle tabelle.

S i n t a s s i
INSERT INTO Table_name [(column1, column2,..)] VALUES (value1, value2...);

INSERT INTO (select colum1, column2,... from Table_name [where ....] ) VALUES (value1, value2...);

I campi "value" possono essere anche il risultato di una subquery (esempio select max(region_id) from regions).
Se non vengono selezionate le colonne della tabella si parla di positional notation e la INSERT esegue il match tra l'ordine dei valori inseriti con l'ordine di definizione delle colonne della tabella.
L'istruzione fallisce se i valori inseriti e i tipi di dato delle colonne sono differenti.

E s e m p i o
select * from hr.regions;

REGION_ID, REGION_NAME
----------------------------------------
1                       Europe
2                       Americas
3                       Asia

insert into regions values ('italia',9);
Errore SQL: ORA-01722: numero non valido
01722. 00000 - "invalid number"

Alle colonne della tabella che contengono valori NOT NULL, deve necessariamente essere assegnato un valore.
Ad esempio la tabella hr.regions ha la colonna region_id Not Null, pertanto se eseguo la seguente DML
insert into regions (region_name) values ('italia');

Oracle restituisce il messaggio di errore seguente:
Errore SQL: ORA-01400: impossibile inserire NULL in ("HR"."REGIONS"."REGION_ID")
01400. 00000 - "cannot insert NULL into (%s)"

Al contrario la colonna region_name può essere Null e pertanto è possibile eseguire la dml seguente:
insert into regions (region_id) values (12);
Oracle inserisce il valore Null nelle colonne non dichiarate (in questo esempio in region_name).

Per inserire un set di righe contemporaneamente in tabella è possibile usare il risultato di una istruzione SELECT come input della INSERT.

S i n t a s s i
INSERT INTO table_name [(column1, column2,..)] SELECT column1, column2,.. FROM ...;


WITH CECK OPTION

La suddetta opzione si usa se nella INSERT non devono essere inseriti dei valori facendo fallire la dml.
Ad esempio nella tabella employees inserire solo recod con il campo job_id uguale a SA_REP e SH_CLERK.

INSERT INTO (
select EMPLOYEE_ID , HIRE_DATE , LAST_NAME ,JOB_ID ,EMAIL
from employees
where job_id in ('SA_REP','SH_CLERK')
WITH CHECK OPTION
) VALUES (employees_seq.nextval,sysdate ,'&cognome','&jobid','&email');

Se si inserisce un campo con job_id diverso dai valori elencati compare il messaggio di errore:

Errore SQL: ORA-01402: view WITH CHECK OPTION where-clause violation
01402. 00000 -  "view WITH CHECK OPTION where-clause violation

Post popolari in questo blog

Create e Drop Pluggable Database

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