OPDATER
Formål
Brug udsagnet UPDATE
til at ændre eksisterende værdier i en tabel eller i basistabellen i en visning eller mastertabellen for en materialiseret visning.
Yderligere emner
-
Forudsætninger
-
Syntaks
-
Semantics
-
Eksempler
Forudsætninger
For dig for at opdatere værdier i en tabel, tabellen skal være i dit eget skema, eller du skal have UPDATE
objektrettighed på bordet.
For at du kan opdatere værdier i basistabellen for en visning:
-
Du skal have objektet
UPDATE
på visningen og -
Den, der ejer skemaet, der indeholder visningen, skal have objektet
UPDATE
på basistabellen.
Systemet UPDATE
ANY
TABLE
giver dig også mulighed for at opdatere værdier i enhver bord eller i bundbordet af enhver visning.
Du skal også have objektet SELECT
på det objekt, du vil opdatere, hvis:
-
Objektet er i en ekstern database eller
-
SQL92_SECURITY
initialiseringsparameteren er indstillet tilTRUE
ogUPDATE
-operationen henviser til tabelkolonner, såsom kolonnerne i enwhere_clause
.
Syntaks
opdatering :: =
Beskrivelse af illustrationen update.gif
(DML_table_expression_clause :: =, update_set_clause :: =, where_clause :: =, returner_clause :: =, error_logging_clause :: =)
DML_table_expression_clause :: =
Beskrivelse af illustrationen DML_table_expression_clause.gif
(underforespørgsel :: = – del af SELECT, subquery_restriction_clause :: =, table_collection_expression :: =)
subquery_restriction_clause :: =
Beskrivelse af illustrationen subquery_restriction_clause.gif
table_collection_expression :: =
Beskrivelse af illustrationen table_collection_expression.gif
update_set_clause :: =
Beskrivelse af illustrationen update_set_clause. gif
hvor_clause :: =
Beskrivelse af illustrationen hvor_clause.gif
retur_clause :: =
Beskrivelse af illustrationen returnering_clause.gif
error_logging_clause :: =
Beskrivelse af illustrationen error_logging_clause.gif
Semantik
tip
Angiv en kommentar der videresender instruktioner til optimeringsprogrammet om valg af en eksekveringsplan for erklæringen.
Du kan placere et parallelt tip straks efter UPDATE
nøgleordet for at parallelisere begge under liggende scanning og UPDATE
operationer.
Se også:
-
Oracle Database Performance Tuning Guide og ” Brug af tip “til syntaks og beskrivelse af tip
-
Oracle Database Performance Tuning Guide og Oracle Database Concepts for detaljeret information om parallel DML
DML_table_expression_clause
ONLY
-klausulen gælder kun for visninger. Angiv ONLY
syntaks, hvis visningen i UPDATE
-sætningen er en visning, der hører til et hierarki, og du ikke vil opdatere rækker fra nogen af dets undervisninger.
Se også:
“Begrænsninger på DML_table_expression_clause” og “Opdatering af en tabel: eksempler”
skema
Angiv skemaet, der indeholder det objekt, der skal opdateres. Hvis du udelader schema
, antager databasen, at objektet er i dit eget skema.
tabel | visning | materialized_view | underforespørgsel
Angiv navnet på tabellen, visningen, den materialiserede visning eller de kolonner, der returneres af en underforespørgsel, der skal opdateres. Udstedelse af en UPDATE
-udtalelse mod en tabel affyrer alle UPDATE
-udløsere, der er knyttet til tabellen.
-
Hvis du angiver
view
, opdaterer databasen basistabellen for visningen.Du kan ikke opdatere en visning undtagen medINSTEAD
OF
udløser, hvis den definerende forespørgsel for visningen indeholder en af følgende konstruktioner:
En sætoperator ADISTINCT
operator En samlet eller analytisk funktion AGROUP
BY
,ORDER
BY
,MODEL
,CONNECT
BY
ellerSTART
WITH
klausul Et samleudtryk i enSELECT
liste En underforespørgsel i enSELECT
liste En underforespørgsel betegnetWITH READ ONLY
Deltager, med nogle undtagelser , som dokumenteret i Oracle Database Administrator’s Guide
-
Du kan ikke opdatere mere end en basistabel gennem en visning.
-
Hvis visning blev oprettet med
WITH
CHECK
, så kan du kun opdatere visningen, hvis de resulterende data opfylder visningens definerende forespørgsel. -
Hvis
table
eller basistabellen iview
indeholder en eller flere domæneindekskolonner, så denne erklæring udfører den relevante rutine til opdatering af indextype. -
Du kan ikke opdatere rækker i en skrivebeskyttet materialiseret visning. Hvis du opdaterer rækker i en skrivbar materialiseret visning, opdaterer databasen rækkerne fra den underliggende containertabel. Opdateringerne overskrives dog ved den næste opdateringsoperation. Hvis du opdaterer rækker i en opdateret materialiseret visning, der er en del af en materialiseret visningsgruppe, opdaterer databasen også de tilsvarende rækker i mastertabellen.
Se Også:
-
Oracle Data Cartridge Developer’s Guide for mere information om indextype-opdateringsrutinerne
-
CREATE MATERIALIZED VIEW for information on oprettelse af opdaterbare materialiserede visninger
PARTITION | SUBPARTITION
Angiv navnet på partitionen eller underopdelingen inden for table
målrettet mod opdateringer. Du behøver ikke angive partitionsnavnet, når du opdaterer værdier i en partitioneret tabel. I nogle tilfælde kan det dog være mere effektivt at specificere partitionsnavnet end en kompliceret where_clause
.
Se også:
“Henvisning til partitionerede tabeller og indekser” og “Opdatering af en partition: Eksempel”
dblink
Angiv et komplet eller delvist navn på et databaselink til en ekstern database, hvor t objektet er placeret. Du kan kun bruge et databaselink til at opdatere et eksternt objekt, hvis du bruger Oracle Database-distribueret funktionalitet.
Hvis du udelader dblink,
, antager databasen, at objektet er på den lokale database.
Se også:
“Henvisning til objekter i eksterne databaser” for information om henvisning til databaselinks
subquery_restriction_clause
Brug subquery_restriction_clause
til at begrænse underforespørgslen på en af følgende måder:
KUN MED LÆS Angiv WITH READ ONLY
for at angive, at tabellen eller visningen ikke kan opdateres.
MED KONTROLMULIGHED Angiv WITH CHECK OPTION
for at indikere, at Oracle Database forbyder ændringer i tabellen eller visningen, der ville producere rækker, der ikke er inkluderet i underforespørgslen. Når den bruges i underforespørgslen af en DML-sætning, kan du specificere denne klausul i en underforespørgsel i FROM
-klausulen, men ikke i underforespørgslen i WHERE
klausul.
CONSTRAINT-begrænsning Angiv navnet på CHECK OPTION
-begrænsningen. Hvis du udelader denne identifikator, tildeler Oracle automatisk begrænsningen et navn på formularen SYS_C
n
, hvor n er et heltal, der gør begrænsningsnavn, der er unikt i databasen.
Se også:
“Brug af WITH CHECK OPTION-klausulen: Eksempel”
table_collection_expression
The table_collection_expression
lader dig informere Oracle om, at værdien af collection_expression
skal behandles som en tabel med henblik på forespørgsler og DML-operationer. collection_expression
kan være en underforespørgsel, en kolonne, en funktion eller en samlingskonstruktør. Uanset dens form skal den returnere en samlingsværdi – det vil sige en værdi, hvis type er indlejret tabel eller varray. Denne proces med at udtrække elementerne i en samling kaldes samling undesting.
Det valgfri plus (+) er relevant, hvis du deltager i TABLE
-udtrykket med overordnet bord. + Opretter en ydre sammenføjning af de to, så forespørgslen returnerer rækker fra den ydre tabel, selvom samleudtrykket er nul.
Bemærk:
I tidligere udgivelser af Oracle, når collection_expression
var en underforespørgsel, blev table_collection_expression
udtrykt som THE
subquery
.Denne brug er nu udfaset.
Du kan bruge en table_collection_expression
til at opdatere rækker i en tabel baseret på rækker fra en anden tabel. For eksempel kan du rulle fire kvartalsvise salgstabeller op i en årlig salgstabel.
t_alias
Angiv et korrelationsnavn (alias) for den tabel, visning eller underforespørgsel, der skal henvises til andetsteds i erklæringen. Dette alias kræves, hvis DML_table_expression_clause
refererer til objekttypeattributter eller objekttypemetoder.
Se også:
“Korreleret opdatering: Eksempel “
Begrænsninger for DML_table_expression_clause Denne klausul er underlagt følgende begrænsninger:
-
Du kan ikke udføre denne erklæring, hvis
table
eller basistabellen iview
indeholder domæneindeks markeretIN_PROGRESS
ellerFAILED
. -
Du kan ikke indsætte i en partition, hvis nogen berørte indekspartitioner er markeret
UNUSABLE
. -
Du kan ikke angive
order_by_clause
i underforespørgslen tilDML_table_expression_clause
. -
Hvis du angiver et indeks, indekspartition eller indeksunderpartition, der er markeret
UNUSABLE
, mislykkes udsagnetUPDATE
, medmindreSKIP_UNUSABLE_INDEXES
sessionsparameter er indstillet tilTRUE
.
Se også:
ALTER SESSION for information om SKIP_UNUSABLE_INDEXES
sessionsparameter
update_set_clause
update_set_clause
giver dig mulighed for at indstille kolonneværdier.
kolonne
Angiv navnet på en kolonne for det objekt, der skal opdateres. Hvis du udelader en kolonne i tabellen fra update_set_clause
, forbliver kolonnens værdi uændret.
Hvis column
henviser til en LOB-objektattribut, så skal du først initialisere den med værdien tom eller null. Du kan ikke opdatere det med en bogstavelig. Hvis du også opdaterer en LOB-værdi ved hjælp af en anden metode end en direkte UPDATE
SQL-sætning, skal du først låse rækken, der indeholder LOB. Se for_update_clause for at få flere oplysninger.
Hvis column
er en del af partitioneringsnøglen i en partitioneret tabel, så UPDATE
mislykkes, hvis du ændrer en værdi i kolonnen, der flytter rækken til en anden partition eller underpartition, medmindre du aktiverer rækkebevægelse. Der henvises til row_movement_clause
i CREATE TABLE eller ALTER TABLE.
Hvis column
desuden er en del af partitioneringsnøgle til en listepartitioneret tabel, så UPDATE
mislykkes, hvis du angiver en værdi for kolonnen, der ikke allerede findes i partition_value
liste over en af partitionerne.
underforespørgsel
Angiv en underforespørgsel, der returnerer nøjagtigt en række for hver opdaterede række.
-
Hvis du angiver kun en kolonne i
update_set_clause
, så kan underforespørgslen kun returnere en værdi. -
Hvis du angiver flere kolonner i
update_set_clause
, så skal underforespørgslen returnere så mange værdier, som du har angivet kolonner. -
Hvis underforespørgslen returnerer ingen rækker, så kolonnen tildeles en null.
-
Hvis denne
subquery
henviser til eksterne objekter, såUPDATE
operation kan køre parallelt, så længe referencen ce sløjfer ikke tilbage til et objekt i den lokale database. Men hvissubquery
iDML_table_expression_clause
henviser til eksterne objekter, såUPDATE
operation kører serielt uden underretning.
Du kan bruge flashback_query_clause
i underforespørgslen til at opdatere table
med tidligere data. Se flashback_query_clause af SELECT
for mere information om denne klausul.
Se også:
-
VÆLG og “Brug af underforespørgsler”
-
parallel_clause i CREATE TABLE documentation
expr
Angiv et udtryk, der svarer til den nye værdi, der er tildelt den tilsvarende kolonne.
Se også:
Kapitel 6, “Udtryk” for syntaksen for expr
og “Opdatering af en objekttabel: Eksempel”
STANDARD Angiv DEFAULT
for at indstille kolonnen til den værdi, der tidligere er angivet som standard værdi for kolonnen. Hvis der ikke er angivet nogen standardværdi for den tilsvarende kolonne, indstiller databasen kolonnen til nul.
Begrænsning for opdatering til standardværdier Du kan ikke angive DEFAULT
du opdaterer en visning.
VALUE-klausul
VALUE
-klausulen giver dig mulighed for at specificere hele rækken i en objekttabel.
Begrænsning på VALUE-klausulen Du kan kun specificere denne klausul for en objekttabel.
Bemærk:
Hvis du indsætter strenglitteraler i en RAW
-kolonne, udfører Oracle Database under de efterfølgende forespørgsler en komplet tabel-scanning i stedet for at bruge et indeks, der muligvis findes i RAW
-kolonnen.
Se også:
“Opdatering af en objekttabel: Eksempel”
hvor_clause
where_clause
lader dig begrænse opdaterede rækker til dem, for hvilke den angivne condition
er sandt. Hvis du udelader denne klausul, opdaterer databasen alle rækker i tabellen eller visningen. Se kapitel 7, “Betingelser” for syntaksen for condition
.
where_clause
bestemmer rækkerne i hvilke værdier opdateres. Hvis du ikke angiver where_clause
, opdateres alle rækker. For hver række, der tilfredsstiller where_clause
, sættes kolonnerne til venstre for ligningsoperatoren (=) i update_set_clause
til værdierne af de tilsvarende udtryk til højre for operatøren. Udtrykkene evalueres, når rækken opdateres.
return_clause
Den returnerende klausul henter de rækker, der er påvirket af en DML-sætning. Du kan specificere denne klausul for tabeller og materialiserede visninger og for visninger med en enkelt basistabel.
Når du opererer på en enkelt række, en DML-sætning med en returning_clause
kan hente kolonneudtryk ved hjælp af den berørte række, række og REFs
til den berørte række og gemme dem i værtsvariabler eller PL / SQL-variabler.
Når du arbejder på flere rækker, en DML-sætning med returning_clause
gemmer værdier fra udtryk, rowids og REFs
, der involverer de berørte rækker i bindingsarrays.
expr Hvert element i expr
-listen skal være en gyldig udtrykssyntaks.
INN INTO
klausul angiver, at værdierne for de ændrede rækker skal gemmes i variablen (erne), der er specificeret i data_item
-listen.
data_item Hver data_item
er en værtsvariabel eller PL / SQL-variabel, der gemmer den hentede expr
-værdi.
For hvert udtryk i RETURNING
-listen skal du angive en tilsvarende typekompatibel PL / SQL-variabel eller værtsvariabel i INTO
liste.
Begrænsninger Følgende begrænsninger gælder for RETURNING
-klausulen:
-
expr
er begrænset som følger:-
For
UPDATE
ogDELETE
udsagn hverexpr
skal være et simpelt udtryk eller et samlet sæt samlet funktionsudtryk. Du kan ikke kombinere enkle udtryk og enkelt-sæt samlede funktionsudtryk i de sammereturning_clause
. ForINSERT
udsagn skal hverexpr
være et simpelt udtryk. Samlede funktioner understøttes ikke i enINSERT
-erklæringRETURNING
-klausul. -
Enkelt- indstil samlede funktionsudtryk kan ikke omfatte
DISTINCT
nøgleordet.
-
-
Hvis
expr
listen indeholder en primær nøglekolonne eller en andenNOT
NULL
kolonne, så mislykkes opdateringserklæringen, hvis tabellen har enBEFORE
UPDATE
udløser defineret på den. -
Du kan ikke angive
returning_clause
til en multitabel indsats. -
Du kan ikke bruge denne klausul med parallel DML eller med eksterne objekter.
-
Du kan ikke hente
LONG
-typer med denne klausul. -
Du kan ikke specificere denne klausul for en visning, hvor en
INSTEAD
OF
trigger er defineret.
Se også :
PL / SQL-bruger ” s Vejledning og reference for information om brug af BULK
COLLECT
klausul til at returnere flere værdier til samlingsvariabler
error_logging_clause
Error_logging_clause har samme adfærd i en UPDATE
udsagn, som den gør i en INSERT
udsagn. Se INSERT
udsagn error_logging_clause for at få flere oplysninger.
Se også:
“Indsættelse i en tabel med fejllogning: Eksempel”
Eksempler
Opdatering af en tabel: Eksempler Følgende erklæring giver nul provision til alle medarbejdere med jobbet SH_CLERK
:
UPDATE employees SET commission_pct = NULL WHERE job_id = "SH_CLERK";
Følgende udsagn fremmer Douglas Grant til manager i afdeling 20 med $ 1.000 hævning:
UPDATE employees SET job_id = "SA_MAN", salary = salary + 1000, department_id = 120 WHERE first_name||" "||last_name = "Douglas Grant";
Følgende udsagn øger lønnen til en medarbejder i employees
tabel i remote
-databasen:
UPDATE employees@remote SET salary = salary*1.1 WHERE last_name = "Baer";
Det næste eksempel viser følgende syntaktiske konstruktioner af UPDATE
udsagn:
-
Begge former for
update_set_clause
sammen i en enkelt erklæring -
En korreleret underforespørgsel
-
A
where_clause
for at begrænse de opdaterede rækker
Den foregående UPDATE
sætning udfører følgende handlinger:
-
Opdaterer kun de ansatte, der arbejder i Genève eller München (placering 2900 og 2700)
-
Sæt
department_id
for disse medarbejdere tildepartment_id
svarende til Bombay (location_id
2100) -
Indstiller hver medarbejders løn til 1,1 gange gennemsnitslønnen for deres afdeling
-
Indstiller hver medarbejders provision til 1,5 gange den gennemsnitlige provision for deres afdeling
Opdatering af en partition: Eksempel Følgende eksempel opdaterer værdier i en enkelt partition af sales
-tabellen:
UPDATE sales PARTITION (sales_q1_1999) s SET s.promo_id = 494 WHERE amount_sold > 1000;
Opdatering af en objekttabel: Eksempel Følgende udsagn opretter to objekttabeller, people_demo1
og people_demo2
, af people_typ
-objektet oprettet i tabel samlinger: eksempler. Eksemplet viser, hvordan man opdaterer en række med people_demo1
ved at vælge en række fra people_demo2
:
Eksemplet bruger VALUE
objektreferencefunktion i både SET
-sætningen og underforespørgslen.
Korreleret opdatering: Eksempel For et eksempel, der bruger en korreleret underforespørgsel til at opdatere indlejrede tabelrækker, se “Tabelsamlinger: Eksempler”.
Brug af RETURNING-klausulen under UPDATE: Eksempel Følgende eksempel returnerer værdier fra den opdaterede række og gemmer resultatet i PL / SQL-variabler bnd1
, bnd2
, bnd3
:
følgende eksempel viser, at du kan angive en samlet sæt samlet funktion i udtrykket for den returnerende klausul:
UPDATE employees SET salary = salary * 1.1 WHERE department_id = 100 RETURNING SUM(salary) INTO :bnd1;