UPPDATERING
Syfte
Använd UPDATE
för att ändra befintliga värden i en tabell eller i bastabellen för en vy eller mastertabellen för en materialiserad vy.
Ytterligare ämnen
-
Förutsättningar
-
Syntax
-
Semantics
-
Exempel
Förutsättningar
För du att uppdatera värden i en tabell, tabellen måste vara i ditt eget schema eller så måste du ha UPDATE
objektbehörighet på bordet.
För att du ska uppdatera värden i en vyns bastabell:
-
Du måste ha
UPDATE
objektbehörighet i vyn och -
Den som äger schemat som innehåller vyn måste ha
UPDATE
objektbehörighet på bastabellen.
Systemet UPDATE
ANY
TABLE
låter dig också uppdatera värden i valfri eller i basbordet av valfri vy.
Du måste också ha SELECT
objektbehörighet för objektet du vill uppdatera om:
-
Objektet finns i en fjärrdatabas eller
-
SQL92_SECURITY
initialiseringsparametern är inställd påTRUE
ochUPDATE
hänvisar till tabellkolumner, till exempel kolumnerna i enwhere_clause
.
Syntax
uppdatering :: =
Beskrivning av illustrationen update.gif
(DML_table_expression_clause :: =, update_set_clause :: =, where_clause :: =, Returning_clause :: =, error_logging_clause :: =)
DML_table_expression_clause :: =
Beskrivning av illustrationen DML_table_expression_clause.gif
(underfråga :: = – del av SELECT, subquery_restriction_clause :: =, table_collection_expression :: =)
subquery_restriction_clause :: =
Beskrivning av illustrationen subquery_restriction_clause.gif
table_collection_expression :: =
Beskrivning av illustrationen table_collection_expression.gif
update_set_clause :: =
Beskrivning av illustrationen update_set_clause. gif
där_clause :: =
Beskrivning av illustrationen där_clause.gif
retur_clause :: =
Beskrivning av illustrationen returnerar_clause.gif
error_logging_clause :: =
Beskrivning av illustrationen error_logging_clause.gif
Semantik
tips
Ange en kommentar som skickar instruktioner till optimeraren om att välja en exekveringsplan för uttalandet.
Du kan placera en parallell ledtråd direkt efter UPDATE
nyckelordet för att parallellisera båda liggande skanning och UPDATE
-operationer.
Se även:
-
Oracle Database Performance Tuning Guide och ” Använda råd ”för syntax och beskrivning av tips
-
Oracle Database Performance Tuning Guide och Oracle Database Concepts för detaljerad information om parallell DML
DML_table_expression_clause
ONLY
-satsen gäller endast visningar. Ange ONLY
syntax om vyn i UPDATE
-satsen är en vy som tillhör en hierarki och du inte vill uppdatera rader från någon av dess undervyer.
Se även:
”Begränsningar av DML_table_expression_clause” och ”Uppdatering av en tabell: exempel”
schema
Ange schemat som innehåller objektet som ska uppdateras. Om du utelämnar schema
antar databasen att objektet finns i ditt eget schema.
tabell | visa | materialized_view | underfråga
Ange namnet på tabellen, vyn, materialiserad vy eller de kolumner som returneras av en underfråga som ska uppdateras. Att utfärda ett UPDATE
uttalande mot en tabell utlöser alla UPDATE
utlösare som är associerade med tabellen.
-
Om du anger
view
uppdaterar databasen bastabellen för vyn.Du kan inte uppdatera en vy förutom medINSTEAD
OF
triggers om den definierande frågan för vyn innehåller en av följande konstruktioner:
En uppsättningsoperator ADISTINCT
operatör En samlad eller analytisk funktion AGROUP
BY
,ORDER
BY
,MODEL
,CONNECT
BY
, ellerSTART
WITH
klausul Ett samlingsuttryck i enSELECT
lista En underfråga i enSELECT
lista En underfråga betecknadWITH READ ONLY
Ansluter sig, med några undantag , som dokumenterat i Oracle Database Administrator’s Guide
-
Du kan inte uppdatera mer än en bastabell genom en vy.
-
Dessutom, om vyn skapades med
WITH
CHECK
, då kan du bara uppdatera vyn om den resulterande informationen uppfyller vyn som definierar frågan. -
Om
table
eller bastabellen förview
innehåller en eller flera domänindexkolumner, sedan utför detta uttalande lämplig uppdatering rutin för indextyp. -
Du kan inte uppdatera rader i en skrivskyddad materialvy. Om du uppdaterar rader i en skrivbar materialiserad vy uppdateras databasen raderna från den underliggande behållartabellen. Uppdateringarna skrivs dock över vid nästa uppdateringsoperation. Om du uppdaterar rader i en uppdaterbar materialiserad vy som ingår i en materialiserad vygrupp, uppdaterar databasen också motsvarande rader i mastertabellen.
Se Också:
-
Oracle Data Cartridge Developer’s Guide för mer information om uppdateringsrutinerna för indextypen
-
CREATE MATERIALIZED VIEW för information om skapa uppdaterbara materialiserade vyer
PARTITION | SUBPARTITION
Ange namnet på partitionen eller underpartitionen inom table
riktade för uppdateringar. Du behöver inte ange partitionsnamnet när du uppdaterar värden i en partitionerad tabell. I vissa fall kan det dock vara mer effektivt att ange partitionsnamnet än en komplicerad where_clause
.
Se även:
”Med hänvisning till partitionerade tabeller och index” och ”Uppdatera en partition: Exempel”
dblink
Ange ett fullständigt eller partiellt namn på en databaslänk till en fjärrdatabas där t objektet finns. Du kan bara använda en databaslänk för att uppdatera ett fjärrobjekt om du använder Oracle Database-distribuerad funktionalitet.
Om du utelämnar dblink,
antar databasen att objektet är på den lokala databasen.
Se även:
”Referera till objekt i fjärradatabaser” för information om hänvisning till databaslänkar
subquery_restriction_clause
Använd subquery_restriction_clause
för att begränsa underfrågan på något av följande sätt:
MED ENDAST LÄS Ange WITH READ ONLY
för att indikera att tabellen eller vyn inte kan uppdateras.
MED KONTROLLALTERNATIV Ange WITH CHECK OPTION
för att indikera att Oracle Database förbjuder ändringar i tabellen eller vyn som skulle ge rader som inte ingår i underfrågan. När den används i underfrågan till ett DML-uttalande kan du ange denna klausul i en underfråga i FROM
-satsen men inte i underfrågan i WHERE
klausul.
CONSTRAINT-begränsning Ange namnet på CHECK OPTION
-begränsningen. Om du utelämnar denna identifierare tilldelar Oracle begränsningen automatiskt ett namn på formuläret SYS_C
n
, där n är ett heltal som gör begränsningsnamn unikt i databasen.
Se även:
”Använda WITH CHECK OPTION-klausulen: Exempel”
table_collection_expression
table_collection_expression
låter dig informera Oracle om att värdet av collection_expression
ska behandlas som en tabell för frågor och DML-operationer. collection_expression
kan vara en underfråga, en kolumn, en funktion eller en samlingskonstruktör. Oavsett form måste den returnera ett samlingsvärde – det vill säga ett värde vars typ är kapslad tabell eller varray. Denna process för att extrahera elementen i en samling kallas samling otrevlig.
Det valfria plus (+) är relevant om du går med i uttrycket TABLE
tabell. + Skapar en yttre koppling av de två, så att frågan returnerar rader från den yttre tabellen även om samlingsuttrycket är null.
Obs:
I tidigare versioner av Oracle, när collection_expression
var en underfråga, table_collection_expression
uttrycktes som THE
subquery
.Den användningen har nu upphört att gälla.
Du kan använda en table_collection_expression
för att uppdatera rader i en tabell baserat på rader från en annan tabell. Du kan till exempel rulla upp fyra kvartalsförsäljningstabeller till en årlig försäljningstabell.
t_alias
Ange ett korrelationsnamn (alias) för den tabell, vy eller underfråga som ska refereras till någon annanstans i uttalandet. Detta alias krävs om DML_table_expression_clause
refererar till attribut av objekttyp eller metod för objekttyp.
Se även:
”Korrelerad uppdatering: Exempel ”
Begränsningar av DML_table_expression_clause Denna klausul är föremål för följande begränsningar:
-
Du kan inte utföra detta uttalande om
table
eller bastabellen förview
innehåller domänindex markeradeIN_PROGRESS
ellerFAILED
. -
Du kan inte infoga i en partition om några berörda indexpartitioner är markerade
UNUSABLE
. -
Du kan inte ange
order_by_clause
i underfrågan tillDML_table_expression_clause
. -
Om du anger ett index, en indexpartition eller en indexdelning som har markerats
UNUSABLE
, kommerUPDATE
-uttalandet att misslyckas om inteSKIP_UNUSABLE_INDEXES
sessionsparameter har ställts in påTRUE
.
Se även:
ALTER SESSION för information om SKIP_UNUSABLE_INDEXES
sessionsparameter
update_set_clause
update_set_clause
låter dig ställa in kolumnvärden.
kolumn
Ange namnet på en kolumn för objektet som ska uppdateras. Om du utelämnar en kolumn i tabellen från update_set_clause
, förblir värdet på den kolumnen oförändrad.
Om column
hänvisar till ett LOB-objektattribut, då måste du först initialisera det med värdet tom eller null. Du kan inte uppdatera den med en bokstav. Om du uppdaterar ett LOB-värde med någon annan metod än en direkt UPDATE
SQL-sats, måste du först låsa raden som innehåller LOB. Se för_update_clause för mer information.
Om column
är en del av partitioneringsnyckeln i en partitionerad tabell, då UPDATE
misslyckas om du ändrar ett värde i kolumnen som flyttar raden till en annan partition eller underpartition, såvida du inte aktiverar radrörelse. Se row_movement_clause
i CREATE TABLE eller ALTER TABLE.
Dessutom, om column
är en del av partitioneringsnyckel i en listadelad tabell, då UPDATE
misslyckas om du anger ett värde för kolumnen som inte redan finns i partition_value
lista över en av partitionerna.
underfråga
Ange en underfråga som returnerar exakt en rad för varje uppdaterad rad.
-
Om du anger bara en kolumn i
update_set_clause
, så kan underfrågan bara returnera ett värde. -
Om du anger flera kolumner i
update_set_clause
måste underfrågan returnera så många värden som du har angett kolumner. -
Om underfrågan returnerar inga rader, då kolumn tilldelas en noll.
-
Om denna
subquery
hänvisar till avlägsna objekt, såUPDATE
operation kan köras parallellt så länge som referensen ce går inte tillbaka till ett objekt i den lokala databasen. Men omsubquery
iDML_table_expression_clause
hänvisar till avlägsna objekt, såUPDATE
operationen körs utan förvarning.
Du kan använda flashback_query_clause
i underfrågan för att uppdatera table
med tidigare data. Se flashback_query_clause för SELECT
för mer information om denna klausul.
Se även:
-
VÄLJ och ”Använda underfrågor”
-
parallel_clause i CREATE TABLE documentation
expr
Ange ett uttryck som övergår till det nya värdet som tilldelats motsvarande kolumn.
Se även:
Kapitel 6, ”Uttryck” för syntaxen för expr
och ”Uppdatera en objekttabell: Exempel”
STANDARD Ange DEFAULT
för att ställa in kolumnen till det värde som tidigare angavs som standard värde för kolumnen. Om inget standardvärde för motsvarande kolumn har angetts, sätter databasen kolumnen till noll.
Begränsning för uppdatering till standardvärden Du kan inte ange DEFAULT
om du uppdaterar en vy.
VALUE-sats
VALUE
-satsen kan du ange hela raden i en objekttabell.
Begränsning av VALUE-satsen Du kan bara ange denna sats för en objekttabell.
Obs:
Om du infogar stränglitteraler i en RAW
-kolumn, kommer Oracle Database att göra en fullständig tabellgenomsökning under efterföljande frågor. snarare än att använda något index som kan finnas i kolumnen RAW
.
Se även:
”Uppdatera en objekttabell: Exempel”
där_clause
where_clause
låter dig begränsa raderna uppdaterade till de för vilka den angivna condition
är sant. Om du utelämnar den här klausulen uppdaterar databasen alla rader i tabellen eller vyn. Se kapitel 7, ”Villkor” för syntaxen för condition
.
where_clause
bestämmer raderna i vilka värden som uppdateras. Om du inte anger where_clause
uppdateras alla rader. För varje rad som uppfyller where_clause
, är kolumnerna till vänster om likhetsoperatören (=) i update_set_clause
inställda på värdena av motsvarande uttryck till höger om operatören. Uttrycken utvärderas när raden uppdateras.
return_clause
Den returnerande klausulen hämtar de rader som påverkas av ett DML-uttalande. Du kan ange denna klausul för tabeller och materialiserade vyer och för vyer med en enda bastabell.
När du arbetar på en enda rad, ett DML-uttalande med returning_clause
kan hämta kolumnuttryck med den berörda raden, rowid och REFs
till den berörda raden och lagra dem i värdvariabler eller PL / SQL-variabler.
När du arbetar flera rader, ett DML-uttalande med returning_clause
lagrar värden från uttryck, rowids och REFs
som involverar de berörda raderna i bindningsarrayer.
expr Varje objekt i expr
-listan måste vara en giltig uttryckssyntax.
INT INTO
klausul anger att värdena på de ändrade raderna ska lagras i variabeln (arna) som anges i data_item
-listan.
data_item Varje data_item
är en värdvariabel eller PL / SQL-variabel som lagrar det hämtade expr
-värdet.
För varje uttryck i RETURNING
-listan måste du ange en motsvarande typkompatibel PL / SQL-variabel eller värdvariabel i INTO
lista.
Begränsningar Följande begränsningar gäller för RETURNING
-satsen:
-
expr
begränsas enligt följande:-
För
UPDATE
ochDELETE
uttalanden varjeexpr
måste vara ett enkelt uttryck eller ett enda uppsättningsfunktionsuttryck. Du kan inte kombinera enkla uttryck och samlade funktionsuttryck i en uppsättning i sammareturning_clause
. FörINSERT
uttalanden måste varjeexpr
vara ett enkelt uttryck. Aggregerade funktioner stöds inte i enINSERT
uttalandeRETURNING
klausul. -
Enkel- ange sammanlagda funktionsuttryck kan inte innehålla sökordet
DISTINCT
.
-
-
Om
expr
-listan innehåller en primär nyckelkolumn eller en annanNOT
NULL
-kolumn, då misslyckas uppdateringsuttrycket om tabellen har enBEFORE
UPDATE
utlösare definierad på den. -
Du kan inte ange
returning_clause
för ett multitabelt inlägg. -
Du kan inte använda denna klausul med parallell DML eller med fjärrobjekt.
-
Du kan inte hämta
LONG
-typer med den här klausulen. -
Du kan inte ange denna klausul för en vy där en
INSTEAD
OF
utlösare har definierats.
Se även :
PL / SQL-användare ” s Guide och referens för information om att använda BULK
COLLECT
-satsen för att returnera flera värden till samlingsvariabler
error_logging_clause
Error_logging_clause har samma beteende i ett UPDATE
-uttalande som i ett INSERT
-uttalande. Se INSERT
uttalande error_logging_clause för mer information.
Se även:
”Infoga i en tabell med felloggning: Exempel”
Exempel
Uppdatera en tabell: Exempel Följande uttalande ger null uppdrag till alla anställda med jobbet SH_CLERK
:
UPDATE employees SET commission_pct = NULL WHERE job_id = "SH_CLERK";
Följande uttalande främjar Douglas Grant till chef avdelning 20 med en $ 1000-höjning:
UPDATE employees SET job_id = "SA_MAN", salary = salary + 1000, department_id = 120 WHERE first_name||" "||last_name = "Douglas Grant";
Följande uttalande ökar lönen för en anställd i employees
tabell i remote
databasen:
UPDATE employees@remote SET salary = salary*1.1 WHERE last_name = "Baer";
Nästa exempel visar följande syntaktiska konstruktioner av UPDATE
uttalande:
-
Båda formerna av
update_set_clause
tillsammans i ett enda uttalande -
En korrelerad underfråga
-
A
where_clause
för att begränsa de uppdaterade raderna
Den föregående UPDATE
uttalandet utför följande åtgärder:
-
Uppdaterar endast de anställda som arbetar i Genève eller München (platser 2900 och 2700)
-
Uppsättningar
department_id
för dessa anställda tilldepartment_id
motsvarande Bombay (location_id
2100) -
Ställer in varje anställds lön till 1,1 gånger genomsnittlig lön för deras avdelning
-
Ställer in varje anställds provision till 1,5 gånger den genomsnittliga provisionen för deras avdelning
Uppdatera en partition: Exempel I följande exempel uppdateras värden i en enda partition i sales
-tabellen:
UPDATE sales PARTITION (sales_q1_1999) s SET s.promo_id = 494 WHERE amount_sold > 1000;
Uppdatera en objekttabell: Exempel Följande uttalande skapar två objekttabeller, people_demo1
och people_demo2
, av people_typ
-objektet som skapats i tabellsamlingar: exempel. Exemplet visar hur du uppdaterar en rad med people_demo1
genom att välja en rad från people_demo2
:
Exemplet använder VALUE
objektreferensfunktion i både SET
-satsen och underfrågan.
Korrelerad uppdatering: Exempel För ett exempel som använder en korrelerad underfråga för att uppdatera kapslade tabellrader, se ”Tabellsamlingar: Exempel”.
Använda RETURNING-avsnittet under UPPDATERING: Exempel Följande exempel returnerar värden från den uppdaterade raden och lagrar resultatet i PL / SQL-variabler bnd1
, bnd2
, bnd3
:
följande exempel visar att du kan ange en samlingsfunktion med en uppsättning i uttrycket för den återvändande klausulen:
UPDATE employees SET salary = salary * 1.1 WHERE department_id = 100 RETURNING SUM(salary) INTO :bnd1;