UPDATE (Italiano)
Scopo
Utilizzare l’istruzione UPDATE
per modificare i valori esistenti in una tabella o nella tabella di base di una vista o la tabella principale di una vista materializzata.
Argomenti aggiuntivi
-
Prerequisiti
-
Sintassi
-
Semantica
-
Esempi
Prerequisiti
Per per aggiornare i valori in una tabella, la tabella deve essere nel tuo schema oppure devi avere il privilegio dell’oggetto UPDATE
sulla tabella.
Per eseguire l’aggiornamento valori nella tabella di base di una vista:
-
Devi disporre del privilegio dell’oggetto
UPDATE
nella vista e -
Chi possiede lo schema contenente la vista deve disporre del privilegio dell’oggetto
UPDATE
sulla tabella di base.
Il privilegio di sistema UPDATE
ANY
TABLE
consente anche di aggiornare i valori in qualsiasi tavolo o nel tavolo base di qualsiasi visualizzazione.
È inoltre necessario disporre del SELECT
privilegio dell’oggetto sull’oggetto che si desidera aggiornare se:
-
L’oggetto si trova su un database remoto o
-
Il parametro di inizializzazione
SQL92_SECURITY
è impostato suTRUE
e l’operazioneUPDATE
fa riferimento a colonne della tabella, come le colonne in unwhere_clause
.
Sintassi
update :: =
Descrizione dell’illustrazione update.gif
(DML_table_expression_clause :: =, update_set_clause :: =, where_clause :: =, return_clause :: =, error_logging_clause :: =)
DML_table_expression_clause :: =
Descrizione dell’illustrazione DML_table_expression_clause.gif
(subquery :: = – parte di SELECT, subquery_restriction_clause :: =, table_collection_expression :: =)
subquery_restriction_clause :: =
Descrizione dell’illustrazione subquery_restriction_clause.gif
table_collection_expression :: =
Descrizione dell’illustrazione table_collection_expression.gif
update_set_clause :: =
Descrizione dell’illustrazione update_set_clause. gif
where_clause :: =
Descrizione dell’illustrazione where_clause.gif
return_clause :: =
Descrizione dell’illustrazione return_clause.gif
error_logging_clause :: =
Descrizione dell’illustrazione error_logging_clause.gif
Semantica
suggerimento
Specifica un commento che passa le istruzioni all’ottimizzatore sulla scelta di un piano di esecuzione per l’istruzione.
Puoi inserire un suggerimento parallelo immediatamente dopo la parola chiave UPDATE
per parallelizzare entrambi scansione sdraiata e UPDATE
operazioni.
Vedi anche:
-
Guida all’ottimizzazione delle prestazioni del database Oracle e ” Using Hints “per la sintassi e la descrizione dei suggerimenti
-
Oracle Database Performance Tuning Guide e Oracle Database Concepts per informazioni dettagliate sul DML parallelo
DML_table_expression_clause
La clausola ONLY
si applica solo alle viste. Specifica la sintassi della ONLY
se la vista nella clausola UPDATE
è una vista che appartiene a una gerarchia e non desideri aggiornare le righe da nessuna delle sue sottoviste.
Vedi anche:
“Restrictions on the DML_table_expression_clause” e “Aggiornamento di una tabella: esempi”
schema
Specificare lo schema contenente l’oggetto da aggiornare. Se ometti schema
, il database presume che l’oggetto sia nel tuo schema.
table | visualizza | materialized_view | subquery
Specificare il nome della tabella, vista, vista materializzata o le colonne restituite da una sottoquery da aggiornare. L’emissione di un’istruzione UPDATE
su una tabella attiva qualsiasi UPDATE
trigger associato alla tabella.
-
Se specifichi
view
, il database aggiorna la tabella di base della vista.Non è possibile aggiornare una vista tranne che conINSTEAD
OF
se la query di definizione della vista contiene uno dei seguenti costrutti:
Un operatore di gruppo ADISTINCT
operatore Una funzione aggregata o analitica AGROUP
BY
,ORDER
BY
,MODEL
,CONNECT
BY
oSTART
WITH
clausola Un’espressione di raccolta in unaSELECT
list Una sottoquery in unSELECT
list Una sottoquery designataWITH READ ONLY
si unisce, con alcune eccezioni , come documentato nella Guida di Oracle Database Administrator
-
Non è possibile aggiornare più di una tabella di base tramite una vista.
-
Inoltre, se il la visualizzazione è stata creata con
WITH
CHECK
, puoi aggiornare la vista solo se i dati risultanti soddisfano la query di definizione della vista. -
Se
table
o la tabella di base diview
contiene una o più colonne dell’indice di dominio, quindi questa istruzione esegue la routine di aggiornamento del tipo di indice appropriata. -
Non è possibile aggiornare le righe in una vista materializzata di sola lettura. Se aggiorni le righe in una vista materializzata scrivibile, il database aggiorna le righe dalla tabella contenitore sottostante. Tuttavia, gli aggiornamenti vengono sovrascritti alla successiva operazione di aggiornamento. Se aggiorni le righe in una vista materializzata aggiornabile che fa parte di un gruppo di viste materializzate, il database aggiorna anche le righe corrispondenti nella tabella principale.
Vedi Inoltre:
-
Oracle Data Cartridge Developer “s Guide per ulteriori informazioni sulle routine di aggiornamento indextype
-
CREATE MATERIALIZED VIEW per informazioni su creazione di viste materializzate aggiornabili
PARTITION | SUBPARTITION
Specifica il nome della partizione o della sottopartizione all’interno di table
destinato agli aggiornamenti. Non è necessario specificare il nome della partizione durante l’aggiornamento dei valori in una tabella partizionata. Tuttavia, in alcuni casi, specificare il nome della partizione può essere più efficiente di un where_clause
complicato .
Vedi anche:
“Riferimento a tabelle e indici partizionati” e “Aggiornamento di una partizione: esempio”
dblink
Specifica un nome completo o parziale di un collegamento al database a un database remoto dove t l’oggetto si trova. È possibile utilizzare un collegamento al database per aggiornare un oggetto remoto solo se si utilizza la funzionalità distribuita di Oracle Database.
Se si omette dblink,
, il database presume che l’oggetto sia sul database locale.
Vedi anche:
“Riferimento a oggetti in database remoti” per informazioni su come fare riferimento a collegamenti a database
subquery_restriction_clause
Utilizza subquery_restriction_clause
per limitare la sottoquery in uno dei seguenti modi:
CON SOLO LETTURA Specifica WITH READ ONLY
per indicare che la tabella o la vista non possono essere aggiornate.
CON OPZIONE DI CONTROLLO Specifica WITH CHECK OPTION
per indicare che Oracle Database vieta qualsiasi modifica alla tabella o alla vista che produrrebbe righe che non sono incluse nella sottoquery. Quando viene utilizzata nella sottoquery di un’istruzione DML, puoi specificare questa clausola in una sottoquery nella clausola FROM
ma non nella sottoquery nella WHERE
clausola.
Vincolo CONSTRAINT Specifica il nome del vincolo CHECK OPTION
. Se ometti questo identificatore, Oracle assegna automaticamente al vincolo un nome nella forma SYS_C
n
, dove n è un numero intero che rende il nome del vincolo univoco all’interno del database.
Vedere anche:
“Utilizzo della clausola WITH CHECK OPTION: esempio”
table_collection_expression
Il table_collection_expression
consente di informare Oracle che il valore di collection_expression
deve essere trattato come una tabella ai fini delle operazioni di query e DML. collection_expression
può essere una sottoquery, una colonna, una funzione o un costruttore di raccolte. Indipendentemente dalla sua forma, deve restituire un valore di raccolta, ovvero un valore il cui tipo è tabella nidificata o varray. Questo processo di estrazione degli elementi di una raccolta è chiamato raccolta senza test.
Il segno più (+) opzionale è rilevante se stai unendo l’espressione TABLE
con il genitore tavolo. Il segno + crea un join esterno dei due, in modo che la query restituisca righe dalla tabella esterna anche se l’espressione di raccolta è nulla.
Nota:
Nelle versioni precedenti di Oracle, quando collection_expression
era una sottoquery, table_collection_expression
era espresso come THE
subquery
.Tale utilizzo è ora deprecato.
Puoi utilizzare un table_collection_expression
per aggiornare le righe in una tabella in base alle righe di un’altra tabella. Ad esempio, potresti raggruppare quattro tabelle delle vendite trimestrali in una tabella delle vendite annuali.
t_alias
Specifica un nome di correlazione (alias) per la tabella, la vista o la sottoquery a cui fare riferimento altrove nella dichiarazione. Questo alias è richiesto se DML_table_expression_clause
fa riferimento a qualsiasi attributo di tipo di oggetto o metodo di tipo di oggetto.
Vedi anche:
“Aggiornamento correlato: esempio “
Restrizioni su DML_table_expression_clause Questa clausola è soggetta alle seguenti limitazioni:
-
Non è possibile eseguire questa istruzione se
table
o la tabella di base diview
contiene gli indici di dominio contrassegnati conIN_PROGRESS
oFAILED
. -
Non puoi inserire in una partizione se le partizioni di indice interessate sono contrassegnate con
UNUSABLE
. -
Non è possibile specificare
order_by_clause
nella sottoquery diDML_table_expression_clause
. -
Se specifichi un indice, una partizione di indice o una partizione di indice contrassegnata come
UNUSABLE
, l’istruzioneUPDATE
fallirà a meno che ilSKIP_UNUSABLE_INDEXES
parametro di sessione è stato impostato suTRUE
.
Vedi anche:
ALTER SESSION per informazioni su SKIP_UNUSABLE_INDEXES
parametro di sessione
update_set_clause
update_set_clause
consente di impostare i valori delle colonne.
colonna
Specifica il nome di una colonna dell’oggetto che deve essere aggiornato. Se ometti una colonna della tabella da update_set_clause
, il valore di quella colonna rimane invariato.
Se column
si riferisce a un attributo di un oggetto LOB, quindi è necessario prima inizializzarlo con un valore vuoto o null. Non puoi aggiornarlo con un valore letterale. Inoltre, se si aggiorna un valore LOB utilizzando un metodo diverso da un’istruzione SQL UPDATE
diretta, è necessario prima bloccare la riga contenente il LOB. Vedere for_update_clause per ulteriori informazioni.
Se column
fa parte della chiave di partizionamento di una tabella partizionata, UPDATE
fallirà se si modifica un valore nella colonna che sposterebbe la riga in una partizione o sottopartizione diversa, a meno che non si abiliti lo spostamento della riga. Fare riferimento a row_movement_clause
di CREATE TABLE o ALTER TABLE.
Inoltre, se column
fa parte del chiave di partizionamento di una tabella con partizioni di elenco, UPDATE
avrà esito negativo se specifichi un valore per la colonna che non esiste già in partition_value
elenco di una delle partizioni.
sottoquery
Specifica una sottoquery che restituisca esattamente una riga per ogni riga aggiornata.
-
Se specifichi solo una colonna nella
update_set_clause
, la sottoquery può restituire un solo valore. -
Se specifichi più colonne nella
update_set_clause
, la sottoquery deve restituire tanti valori quante sono le colonne specificate. -
Se la sottoquery non restituisce righe, allora il alla colonna viene assegnato un valore nullo.
-
Se questo
subquery
si riferisce a oggetti remoti, ilUPDATE
può essere eseguita in parallelo fintanto che il file referen ce non torna indietro a un oggetto sul database locale. Tuttavia, sesubquery
inDML_table_expression_clause
si riferisce a oggetti remoti, alloraUPDATE
l’operazione verrà eseguita in serie senza notifica.
Puoi utilizzare flashback_query_clause
all’interno della sottoquery per aggiornare table
con dati passati. Fare riferimento alla flashback_query_clause di SELECT
per ulteriori informazioni su questa clausola.
Vedere anche:
-
SELEZIONA e “Uso di sottoquery”
-
parallel_clause nella documentazione CREATE TABLE
expr
Specifica un’espressione che si risolve nel nuovo valore assegnato alla colonna corrispondente.
Vedi anche:
Capitolo 6, “Espressioni” per la sintassi di expr
e “Aggiornamento di una tabella oggetto: esempio”
DEFAULT Specifica DEFAULT
per impostare la colonna sul valore precedentemente specificato come predefinito valore per la colonna. Se non è stato specificato alcun valore predefinito per la colonna corrispondente, il database imposta la colonna su null.
Limitazione all’aggiornamento ai valori predefiniti Non è possibile specificare DEFAULT
se stai aggiornando una vista.
Clausola VALUE
La clausola VALUE
ti consente di specificare l’intera riga di una tabella di oggetti.
Restrizione sulla clausola VALUE È possibile specificare questa clausola solo per una tabella di oggetti.
Nota:
se si inseriscono stringhe letterali in una colonna RAW
, durante le query successive, Oracle Database eseguirà una scansione completa della tabella invece di utilizzare qualsiasi indice che potrebbe esistere nella colonna RAW
.
Vedi anche:
“Aggiornamento di una tabella oggetto: esempio”
where_clause
where_clause
ti consente di limitare le righe aggiornate a quelle per le quali condition
è vero. Se ometti questa clausola, il database aggiorna tutte le righe nella tabella o nella vista. Fare riferimento al Capitolo 7, “Condizioni” per la sintassi di condition
.
Il where_clause
determina le righe in quali valori vengono aggiornati. Se non specifichi where_clause
, tutte le righe vengono aggiornate. Per ogni riga che soddisfa where_clause
, le colonne a sinistra dell’operatore di uguaglianza (=) in update_set_clause
sono impostate sui valori delle espressioni corrispondenti a destra dell’operatore. Le espressioni vengono valutate quando la riga viene aggiornata.
return_clause
La clausola return recupera le righe interessate da un’istruzione DML. Puoi specificare questa clausola per le tabelle e le viste materializzate e per le viste con una singola tabella di base.
Quando si opera su una singola riga, un’istruzione DML con un returning_clause
può recuperare le espressioni di colonna utilizzando la riga interessata, rowid e REFs
nella riga interessata e memorizzarle nelle variabili host o nelle variabili PL / SQL.
Quando si opera su più righe, un’istruzione DML con returning_clause
memorizza i valori di espressioni, rowid e REFs
che coinvolgono le righe interessate negli array di associazione.
expr Ogni elemento nell’elenco expr
deve essere una sintassi di espressione valida.
INTO Il INTO
indica che i valori delle righe modificate devono essere memorizzati nelle variabili specificate in data_item
list.
data_item Each data_item
è una variabile host o una variabile PL / SQL che memorizza il valore expr
recuperato.
Per ogni espressione nell’elenco RETURNING
, devi specificare una variabile PL / SQL compatibile con il tipo o una variabile host corrispondente nella INTO
elenco.
Restrizioni Le seguenti limitazioni si applicano alla clausola RETURNING
:
-
Il
expr
è limitato come segue:-
Per
UPDATE
eDELETE
istruzioni ogniexpr
deve essere un’espressione semplice o un’espressione di funzione aggregata a set singolo. Non puoi combinare espressioni semplici ed espressioni di funzioni aggregate a set singolo nello stessoreturning_clause
. Per le istruzioniINSERT
, ogniexpr
deve essere un’espressione semplice. Le funzioni aggregate non sono supportate in un’istruzioneINSERT
RETURNING
. -
Single- le espressioni di funzioni aggregate non possono includere la parola chiave
DISTINCT
.
-
-
Se
expr
contiene una colonna di chiave primaria o un’altra colonnaNOT
NULL
, quindi l’istruzione di aggiornamento non riesce se la tabella ha un triggerBEFORE
UPDATE
definito su di esso. -
Non è possibile specificare
returning_clause
per un inserimento multitabile. -
Non puoi utilizzare questa clausola con DML parallelo o con oggetti remoti.
-
Non è possibile recuperare i tipi
LONG
con questa clausola. -
Non è possibile specificare questa clausola per una vista sulla quale è stato definito un trigger
INSTEAD
OF
.
Vedi anche :
Utente PL / SQL ” s Guida e riferimento per informazioni sull’utilizzo della BULK
COLLECT
clausola per restituire più valori alle variabili di raccolta
error_logging_clause
L’errore_logging_clause ha lo stesso comportamento in un’istruzione UPDATE
come in un’istruzione INSERT
. Per ulteriori informazioni, fare riferimento all’istruzione INSERT
error_logging_clause.
Vedi anche:
“Inserimento in una tabella con registrazione degli errori: esempio”
Esempi
Aggiornamento di una tabella: esempi Quanto segue la dichiarazione assegna commissioni nulle a tutti i dipendenti con il lavoro SH_CLERK
:
UPDATE employees SET commission_pct = NULL WHERE job_id = "SH_CLERK";
La seguente dichiarazione promuove Douglas Grant a manager del Dipartimento 20 con un aumento di $ 1.000:
UPDATE employees SET job_id = "SA_MAN", salary = salary + 1000, department_id = 120 WHERE first_name||" "||last_name = "Douglas Grant";
La seguente dichiarazione aumenta lo stipendio di un dipendente nel employees
tabella sul remote
database:
UPDATE employees@remote SET salary = salary*1.1 WHERE last_name = "Baer";
Il prossimo esempio mostra i seguenti costrutti sintattici del UPDATE
:
-
Entrambe le forme di
update_set_clause
insieme in una singola istruzione -
Una sottoquery correlata
-
A
where_clause
per limitare le righe aggiornate
L’istruzione UPDATE
precedente esegue le seguenti operazioni:
-
Aggiorna solo i dipendenti che lavorano a Ginevra o Monaco (località 2900 e 2700)
-
Imposta
department_id
per questi dipendenti aldepartment_id
corrispondente a Bombay (location_id
2100) -
Imposta lo stipendio di ogni dipendente a 1,1 volte lo stipendio medio del proprio dipartimento
-
Imposta la commissione di ogni dipendente a 1,5 volte la commissione media del proprio dipartimento
Aggiornamento di una partizione: esempio Il seguente esempio aggiorna i valori in una singola partizione della tabella sales
:
UPDATE sales PARTITION (sales_q1_1999) s SET s.promo_id = 494 WHERE amount_sold > 1000;
Aggiornamento di una tabella di oggetti: esempio La seguente istruzione crea due tabelle di oggetti, people_demo1
e people_demo2
, dell’oggetto people_typ
creato nelle raccolte di tabelle: esempi. L’esempio mostra come aggiornare una riga di people_demo1
selezionando una riga da people_demo2
:
L’esempio utilizza il VALUE
funzione di riferimento all’oggetto sia nella clausola SET
che nella sottoquery.
Aggiornamento correlato: esempio Per un esempio che utilizza una sottoquery correlata per aggiornare le righe della tabella nidificata, fare riferimento a “Raccolte di tabelle: esempi”.
Utilizzo della clausola RETURNING durante UPDATE: esempio L’esempio seguente restituisce i valori dalla riga aggiornata e memorizza il risultato in PL / Variabili SQL bnd1
, bnd2
, bnd3
:
Il L’esempio seguente mostra che è possibile specificare una funzione di aggregazione a set singolo nell’espressione della clausola di restituzione:
UPDATE employees SET salary = salary * 1.1 WHERE department_id = 100 RETURNING SUM(salary) INTO :bnd1;