UPDATE (Română)
Scop
Utilizați instrucțiunea UPDATE
pentru a modifica valorile existente într-un tabel sau în tabelul de bază al unei vizualizări sau tabelul principal al unei vizualizări materializate.
Subiecte suplimentare
-
Cerințe preliminare
-
Sintaxă
-
Semantică
-
Exemple
Cerințe preliminare
Pentru pentru a actualiza valorile într-un tabel, tabelul trebuie să fie în propria schemă sau trebuie să aveți privilegiul obiectului UPDATE
pe tabelă.
Pentru a vă actualiza valori din tabelul de bază al unei vizualizări:
-
Trebuie să aveți privilegiul obiectului
UPDATE
în vizualizare și -
Oricine deține schema care conține vizualizarea trebuie să aibă privilegiul de obiect
UPDATE
pe tabela de bază.
UPDATE
ANY
TABLE
vă permite, de asemenea, să actualizați valorile în orice masă sau în masa de bază a oricărei vizualizări.
Trebuie să aveți și privilegiul de obiect SELECT
pe obiectul pe care doriți să îl actualizați dacă:
-
Obiectul se află pe o bază de date la distanță sau
-
Parametrul de inițializare
SQL92_SECURITY
este setat laTRUE
și operațiaUPDATE
referință la coloanele tabelului, cum ar fi coloanele dintr-owhere_clause
.
Sintaxă
update :: =
Descrierea ilustrației update.gif
(DML_table_expression_clause :: =, update_set_clause :: =, where_clause :: =, return_clause :: =, error_logging_clause :: =)
DML_table_expression_clause :: =
Descrierea ilustrației DML_table_expression_clause.gif
(subinterogare :: = – parte din SELECT, subinterogare_restricție_clauză :: =, tabel_colecție_expresie :: =)
subinterogare_restricție_clauză :: =
Descrierea ilustrației subquery_restriction_clause.gif
table_collection_expression :: =
Descrierea ilustrației table_collection_expression.gif
update_set_clause :: =
Descrierea ilustrației update_set_clause. gif
where_clause :: =
Descrierea ilustrației where_clause.gif
return_clause :: =
Descrierea ilustrației return_clause.gif
error_logging_clause :: =
Descrierea ilustrației error_logging_clause.gif
Semantică
hint
Specificați un comentariu care transmite instrucțiuni optimizatorului pentru alegerea unui plan de execuție pentru instrucțiune.
Puteți plasa un indiciu paralel imediat după cuvântul cheie UPDATE
pentru a paralela atât sub scanarea mincinoasă și operațiile UPDATE
.
Consultați și:
-
Ghidul de optimizare a performanței bazei de date Oracle și ” Utilizarea sugestiilor „pentru sintaxa și descrierea sugestiilor
-
Ghidul de optimizare a performanței bazei de date Oracle și conceptele Oracle Database pentru informații detaliate despre DML paralel
DML_table_expression_clause
Clauza ONLY
se aplică numai vizualizărilor. Specificați ONLY
sintaxă dacă vizualizarea din clauza UPDATE
este o vizualizare care aparține unei ierarhii și nu doriți să actualizați rândurile din orice din subvizualizările sale.
Vezi și:
„Restricții privind clauza DML_table_expression_clause” și „Actualizarea unui tabel: exemple”
schema
Specificați schema care conține obiectul de actualizat. Dacă omiteți schema
, atunci baza de date presupune că obiectul se află în propria schemă.
tabel | Vizualizați | materialized_view | subinterogare
Specificați numele tabelului, vizualizării, vizualizării materializate sau coloanelor returnate de o subinterogare care urmează să fie actualizate. Emiterea unei instrucțiuni UPDATE
împotriva unui tabel declanșează orice declanșator UPDATE
asociat cu tabelul.
-
Dacă specificați
view
, atunci baza de date actualizează tabelul de bază al vizualizării.Nu puteți actualiza o vizualizare decât cu declanșatoareleINSTEAD
OF
dacă interogarea definitorie a vizualizării conține una dintre următoarele construcții:
Un operator de set ADISTINCT
operator O funcție agregată sau analitică AGROUP
BY
,ORDER
BY
,MODEL
,CONNECT
BY
sauSTART
WITH
clauză O expresie de colecție într-oSELECT
listă O subinterogare dintr-o listăSELECT
O subinterogare desemnatăWITH READ ONLY
Alăturări, cu unele excepții , așa cum este documentat în Ghidul administratorului de baze de date Oracle
-
Nu puteți actualiza mai multe tabele de bază printr-o vizualizare.
-
În plus, dacă vizualizarea a fost creată cu
WITH
CHECK
, atunci puteți actualiza vizualizarea numai dacă datele rezultate satisfac interogarea care definește vizualizarea. -
Dacă
table
sau tabelul de bază alview
conține una sau mai multe coloane de index de domeniu, atunci această instrucțiune execută rutina de actualizare adecvată a tipului de index. -
Nu puteți actualiza rândurile într-o vizualizare materializată numai în citire. Dacă actualizați rândurile într-o vizualizare materializată, atunci baza de date actualizează rândurile din tabelul containerului de bază. Cu toate acestea, actualizările sunt suprascrise la următoarea operație de reîmprospătare. Dacă actualizați rândurile într-o vizualizare materializată actualizabilă care face parte dintr-un grup de vizualizări materializate, atunci baza de date actualizează și rândurile corespunzătoare din tabelul principal.
Consultați De asemenea:
-
Ghidul dezvoltatorului Oracle Data Cartridge pentru mai multe informații despre rutinele de actualizare tip index
-
CREAȚI VIZUALIZARE MATERIALIZATĂ pentru informații despre crearea de vizualizări materializate actualizabile
PARTITION | SUBPARTITION
Specificați numele partiției sau subpartiției din table
vizat pentru actualizări. Nu trebuie să specificați numele partiției atunci când actualizați valorile într-un tabel partiționat. Cu toate acestea, în unele cazuri, specificarea numelui partiției poate fi mai eficient decât un where_clause
complicat. .
Vezi și:
„Referința la tabele și indexuri partiționate” și „Actualizarea unei partiții: exemplu”
dblink
Specificați un nume complet sau parțial al unei baze de date link către o bază de date la distanță unde t obiectul este localizat. Puteți utiliza un link de bază de date pentru a actualiza un obiect la distanță numai dacă utilizați funcționalitatea distribuită Oracle Database.
Dacă omiteți dblink,
atunci baza de date presupune că obiectul este pe baza de date locală.
Consultați și:
„Referirea la obiecte din bazele de date la distanță” pentru informații despre trimiterea la linkurile bazei de date
subquery_restriction_clause
Utilizați subquery_restriction_clause
pentru a restricționa interogarea într-unul din următoarele moduri:
CU CITIRE NUMAI Specificați WITH READ ONLY
pentru a indica faptul că tabelul sau vizualizarea nu pot fi actualizate.
CU OPȚIUNEA CHECK Specificați WITH CHECK OPTION
pentru a indica faptul că baza de date Oracle interzice orice modificare a tabelului sau a vizualizării care ar produce rânduri care nu sunt incluse în subinterogare. Când este utilizat în subconsultarea unei instrucțiuni DML, puteți specifica această clauză într-o subconsultare în clauza FROM
, dar nu în subconsultare în WHERE
clauză.
CONSTRAINT constrângere Specificați numele constrângerii CHECK OPTION
. Dacă omiteți acest identificator, Oracle atribuie automat constrângerii un nume de formă SYS_C
n
, unde n este un număr întreg care face ca nume de constrângere unic în baza de date.
Consultați și:
„Utilizarea clauzei WITH CHECK OPTION: Exemplu”
table_collection_expression
table_collection_expression
vă permite să informați Oracle că valoarea collection_expression
ar trebui tratată ca un tabel în scopuri de interogare și operațiuni DML. collection_expression
poate fi o interogare, o coloană, o funcție sau un constructor de colecție. Indiferent de forma sa, trebuie să returneze o valoare de colecție – adică o valoare al cărei tip este tabel imbricat sau varray. Acest proces de extragere a elementelor unei colecții se numește colecție nesimțitoare.
Plusul opțional (+) este relevant dacă asociați expresia TABLE
cu părintele masa. + Creează o îmbinare exterioară a celor două, astfel încât interogarea să returneze rânduri din tabelul exterior chiar dacă expresia colecției este nulă.
Notă:
În versiunile anterioare ale Oracle, când collection_expression
a fost o subinterogare, table_collection_expression
a fost exprimat ca THE
subquery
.Această utilizare este acum depreciată.
Puteți utiliza un table_collection_expression
pentru a actualiza rândurile dintr-un tabel pe baza rândurilor dintr-un alt tabel. De exemplu, puteți înfășura patru tabele trimestriale de vânzări într-un tabel anual de vânzări.
t_alias
Specificați un nume de corelație (alias) pentru tabel, vizualizare sau subinterogare la care să faceți referire în altă parte a declarației. Acest alias este necesar dacă DML_table_expression_clause
face referire la atribute de tip obiect sau metode de tip obiect.
Vezi și:
„Actualizare corelată: exemplu „
Restricții la clauza DML_table_expression_ Această clauză este supusă următoarelor restricții:
-
Nu puteți executa această declarație dacă
table
sau tabelul de bază alview
conține indici de domeniu marcațiIN_PROGRESS
sauFAILED
. -
Nu puteți introduce într-o partiție dacă partițiile index afectate sunt marcate
UNUSABLE
. -
Nu puteți specifica
order_by_clause
în subinterogareaDML_table_expression_clause
. -
Dacă specificați un index, o partiție index sau o subpartiție index care a fost marcată
UNUSABLE
, atunci instrucțiuneaUPDATE
va eșua, cu excepția cazului în careSKIP_UNUSABLE_INDEXES
parametru de sesiune a fost setat laTRUE
.
Consultați și:
ALTER SESSION pentru informații despre SKIP_UNUSABLE_INDEXES
parametru de sesiune
update_set_clause
update_set_clause
vă permite să setați valorile coloanei.
coloană
Specificați numele unei coloane a obiectului care urmează să fie actualizat. Dacă omiteți o coloană a tabelului din update_set_clause
, atunci valoarea acelei coloane rămâne neschimbată.
Dacă column
se referă la un atribut de obiect LOB, apoi trebuie mai întâi să-l inițializăm cu o valoare goală sau nulă. Nu îl puteți actualiza cu un literal. De asemenea, dacă actualizați o valoare LOB utilizând o altă metodă decât o instrucțiune directă UPDATE
SQL, trebuie mai întâi să blocați rândul care conține LOB. Pentru mai multe informații, consultați for_update_clause.
Dacă column
face parte din cheia de partiționare a unei tabele partiționate, atunci UPDATE
va eșua dacă modificați o valoare din coloană care ar muta rândul pe o altă partiție sau subpartiție, cu excepția cazului în care activați mișcarea rândului. Vă rugăm să consultați row_movement_clause
din CREATE TABLE sau ALTER TABLE.
În plus, dacă column
face parte din cheia de partiționare a unei tabele partiționate în listă, atunci UPDATE
va eșua dacă specificați o valoare pentru coloană care nu există deja în partition_value
lista uneia dintre partiții.
subinterogare
Specificați o interogare care returnează exact un rând pentru fiecare rând actualizat.
-
Dacă specificați o singură coloană în
update_set_clause
, apoi interogarea poate returna o singură valoare. -
Dacă specificați mai multe coloane în
update_set_clause
, apoi interogarea trebuie să returneze atâtea valori câte coloane ați specificat. -
Dacă interogarea nu returnează niciun rând, coloanei i se atribuie un nul.
-
Dacă acest
subquery
se referă la obiecte la distanță, atunciUPDATE
poate rula în paralel atâta timp cât referința ce nu revine la un obiect din baza de date locală. Cu toate acestea, dacăsubquery
dinDML_table_expression_clause
se referă la orice obiecte la distanță, atunciUPDATE
operațiunea va rula în serie, fără notificare.
Puteți utiliza flashback_query_clause
din subinterogare pentru a actualiza table
cu date anterioare. Pentru mai multe informații despre această clauză, consultați flashback_query_clause din SELECT
.
Consultați și:
-
SELECȚIONEAZĂ ȘI „Folosirea subconsultărilor”
-
parallel_clause în documentația CREATE TABLE
expr
Specificați o expresie care se rezolvă la noua valoare atribuită coloanei corespunzătoare.
Consultați și:
Capitolul 6, „Expresii” pentru sintaxa expr
și „Actualizarea unui tabel de obiecte: exemplu”
DEFAULT Specificați DEFAULT
pentru a seta coloana la valoarea specificată anterior ca implicită valoare pentru coloană. Dacă nu a fost specificată nicio valoare implicită pentru coloana corespunzătoare, atunci baza de date setează coloana la nulă.
Restricție la actualizarea valorilor implicite Nu puteți specifica DEFAULT
dacă actualizați o vizualizare.
Clauza VALUE
Clauza VALUE
vă permite să specificați întregul rând al unei tabele obiect.
Restricție la clauza VALUE Puteți specifica această clauză numai pentru o tabelă de obiecte.
Notă:
Dacă introduceți literele șirului într-o coloană RAW
, atunci în timpul interogărilor ulterioare, Oracle Database va efectua o scanare completă a tabelului mai degrabă decât să folosiți orice index care ar putea exista în coloana RAW
.
Consultați și:
„Actualizarea unui tabel de obiecte: exemplu” / div>
where_clause
where_clause
vă permite să restricționați rândurile actualizate la cele pentru care condition
este adevărat. Dacă omiteți această clauză, atunci baza de date actualizează toate rândurile din tabel sau din vizualizare. Vă rugăm să consultați capitolul 7, „Condiții” pentru sintaxa condition
.
where_clause
determină rândurile din care valori sunt actualizate. Dacă nu specificați where_clause
, atunci toate rândurile sunt actualizate. Pentru fiecare rând care satisface where_clause
, coloanele din stânga operatorului de egalitate (=) din update_set_clause
sunt setate la valori a expresiilor corespunzătoare din dreapta operatorului. Expresiile sunt evaluate pe măsură ce rândul este actualizat.
return_clause
Clauza returnată recuperează rândurile afectate de o instrucțiune DML. Puteți specifica această clauză pentru tabele și vizualizări materializate și pentru vizualizări cu un singur tabel de bază.
Când operați pe un singur rând, o instrucțiune DML cu un returning_clause
poate prelua expresii de coloană folosind rândul afectat, rowid și REFs
pe rândul afectat și le poate stoca în variabile gazdă sau variabile PL / SQL.
Când operați pe mai multe rânduri, o instrucțiune DML cu returning_clause
stochează valori din expresii, rânduri și REFs
care implică rândurile afectate în matrice de legare.
expr Fiecare element din lista expr
trebuie să fie o sintaxă de expresie validă.
ÎN INTO
clauza indică faptul că valorile rândurilor modificate trebuie stocate în variabilele specificate în lista data_item
.
data_item Fiecare data_item
este o variabilă gazdă sau variabilă PL / SQL care stochează valoarea expr
recuperată.
Pentru fiecare expresie din lista RETURNING
, trebuie să specificați o variabilă PL / SQL sau o variabilă gazdă corespunzătoare compatibile cu tipul în INTO
listă.
Restricții Următoarele restricții se aplică clauzei RETURNING
:
-
expr
este restricționat după cum urmează:-
Pentru
UPDATE
șiDELETE
declarații fiecareexpr
trebuie să fie o expresie simplă sau o expresie de funcție agregată cu un singur set. Nu puteți combina expresii simple și expresii de funcții agregate cu un singur set în acelașireturning_clause
. Pentru instrucțiunileINSERT
, fiecareexpr
trebuie să fie o expresie simplă. Funcțiile agregate nu sunt acceptate într-o clauzăINSERT
RETURNING
. -
Single- expresiile de funcții agregate set nu pot include cuvântul cheie
DISTINCT
.
-
-
Dacă
expr
lista conține o coloană cheie primară sau altă coloanăNOT
NULL
, atunci instrucțiunea de actualizare eșuează dacă tabelul are un declanșatorBEFORE
UPDATE
definit pe acesta. -
Nu puteți specifica
returning_clause
pentru un insert multitabil. -
Nu puteți utiliza această clauză cu DML paralel sau cu obiecte la distanță.
-
Nu puteți prelua tipurile
LONG
cu această clauză. -
Nu puteți specifica această clauză pentru o vizualizare pe care a fost definit un declanșator
INSTEAD
OF
.
Vezi și :
Utilizator PL / SQL ” s Ghid și referință pentru informații despre utilizarea BULK
COLLECT
clauză pentru a returna mai multe valori variabilelor de colectare
error_logging_clause
Error_logging_clause are același comportament într-o instrucțiune UPDATE
ca într-o instrucțiune INSERT
. Pentru mai multe informații, consultați instrucțiunea INSERT
error_logging_clause.
Consultați și:
„Introducerea într-un tabel cu înregistrarea erorilor: Exemplu”
Exemple
Actualizarea unui tabel: Exemple Următoarele declarația oferă comisioane nule tuturor angajaților cu postul SH_CLERK
:
UPDATE employees SET commission_pct = NULL WHERE job_id = "SH_CLERK";
Următoarea declarație îl promovează pe Douglas Grant în funcția de manager din Departamentul 20 cu o creștere de 1.000 USD:
UPDATE employees SET job_id = "SA_MAN", salary = salary + 1000, department_id = 120 WHERE first_name||" "||last_name = "Douglas Grant";
Următoarea declarație mărește salariul unui angajat în employees
tabel pe baza de date remote
:
UPDATE employees@remote SET salary = salary*1.1 WHERE last_name = "Baer";
Următorul exemplu prezintă următoarele construcții sintactice ale declarație:
-
Ambele forme ale
update_set_clause
împreună într-o singură declarație -
O interogare corelată
-
A
where_clause
pentru a limita rândurile actualizate
Instrucțiunea UPDATE
precedentă efectuează următoarele operațiuni:
-
Actualizează numai acei angajați care lucrează în Geneva sau Munchen (locațiile 2900 și 2700)
-
Seturi
department_id
pentru acești angajați ladepartment_id
corespunzător Bombay (location_id
2100) -
Stabilește salariul fiecărui angajat la 1,1 ori salariul mediu al departamentului lor
-
Setează comisionul fiecărui angajat la 1,5 ori comisionul mediu al departamentului lor
Actualizarea unei partiții: exemplu Următorul exemplu actualizează valorile într-o singură partiție a tabelului sales
:
UPDATE sales PARTITION (sales_q1_1999) s SET s.promo_id = 494 WHERE amount_sold > 1000;
Actualizarea unui tabel de obiecte: Exemplu Următoarea declarație creează două tabele de obiecte, people_demo1
și people_demo2
, a obiectului people_typ
creat în colecțiile de tabele: exemple. Exemplul arată cum să actualizați un rând de people_demo1
selectând un rând din people_demo2
:
Exemplul folosește VALUE
funcția de referință a obiectului atât în clauza SET
, cât și în subinterogare.
Actualizare corelată: exemplu pentru un exemplu care folosește o interogare corelată pentru a actualiza rândurile de tabele imbricate, vă rugăm să consultați „Colecții de tabele: exemple”.
Utilizarea clauzei RETURNING În timpul UPDATE: Exemplu Următorul exemplu returnează valori din rândul actualizat și stochează rezultatul în PL / Variabile SQL bnd1
, bnd2
, bnd3
:
The următorul exemplu arată că puteți specifica o funcție agregată cu un singur set în expresia clauzei returnate:
UPDATE employees SET salary = salary * 1.1 WHERE department_id = 100 RETURNING SUM(salary) INTO :bnd1;