OPPDATERING
Formål
Bruk setningen UPDATE
for å endre eksisterende verdier i en tabell eller i basistabellen for en visning eller hovedtabellen for en materialisert visning.
Ytterligere emner
-
Forutsetninger
-
Syntaks
-
Semantics
-
Eksempler
Forutsetninger
For for å oppdatere verdier i en tabell, må tabellen være i ditt eget skjema, eller du må ha UPDATE
objektrettighet på bordet.
For at du skal oppdatere verdier i basistabellen for en visning:
-
Du må ha
UPDATE
objektrettighet på visningen, og -
Den som eier skjemaet som inneholder visningen, må ha
UPDATE
objektrettighet på basetabellen.
UPDATE
ANY
TABLE
systemrettighet lar deg også oppdatere verdier i alle bord eller i bunnbordet av hvilken som helst visning.
Du må også ha SELECT
objektrettighet på objektet du vil oppdatere hvis:
-
Objektet er i en ekstern database eller
-
SQL92_SECURITY
initialiseringsparameteren er satt tilTRUE
ogUPDATE
-operasjonen refererer til tabellkolonner, for eksempel kolonnene i enwhere_clause
.
Syntaks
oppdatering :: =
Beskrivelse av illustrasjonen update.gif
(DML_table_expression_clause :: =, update_set_clause :: =, where_clause :: =, returner_clause :: =, error_logging_clause :: =)
DML_table_expression_clause :: =
Beskrivelse av illustrasjonen DML_table_expression_clause.gif
(underforespørsel :: = – del av SELECT, subquery_restriction_clause :: =, table_collection_expression :: =)
subquery_restriction_clause :: =
Beskrivelse av illustrasjonen subquery_restriction_clause.gif
table_collection_expression :: =
Beskrivelse av illustrasjonen table_collection_expression.gif
update_set_clause :: =
Beskrivelse av illustrasjonen update_set_clause. gif
where_clause :: =
Beskrivelse av illustrasjonen where_clause.gif
retur_clause :: =
Beskrivelse av illustrasjonen returner_clause.gif
error_logging_clause :: =
Beskrivelse av illustrasjonen error_logging_clause.gif
Semantikk
hint
Spesifiser en kommentar som sender instruksjoner til optimalisereren om å velge en utførelsesplan for uttalelsen.
Du kan plassere et parallelt hint umiddelbart etter UPDATE
søkeordet for å parallellisere begge de under liggende skanning og UPDATE
operasjoner.
Se også:
-
Oracle Database Performance Tuning Guide and » Bruk av hint «for syntaksen og beskrivelsen av hint
-
Oracle Database Performance Tuning Guide og Oracle Database Concepts for detaljert informasjon om parallell DML
DML_table_expression_clause
ONLY
klausulen gjelder bare visninger. Spesifiser ONLY
syntaksen hvis visningen i UPDATE
-satsen er en visning som tilhører et hierarki og du ikke vil oppdatere rader fra noen av undervisningene.
Se også:
«Restriksjoner på DML_table_expression_clause» og «Oppdatering av en tabell: eksempler»
skjema
Spesifiser skjemaet som inneholder objektet som skal oppdateres. Hvis du utelater schema
, antar databasen at objektet er i ditt eget skjema.
tabell | visning | materialized_view | subquery
Angi navnet på tabellen, visningen, materialiserte visningen eller kolonnene som returneres av et underspørsmål som skal oppdateres. Å utstede en UPDATE
uttalelse mot en tabell utløser alle UPDATE
utløsere tilknyttet tabellen.
-
Hvis du angir
view
, oppdaterer databasen basistabellen for visningen.Du kan ikke oppdatere en visning unntatt medINSTEAD
OF
utløser hvis den definerende spørringen i visningen inneholder en av følgende konstruksjoner:
En settoperator ADISTINCT
operator En samlet eller analytisk funksjon AGROUP
BY
,ORDER
BY
,MODEL
,CONNECT
BY
, ellerSTART
WITH
ledd Et samlingsuttrykk i enSELECT
liste Et delspørring i enSELECT
liste Et delspørsmål betegnetWITH READ ONLY
Blir med, med noen unntak , som dokumentert i Oracle Database Administrator’s Guide
-
Du kan ikke oppdatere mer enn en basetabell gjennom en visning.
-
I tillegg, hvis visningen ble opprettet med
WITH
CHECK
, så kan du bare oppdatere visningen hvis de resulterende dataene tilfredsstiller visningens definerende spørsmål. -
Hvis
table
eller basistabellen tilview
inneholder en eller flere domeneindekskolonner, så utfører denne setningen den aktuelle oppdateringsrutinen for innekstype. -
Du kan ikke oppdatere rader i en skrivebeskyttet materialvisning. Hvis du oppdaterer rader i en skrivbar materialisert visning, oppdaterer databasen radene fra den underliggende containertabellen. Oppdateringene blir imidlertid overskrevet ved neste oppdateringsoperasjon. Hvis du oppdaterer rader i en oppdaterbar materialisert visning som er en del av en materialisert visningsgruppe, oppdaterer databasen også de tilsvarende radene i mastertabellen.
Se Også:
-
Oracle Data Cartridge Developer’s Guide for mer informasjon om oppdateringsrutinene for uavhengig type
-
CREATE MATERIALIZED VIEW for informasjon om lage oppdaterbare materialiserte visninger
PARTITION | DELING
Spesifiser navnet på partisjonen eller underpartisjonen i table
målrettet for oppdateringer. Du trenger ikke spesifisere partisjonsnavnet når du oppdaterer verdier i en partisjonert tabell. I noen tilfeller kan det imidlertid være mer effektivt å spesifisere partisjonsnavnet enn en komplisert where_clause
.
Se også:
«Henvisning til partisjonerte tabeller og indekser» og «Oppdatering av en partisjon: Eksempel»
dblink
Spesifiser et helt eller delvis navn på en databasekobling til en ekstern database der t objektet er lokalisert. Du kan bare bruke en databasekobling til å oppdatere et eksternt objekt hvis du bruker Oracle Database-distribuert funksjonalitet.
Hvis du utelater dblink,
, antar databasen at objektet er på den lokale databasen.
Se også:
«Henvisning til objekter i eksterne databaser» for informasjon om henvisning til databasekoblinger
subquery_restriction_clause
Bruk subquery_restriction_clause
for å begrense underforespørselen på en av følgende måter:
MED LES KUN Angi WITH READ ONLY
for å indikere at tabellen eller visningen ikke kan oppdateres.
MED CHECK-ALTERNATIV Spesifiser WITH CHECK OPTION
for å indikere at Oracle Database forbyder endringer i tabellen eller visningen som vil produsere rader som ikke er inkludert i undersøket. Når det brukes i undersøket til en DML-setning, kan du spesifisere denne klausulen i en underspørsel i FROM
klausulen, men ikke i underspørringen i WHERE
paragraf.
CONSTRAINT-begrensning Angi navnet på CHECK OPTION
-begrensningen. Hvis du utelater denne identifikatoren, tildeler Oracle automatisk begrensningen et navn på skjemaet SYS_C
n
, der n er et heltall som gjør begrensningsnavn unikt i databasen.
Se også:
«Bruk av WITH CHECK OPTION-klausulen: Eksempel»
table_collection_expression
The table_collection_expression
lar deg informere Oracle om at verdien til collection_expression
skal behandles som en tabell for spørsmål og DML-operasjoner. collection_expression
kan være et underspørring, en kolonne, en funksjon eller en samlekonstruktør. Uansett form, må den returnere en samlingsverdi – det vil si en verdi hvis type er nestet tabell eller variasjon. Denne prosessen med å trekke ut elementene i en samling kalles samling unnesting.
Det valgfrie pluss (+) er relevant hvis du blir med i TABLE
uttrykket med foreldrene bord. + Skaper en ytre sammenføyning av de to, slik at spørringen returnerer rader fra den ytre tabellen selv om samleuttrykket er null.
Merk:
I tidligere versjoner av Oracle, når collection_expression
var et underforespørsel, ble table_collection_expression
uttrykt som THE
subquery
.Denne bruken er nå avviklet.
Du kan bruke en table_collection_expression
for å oppdatere rader i en tabell basert på rader fra en annen tabell. For eksempel kan du rulle opp fire kvartalsvise salgstabeller til en årlig salgstabell.
t_alias
Angi et korrelasjonsnavn (alias) for tabellen, visningen eller underspørringen som det skal refereres til andre steder i uttalelsen. Dette aliaset kreves hvis DML_table_expression_clause
refererer til objekttypeattributter eller objekttypemetoder.
Se også:
«Korrelert oppdatering: Eksempel «
Begrensninger for DML_table_expression_clause Denne paragrafen er underlagt følgende begrensninger:
-
Du kan ikke utføre denne setningen hvis
table
eller basistabellen tilview
inneholder eventuelle domeneindekser merketIN_PROGRESS
ellerFAILED
. -
Du kan ikke sette inn i en partisjon hvis noen berørte indekspartisjoner er merket
UNUSABLE
. -
Du kan ikke spesifisere
order_by_clause
i undersøket tilDML_table_expression_clause
. -
Hvis du spesifiserer en indeks, indekspartisjon eller indeksunderdeling som er merket
UNUSABLE
, vilUPDATE
-utsagnet mislykkes med mindreSKIP_UNUSABLE_INDEXES
øktparameter er satt tilTRUE
.
Se også:
ALTER SESSION for informasjon om SKIP_UNUSABLE_INDEXES
øktparameter
update_set_clause
update_set_clause
lar deg angi kolonneverdier.
kolonne
Angi navnet på en kolonne for objektet som skal oppdateres. Hvis du utelater en kolonne i tabellen fra update_set_clause
, forblir verdien til den kolonnen uendret.
Hvis column
refererer til et LOB-objektattributt, så må du først initialisere det med verdien tom eller null. Du kan ikke oppdatere den med en bokstavelig. Også, hvis du oppdaterer en LOB-verdi ved hjelp av en annen metode enn en direkte UPDATE
SQL-setning, må du først låse raden som inneholder LOB. Se for_update_clause for mer informasjon.
Hvis column
er en del av partisjoneringsnøkkelen til en partisjonert tabell, så UPDATE
mislykkes hvis du endrer en verdi i kolonnen som vil flytte raden til en annen partisjon eller underpartisjon, med mindre du aktiverer radbevegelse. Vennligst referer til row_movement_clause
av CREATE TABLE eller ALTER TABLE.
I tillegg, hvis column
er en del av partisjoneringsnøkkel i en listepartisjonert tabell, vil UPDATE
mislykkes hvis du angir en verdi for kolonnen som ikke allerede finnes i partition_value
liste over en av partisjonene.
delspørring
Angi et delspørring som returnerer nøyaktig en rad for hver oppdaterte rad.
-
Hvis du bare angir en kolonne i
update_set_clause
, så kan undersøket bare returnere en verdi. -
Hvis du spesifiserer flere kolonner i
update_set_clause
, så må spørringen returnere så mange verdier som du har angitt kolonner. -
Hvis underspørringen returnerer ingen rader, så kolonnen er tildelt en null.
-
Hvis denne
subquery
refererer til eksterne objekter, såUPDATE
operasjon kan kjøre parallelt så lenge referansen ce løper ikke tilbake til et objekt i den lokale databasen. Imidlertid, hvissubquery
iDML_table_expression_clause
refererer til eventuelle eksterne objekter, såUPDATE
operasjonen vil kjøre serielt uten varsel.
Du kan bruke flashback_query_clause
i undersøket for å oppdatere table
med tidligere data. Se flashback_query_clause av SELECT
for mer informasjon om denne paragrafen.
Se også:
-
VELG og «Bruke underforespørsler»
-
parallel_clause i CREATE TABLE documentation
expr
Angi et uttrykk som svarer til den nye verdien som er tilordnet den tilsvarende kolonnen.
Se også:
Kapittel 6, «Uttrykk» for syntaksen til expr
og «Oppdatering av en objekttabell: Eksempel»
STANDARD Angi DEFAULT
for å sette kolonnen til verdien som er angitt som standard verdi for kolonnen. Hvis det ikke er angitt noen standardverdi for den tilsvarende kolonnen, setter databasen kolonnen til null.
Begrensning for oppdatering til standardverdier Du kan ikke angi DEFAULT
hvis du oppdaterer en visning.
VALUE-klausul
VALUE
-klausulen lar deg spesifisere hele raden i en objekttabell.
Begrensning på VALUE-setningen Du kan bare spesifisere denne setningen for en objekttabell.
Merk:
Hvis du setter inn strenglitteraler i en RAW
-kolonne, vil Oracle Database under påfølgende spørsmål utføre en fullstendig tabellskanning i stedet for å bruke noen indeks som kan finnes i RAW
-kolonnen.
Se også:
«Oppdatere en objekttabell: Eksempel»
hvor_clause
where_clause
lar deg begrense radene som er oppdatert til de angitte condition
er sant. Hvis du utelater denne paragrafen, oppdaterer databasen alle radene i tabellen eller visningen. Se kapittel 7, «Betingelser» for syntaksen til condition
.
where_clause
bestemmer radene i hvilke verdier som oppdateres. Hvis du ikke spesifiserer where_clause
, oppdateres alle radene. For hver rad som tilfredsstiller where_clause
, blir kolonnene til venstre for likhetsoperatoren (=) i update_set_clause
satt til verdiene av de tilsvarende uttrykkene til høyre for operatøren. Uttrykkene blir evaluert etter hvert som raden oppdateres.
retur_klausul
Returklausulen henter radene som er berørt av en DML-setning. Du kan spesifisere denne klausulen for tabeller og materialiserte visninger og for visninger med en enkelt basetabell.
Når du opererer på en enkelt rad, en DML-setning med en returning_clause
kan hente kolonneuttrykk ved hjelp av den berørte raden, rowid og REFs
til den berørte raden og lagre dem i vertsvariabler eller PL / SQL-variabler.
Når du bruker flere rader, lagrer en DML-setning med returning_clause
verdier fra uttrykk, rowids og REFs
som involverer de berørte radene i bindingsarrayer.
expr Hvert element i expr
-listen må være en gyldig uttrykkssyntaks.
INN INTO
ledd indikerer at verdiene til de endrede radene skal lagres i variabelen (e) spesifisert i data_item
liste.
data_item Hver data_item
er en vertsvariabel eller PL / SQL-variabel som lagrer den hentede expr
-verdien.
For hvert uttrykk i RETURNING
-listen, må du angi en tilsvarende typekompatibel PL / SQL-variabel eller vertsvariabel i INTO
liste.
Begrensninger Følgende begrensninger gjelder for RETURNING
-klausulen:
-
expr
er begrenset som følger:-
For
UPDATE
ogDELETE
utsagn hverexpr
må være et enkelt uttrykk eller et enkelt sett samlet funksjonsuttrykk. Du kan ikke kombinere enkle uttrykk og enkeltsett samlede funksjonsuttrykk i sammereturning_clause
. ForINSERT
utsagn må hverexpr
være et enkelt uttrykk. Aggregerte funksjoner støttes ikke i enINSERT
uttalelseRETURNING
klausul. -
Enkelt- angitte samlede funksjonsuttrykk kan ikke inkludere
DISTINCT
søkeordet.
-
-
Hvis
expr
-listen inneholder en primærnøkkelkolonne eller annenNOT
NULL
-kolonne, så mislykkes oppdateringsuttalelsen hvis tabellen har enBEFORE
UPDATE
utløser definert på den. -
Du kan ikke spesifisere
returning_clause
for et multitasjonsinnlegg. -
Du kan ikke bruke denne paragrafen med parallell DML eller med eksterne objekter.
-
Du kan ikke hente
LONG
-typer med denne paragrafen. -
Du kan ikke spesifisere denne paragrafen for en visning som en
INSTEAD
OF
utløser er definert.
Se også :
PL / SQL-bruker » s Veiledning og referanse for informasjon om bruk av BULK
COLLECT
klausul for å returnere flere verdier til samlingsvariabler
error_logging_clause
Error_logging_clause har samme oppførsel i en UPDATE
uttalelse som den gjør i en INSERT
uttalelse. Se INSERT
utsagn error_logging_clause for mer informasjon.
Se også:
«Sette inn i en tabell med feillogging: Eksempel»
Eksempler
Oppdatere en tabell: Eksempler Følgende uttalelse gir null oppdrag til alle ansatte med jobben SH_CLERK
:
UPDATE employees SET commission_pct = NULL WHERE job_id = "SH_CLERK";
Følgende uttalelse promoterer Douglas Grant til leder avdeling 20 med $ 1000-økning:
UPDATE employees SET job_id = "SA_MAN", salary = salary + 1000, department_id = 120 WHERE first_name||" "||last_name = "Douglas Grant";
Følgende uttalelse øker lønnen til en ansatt i employees
tabellen i remote
-databasen:
UPDATE employees@remote SET salary = salary*1.1 WHERE last_name = "Baer";
Neste eksempel viser følgende syntaktiske konstruksjoner av UPDATE
uttalelse:
-
Begge former for
update_set_clause
sammen i en enkelt uttalelse -
Et korrelert underforespørsel
-
A
where_clause
for å begrense de oppdaterte radene
Den forrige UPDATE
uttalelsen utfører følgende operasjoner:
-
Oppdaterer bare de ansatte som jobber i Genève eller München (sted 2900 og 2700)
-
Sett
department_id
for disse ansatte tildepartment_id
som tilsvarer Bombay (location_id
2100) -
Angir lønn for hver ansatt til 1,1 ganger gjennomsnittlig lønn for avdelingen deres
-
Angir hver ansattes provisjon til 1,5 ganger gjennomsnittlig provisjon for deres avdeling
Oppdatering av en partisjon: Eksempel Følgende eksempel oppdaterer verdier i en enkelt partisjon av sales
-tabellen:
UPDATE sales PARTITION (sales_q1_1999) s SET s.promo_id = 494 WHERE amount_sold > 1000;
Oppdatering av en objekttabell: Eksempel Følgende utsagn oppretter to objekttabeller, people_demo1
og people_demo2
, av people_typ
-objektet opprettet i Tabellsamlinger: Eksempler. Eksemplet viser hvordan du oppdaterer en rad med people_demo1
ved å velge en rad fra people_demo2
:
Eksemplet bruker VALUE
objektreferansefunksjon i både SET
-satsen og underforespørselen.
Korrelert oppdatering: Eksempel For et eksempel som bruker et korrelert underforespørsel for å oppdatere nestede tabellrader, se «Tabellsamlinger: Eksempler».
Bruke RETURNING-klausulen under OPPDATERING: Eksempel Følgende eksempel returnerer verdier fra den oppdaterte raden og lagrer resultatet i PL / SQL-variabler bnd1
, bnd2
, bnd3
:
The følgende eksempel viser at du kan spesifisere en samlet sett aggregatfunksjon i uttrykket for den returnerende setningen:
UPDATE employees SET salary = salary * 1.1 WHERE department_id = 100 RETURNING SUM(salary) INTO :bnd1;