Gestione dati DML Statement
DML – Data Manipultion Language Unoperazione DML viene eseguita quando: aggiungendo nuove righe ad una tabella modificando le righe esistenti di una tabella cancellando righe da una tabella Una transazione consiste in un insieme di statement DML che formano ununità logica di lavoro.
INSERT Sintassi per inserire righe in una tabella INSERT INTO tabella [(colonna, [,colonna…])] VALUES (value [,value]); Con questa sintassi verrà inserita solo una riga per volta
INSERT inserire valori per ciascuna colonna della tabella la lista di valori deve comparire nellordine delle colonne nella tabella non è obbligatorio inserire la lista delle colonne nella clausola insert, per quanto sia consigliabile per chiarezza usare gli apici per inserire valori quali caratteri e date
INSERIMENTO DI VALORI NULLI Metodo implicito: omettere la colonna nela lista INSERT INTO departments (department_id, department_name) VALUES (30, Nuovo dipartimento); Metodo espicito : specificare NULL nella clausola VALUES INSERT INTO departments VALUES (30, Nuovo dipartimento, NULL, NULL);
ERRORI DI INSERIMENTO tentativo di inserire un valore nullo per una colonna definita NOT NULL duplicazione di valori che violano il constraint di unicità foreign key constraint violato violato constraint CHECK (assicurano lintegrità di una colonna limitando i valori accettati da una colonna) tipo di dato non coerente con la definizione della colonna valore troppo grande per la colonna
INSERT È possibile utilizzare funzioni speciali per inserire valori nella tabella. INSERT INTO employees (employee_id, first_name, last_name, , phone_number, hire_date, jod_id, salary, commission_pct, manager_id, department_id) VALUES (113, Luis, Popp, LPOPP, , SYSDATE, AC_ACCOUNT, 6900, NULL, 205, 100);
INSERT Esempio di inserimento campo data INSERT INTO employees VALUES (113, Den, Raphealy, DRAPHELY, , TO_DATE(FEB 3, 1999,MON DD, YYYY), AC_ACCOUNT, 11000, NULL, 205, 100); Normalmente la data viene inserita nel formato DD-MON-YY. Se deve essere inserita in un formato differente occorre usare la funzione TO_DATE per specificarne il formato.
INSERIMENTO DI PIÙ RIGHE scrivere uno statement INSERT con una subquery non usare la clausola VALUES scrivere la giusta corrispondenza tra i campi della tabella e quelli della subquery e verificare i data type INSERT INTO sales_reps (id, name, salary, commission_pct) SELECT employee_id, last_name, salary, commission_pct FROM employees WHERE job_id LIKE %REP%;
INSERT CON LE SUBQUERY INSERT INTO (SELECT employee_id, last_name, , hire_date, job_id, salary, department_id FROM employees WHERE department_id = 50) VALUES (99999, Taylor, DTAYLOR, TO_DATE(07-JUN-99,DD-MON-YY), ST_CLERK,500,50); La select list della subquery deve avere lo stesso numero di colonne della lista valori nella clausola VALUES.
COPIA DI TABELLE mantenendo valide le regole della slide precedente per creare una copia della tabella usare SELECT * INSERT INTO copy_emp SELECT * FROM employees;
MODIFICA DEI DATI IN UNA TABELLA usare lo statement UPDATE per modificare le righe in una tabella UPDATE table SET colonna = valore [, colonna = valore, …] [WHERE condizione]; se richiesto è possibile modificare più righe contemporaneamente (con lo stesso statement) utilizzare la primary key per isentificare una singola riga. Utilizzare le altre colonne può causare la modifica involontaria di più righe
MODIFICA DEI DATI IN UNA TABELLA specificare la riga o le righe che devono essere modificare con la clausola WHERE UPDATE employees SET department_id = 70 WHERE employee_id = 113; omettendo la clausola WHERE verranno modificate tutte le righe della tabella UPDATE copy_emp SET department_id = 110;
MODIFICA COLONNE CON UNA SUBQUERY modificare job_id e salario dellimpiegato 114 con i dati dellimpiegato 205 UPDATE employees SET job_id = (SELECT job_id FROM employees WHERE employee_id = 205), salary = (SELECT salary FROM employees WHERE employee_id = 205) WHERE employee_id = 114;
UPDATE è possibile modificare il campo di una tabella assegnado un valore proveniente da unaltra tabella UPDATE copy_emp SET department_id = (SELECT department_id FROM employees WHERE employee_id = 100) WHERE job_id = (SELECT job_id FROM employees WHERE employee_id = 200);
ERRORI: INTEGRITY CONSTRAINT UPDATE employees SET department_id = 55 WHERE department_id = 110; UPDATE employees * ERRORE at line 1: ORA-02291: integrity constraint (HR.EMP_DEPT_PK) violated - Parent key not found si è cercato di modificare un record con un valore che viola il vincolo di integrità. Nella tabella DEPARTMENTS (tabella parent) non esiste il record 55
DELETE È possibile cancellare righe da una tabella usando lo statement DELETE DELETE [FROM] tabella [WHERE condizione; NOTA: se nessuna riga viene cancellata viene restituito il messaggio 0 rows deleted
DELETE specificare le righe da cancellare con la clausola WHERE DELETE FROM departments WHERE department_name = Finance; tutte le righe della tabella verranno cancellate se si omette la clausola WHERE DELETE FROM copy_emp;
DELETE È possibile cancellare righe da una tabella usando i valori di unaltra tabella DELETE FROM employees WHERE department_id = (SELECT department_id FROM departments WHERE department_name LIKE %Public%);
ERRORI: INTEGRITY CONSTRAINT DELETE FROM departments WHERE department_id = 60; DELETE FROM departments * ERRORE at line 1: ORA-02292: integrity constraint (HR.EMP_DEPT_PK) violated - Child record found si è cercato di modificare un record con un valore che viola il vincolo di integrità. Cercando di cancellare il dipartimento 60 ritorna un errore perché il numero di dipartimento è usato dalla foreign key della tabella employees
WITH CHECK OPTION una subquery è usata per identificare una tabella e le colonne di uno statement DML WITH CHECK OPTION indica che non è permesso fare modifiche (INSERT; UPDATE, DELETE) alle righe che non sono nella subquery INSERT INTO (SELECT employee_id, last_name, , hire_date, job_id, salary FROM employees WHERE department_id = 50 WITH CHECK OPTION) VALUES (99999, Smith, JSMITH, TO_DATE(07-JUN-99,DD-MON-YY), ST_CLERK,5000); La subquery identifica le righe che sono del dipartimento 50, ma il campo department_id non è nella select list, quindi il valore non è fornito per esso nella VALUES list. Inserendo questa riga risulterebbe il department_id nullo ma non è così nella subquery
MERGE è possibile effettuare una insert o unupdate in base a certe condizioni usando lo statement MERGE MERGE INTO tabella alias_tabella INTO indica la tabella in cui verrà fatto linsert o lupdate USING (tabella|vista|subquery) alias indica la sorgente dati per linserimento o lupdate ON (condizione di join) WHEN MATCHED THEN UPDATE SET col1 = col_val1, col2 = col2_val WHEN NOT MATCHED THEN INSERT (lista_colonne) VALUES (lista_valori);
MERGE Esempio MERGE INTO copy_emp c USING employees e ON (c.employee_id = e.employee_id) WHEN MATCHED THEN UPDATE SET c.first_name = e.first_name; c.last_name = e.last_name … c.department_id = e.department_id WHEN NOT MATCHED THEN INSERT VALUES(e.employee_id, e.first_name, e.last_name, e. , e.phone_number, e.hire_date, e.job_id, e.salary, e.commission_pct, e.manager_id, e.department_id); Inserisce o modifica i dati nella tabella copy_emp utilizzando i record della tabella employees