• merge-oracle

    L’istruzione MERGE in Oracle

    In questo articolo verrà illustrata l’istruzione MERGE di Oracle, la sua sintassi ed i suoi utilizzi più comuni.

    L’istruzione MERGE, questa sconosciuta

    L’istruzione MERGE viene spesso ignorata, principalmente per due motivi:

    1. non fa nulla che non possa essere fatto con i comandi INSERT, UPDATE e DELETE;
    2. ha una decisamente sintassi più complessa dei singoli comandi INSERT, UPDATE e DELETE.

    L’istruzione MERGE fa parte dei comando DML (Data Manipulation Language), così come INSERT, UPDATE e DELETE. Puoi consultare un articolo dal titolo “Classificazioni delle istruzioni SQL: DDL, DML, DQL, DCL e TCL” su questo blog per approfondire la tipologie dei comandi SQL.

    Pur essendo quindi meno conosciuta e meno usata, l’istruzione MERGE è molto potente: con un solo passaggio attraverso i dati si possono effettuare tutte e tre le operazioni, con un notevole miglioramento delle le prestazioni.

    MERGE viene utilizzata per selezionare righe da una o più sorgenti di dati per effettuare UPDATE o INSERT (per questo viene chiamata anche UPSERT)  in una tabella (o in una vista), specificando le condizioni in base alle quali eseguire un aggiornamento o un inserimento. Per poter eseguire un’istruzione di MERGE occorre avere i privilegi INSERT e UPDATE sulla tabella in cui si intende scrivere, e i privilegi SELECT sulla tabella da cui si leggono i dati. Se viene specificata la clausola DELETE, occorre avere anche i privilegi DELETE sulla tabella in cui si intende scrivere.

    Prima di vedere la sintassi, proviamo con un esempio come funziona MERGE.

     

    Esempio dell’istruzione MERGE in Oracle

    Nell’esempio che segue si utilizza la tabella employees e la tabella new_employees che contiene solo i nuovi assunti (quelli dopo una certa data):

    L’istruzione di MERGE passa attraverso la tabella NEW_EMPLOYEES e, per ogni riga, tenta di trovare una riga nella tabella EMPLOYEES con lo stesso EMPLOYEE_ID. Se trova una riga, il valore della colonna SALARY della tabella EMPLOYEES verrà aggiornata con il valore della riga in NEW_EMPLOYEES. Se non c’è una tale riga, verrà inserita.

    Vediamo riga per riga come si comporta l’istruzione MERGE:

    • alla riga 1 MERGE INTO employees viene indicata la tabella che verrà aggiornata, mentre USING new employees indica la sorgente dati da cui leggere;
    • alla riga 2 ON (e.employee_id = n.employee_id) viene indicata la condizione da controllare;
    • la riga 3 WHEN MATCHED THEN introduce il ramo che si prende se la condizione è vera;
    • alla riga 4 UPDATE SET e.salary = n.salary si aggiorna il campo salary della tabella indicata alla riga 1 dopo MERGE INTO (cioè employees);
    • la riga 5 WHEN NOT MATCHED THEN introduce il ramo che si prende se la condizione è falsa;
    • con le righe 6 e 7 INSERT (…) VALUES (…) viene effettuato un inserimento nella tabella employees.

    In quest’altro esempio si crea la tabella Bonuses, in cui viene memorizzato l’id dell’impiegato e un bonus di default pari a 100.

    La tabella viene popolata con gli id degli impiegati che percepiscono una commissione superiore a 0.15.

    Di seguito l’interrogazione che mostra il contenuto della tabella bonuses:

    Ed ecco il risultato:

    risultati-prima-di-merge

    Infine il manager delle risorse umane decide che gli impiegati del dipartimento 80 che ricevono una commissione uguale o superiore a 0.35 (quelli già inseriti nella tabella bonuses) avranno un bonus corrispondente al bonus base (100) più l’1% del proprio stipendio se il loro stipendio è inferiore a 10.000.

    Per tutti gli altri impiegati (quelli che ricevono una commissione inferiore a 0.35) è previsto un bonus dell’1% del proprio stipendio se hanno uno stipendio entro il valore di 8.000.

    Ed ecco il risultato della MERGE:

    risultati-dopo-il-merge

     

    Sintassi dell’istruzione MERGE in Oracle

    Di seguito la sintassi dell’istruzione MERGE:

    merge::=

    sintassi-merge-oracle

    che utilizza le seguenti clausole:

    merge_update_clause ::=

    merge_update_clause

    merge_insert_clause ::=

    merge_insert_clause

    where_clause::=

    where_clause

    error_logging_clause ::=

    error_logging_clause

     

    Semantica dell’istruzione MERGE in Oracle

    Clausola INTO

    La clausola INTO viene utilizzata per indicare la tabella o la vista (nel caso in cui la vista sia aggiornabile) in cui viene eseguita l’istruzione di UPDATE o INSERT.

    Clausola USING

    La clausola USING viene utilizzata per indicare la sorgente dei dati (che può essere una tabella, una vista o il risultato di una subquery) da inserire o aggiornare.

     

    Clausola ON

    La clausola ON viene utilizzata per indicare la condizione in base alla quale l’operazione di MERGE effettuerà un’istruzione di UPDATE o INSERT. Per ciascuna riga nella tabella target per la quale la condizione è vera, verrà effettuato un aggiornamento a partire dalle righe corrispondenti della tabella sorgente. Se la condizione non è vera, viene effettuato un inserimento nella tabella target a partire dalle righe della tabella sorgente.

    Clausola Merge_Update

    La clausola Merge_Update viene utilizzata per indicare i nuovi valori che avranno le colonne della tabella destinazione, se la condizione della clausola ON è vera.  È possibile specificare una clausola WHERE se si desidera che l’aggiornamento venga vincolato ad una condizione, che può riferirsi sia alla tabella sorgente che a quella target. Se la condizione non è vera, l’operazione di UPDATE non viene effettuata.

    La clausola DELETE (con WHERE condition) viene utilizzata per cancellare i dati mentre si popola o si aggiorna la tabella target.  Le sole righe impattate da questa clausola sono quelle della tabella target che vengono aggiornate dall’operazione MERGE. La condizione DELETE WHERE valuta i valori aggiornati, non quelli originali. Se una riga nella tabella destinazione soddisfa il criterio della condizione di DELETE ma non è inclusa nel JOIN definita dalla clausola ON, allora non verrà cancellata.

    È possibile avere la clausola Merge_Update da sola, o anche con la clausola Merge_Insert, nell’ordine che si desidera.

    Tieni a mente che con la clausola Merge_Update non è possibile:

    1. aggiornare una colonna utilizzata nella clausola ON;
    2. specificare DEFAULT nell’UPDATE di una vista.

    Clausola Merge_Insert

    La clausola Merge_Insert viene utilizzata per indicare le righe da inserire nella tabella destinazione se la condizione della clausola ON è falsa. È possibile specificare una clausola WHERE se si desidera che l’inserimento venga vincolato ad una condizione, che può riferirsi solo alla tabella sorgente. Se la condizione non è vera, l’operazione di INSERT non viene effettuata.

    È possibile avere la clausola Merge_Insert da sola, o anche con la clausola Merge_Update, nell’ordine che si desidera.

    Clausola Error_Logging

    La clausola Error_Logging ha lo stesso comportamento dell’omonima clausola in un’istruzione INSERT.

     

     

    Giulio Cantali – IT Consultant

    Creatore di Database Master, il primo percorso per diventare esperti di database

Lascia un commento

Se vuoi condividere la tua opinione, lascia un commento

Puoi usare questi tag e attributi: HTML:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">