UPDATE (Polski)
Cel
Instrukcja UPDATE
służy do zmiany istniejących wartości w tabeli lub w tabeli bazowej widoku lub główna tabela zmaterializowanego widoku.
Dodatkowe tematy
-
Wymagania wstępne
-
Składnia
-
Semantyka
-
Przykłady
Wymagania wstępne
Dla Aby zaktualizować wartości w tabeli, tabela musi znajdować się w Twoim własnym schemacie lub musisz mieć uprawnienie UPDATE
do tabeli.
Aby zaktualizować wartości w tabeli bazowej widoku:
-
Musisz mieć uprawnienia obiektu
UPDATE
do widoku i -
Ktokolwiek jest właścicielem schematu zawierającego widok, musi mieć uprawnienie do obiektu
UPDATE
w tabeli podstawowej.
Uprawnienia systemowe UPDATE
ANY
TABLE
umożliwiają także aktualizowanie wartości w dowolnym stół lub w tabeli bazowej dowolnego widoku.
Musisz także mieć uprawnienie SELECT
do obiektu, który chcesz zaktualizować, jeśli:
-
Obiekt znajduje się w zdalnej bazie danych lub
-
Parametr inicjalizacji
SQL92_SECURITY
jest ustawiony naTRUE
i operacjaUPDATE
odwołuje się do kolumn tabeli, takich jak kolumny wwhere_clause
.
Składnia
update :: =
Opis ilustracji update.gif
(DML_table_expression_clause :: =, update_set_clause :: =, where_clause :: =, returning_clause :: =, error_logging_clause :: =)
DML_table_expression_clause :: =
Opis ilustracji DML_table_expression_clause.gif
(subquery :: = – część SELECT, subquery_restriction_clause :: =, table_collection_expression :: =)
subquery_restriction_clause :: =
Opis ilustracji subquery_restriction_clause.gif
table_collection_expression :: =
Opis ilustracji table_collection_expression.gif
update_set_clause :: =
Opis ilustracji update_set_clause. gif
where_clause :: =
Opis ilustracji where_clause.gif
returning_clause :: =
Opis ilustracji returning_clause.gif
error_logging_clause :: =
Opis ilustracji error_logging_clause.gif
Semantyka
wskazówka
Podaj komentarz który przekazuje instrukcje do optymalizatora dotyczące wyboru planu wykonania instrukcji.
Możesz umieścić równoległą wskazówkę bezpośrednio po słowie kluczowym UPDATE
, aby zrównoleglać oba elementy pod kłamliwe skanowanie i operacje UPDATE
.
Zobacz też:
-
Oracle Database Performance Tuning Guide i „ Korzystanie z podpowiedzi do składni i opisu wskazówek
-
Oracle Database Performance Tuning Guide i Oracle Database Concepts w celu uzyskania szczegółowych informacji na temat równoległego DML
DML_table_expression_clause
Klauzula ONLY
ma zastosowanie tylko do widoków. Określ składnię ONLY
, jeśli widok w klauzuli UPDATE
jest widokiem należącym do hierarchii i nie chcesz aktualizować wierszy z żadnej jego podglądów podrzędnych.
Zobacz także:
„Ograniczenia dotyczące DML_table_expression_clause” i „Aktualizacja tabeli: przykłady”
schemat
Określ schemat zawierający obiekt do aktualizacji. Jeśli pominiesz schema
, baza danych przyjmie, że obiekt znajduje się w Twoim własnym schemacie.
table | zobacz | materialized_view | subquery
Określ nazwę tabeli, widoku, widoku zmaterializowanego lub kolumn zwróconych przez podzapytanie do zaktualizowania. Wydanie instrukcji UPDATE
w odniesieniu do tabeli powoduje uruchomienie wszelkich wyzwalaczy UPDATE
związanych z tabelą.
-
Jeśli określisz
view
, baza danych zaktualizuje tabelę podstawową widoku.Nie można zaktualizować widoku, z wyjątkiem wyzwalaczyINSTEAD
OF
, jeśli zapytanie definiujące widok zawiera jedną z następujących konstrukcji:
Operator zbioru ADISTINCT
Operator Funkcja agregująca lub analityczna AGROUP
BY
,ORDER
BY
,MODEL
,CONNECT
BY
lubSTART
WITH
klauzula Wyrażenie kolekcji wSELECT
lista Podzapytanie naSELECT
liście Podzapytanie oznaczoneWITH READ ONLY
Łączy, z pewnymi wyjątkami , zgodnie z dokumentacją w Podręczniku administratora bazy danych Oracle Database
-
Nie można zaktualizować więcej niż jednej tabeli bazowej za pośrednictwem widoku.
-
Ponadto, jeśli widok został utworzony za pomocą
WITH
CHECK
, możesz zaktualizować widok tylko wtedy, gdy otrzymane dane spełniają zapytanie definiujące widok. -
Jeśli
table
lub tabela bazowaview
zawiera jedną lub więcej kolumn indeksu domeny, to ta instrukcja wykonuje odpowiednią procedurę aktualizacji typu indeksu. -
Nie można aktualizować wierszy w zmaterializowanym widoku tylko do odczytu. Jeśli zaktualizujesz wiersze w zapisywalnym widoku zmaterializowanym, baza danych zaktualizuje wiersze z podstawowej tabeli kontenera. Jednak aktualizacje są nadpisywane przy następnej operacji odświeżania. Jeśli zaktualizujesz wiersze w aktualizowanym widoku zmaterializowanym, który jest częścią grupy widoków zmaterializowanych, baza danych zaktualizuje również odpowiednie wiersze w tabeli głównej.
Zobacz Ponadto:
-
Podręcznik programisty Oracle Data Cartridge Developer, aby uzyskać więcej informacji na temat procedur aktualizacji typów indeksów
-
UTWÓRZ ZMATERIALIZOWANY WIDOK, aby uzyskać informacje na temat tworzenie widoków zmaterializowanych, które można aktualizować
PARTITION | SUBPARTITION
Określ nazwę partycji lub subpartycji w table
przeznaczone do aktualizacji. Nie musisz określać nazwy partycji podczas aktualizowania wartości w tabeli partycjonowanej. Jednak w niektórych przypadkach określenie nazwy partycji może być bardziej wydajne niż skomplikowane where_clause
.
Zobacz także:
„Odwoływanie się do podzielonych tabel i indeksów” oraz „Aktualizowanie partycji: przykład”
dblink
Określ pełna lub częściowa nazwa łącza do zdalnej bazy danych, gdzie t obiekt jest zlokalizowany. Możesz użyć łącza do bazy danych do zaktualizowania zdalnego obiektu tylko wtedy, gdy korzystasz z rozproszonej funkcjonalności Oracle Database.
Jeśli pominiesz dblink,
, baza danych przyjmie, że w lokalnej bazie danych.
Zobacz także:
„Referring to Objects in Remote Databases” (Odwołanie się do obiektów w zdalnych bazach danych) zawiera informacje na temat odwoływania się do linków do baz danych. p> Użyj subquery_restriction_clause
, aby ograniczyć podzapytanie na jeden z następujących sposobów:
TYLKO DO CZYTANIA Określ WITH READ ONLY
aby wskazać, że nie można zaktualizować tabeli lub widoku.
Z opcją wyboru Podaj WITH CHECK OPTION
, aby wskazać, że baza danych Oracle zabrania jakichkolwiek zmian w tabeli lub widoku, które spowodowałyby wiersze, które nie są uwzględnione w podzapytaniu. W przypadku użycia w podzapytaniu instrukcji DML można określić tę klauzulę w podzapytaniu w klauzuli FROM
, ale nie w podzapytaniu w WHERE
klauzula.
CONSTRAINT ograniczenie Określ nazwę ograniczenia CHECK OPTION
. Jeśli pominiesz ten identyfikator, Oracle automatycznie przypisze ograniczeniu nazwę formularza SYS_C
n
, gdzie n jest liczbą całkowitą, która daje nazwa ograniczenia unikalna w bazie danych.
Zobacz także:
„Korzystanie z klauzuli WITH CHECK OPTION: Przykład”
table_collection_expression
table_collection_expression
pozwala poinformować Oracle, że wartość collection_expression
powinna być traktowana jako tabela na potrzeby zapytań i operacji DML. collection_expression
może być podzapytaniem, kolumną, funkcją lub konstruktorem kolekcji. Niezależnie od swojej formy, musi zwrócić wartość kolekcji – to znaczy wartość, której typem jest zagnieżdżona tabela lub zmienna. Ten proces wyodrębniania elementów kolekcji nazywa się unnesting kolekcji.
Opcjonalny znak plus (+) jest istotny, jeśli łączysz wyrażenie TABLE
z elementem nadrzędnym stół. Znak + tworzy sprzężenie zewnętrzne tych dwóch, więc zapytanie zwraca wiersze z tabeli zewnętrznej, nawet jeśli wyrażenie kolekcji ma wartość null.
Uwaga:
We wcześniejszych wersjach Oracle, kiedy collection_expression
było podzapytaniem, table_collection_expression
zostało wyrażone jako THE
subquery
.To użycie jest teraz przestarzałe.
Możesz użyć table_collection_expression
, aby zaktualizować wiersze w jednej tabeli na podstawie wierszy z innej tabeli. Na przykład, możesz zebrać cztery kwartalne tabele sprzedaży w roczną tabelę sprzedaży.
t_alias
Określ nazwę korelacji (alias) dla tabeli, widoku lub podzapytania, do którego ma się odwoływać w innym miejscu oświadczenia. Ten alias jest wymagany, jeśli DML_table_expression_clause
odwołuje się do atrybutów typu obiektu lub metod typu obiektu.
Zobacz też:
„Skorelowana aktualizacja: przykład „
Ograniczenia dotyczące DML_table_expression_clause Ta klauzula podlega następującym ograniczeniom:
-
Nie możesz wykonać tej instrukcji, jeśli
table
lub tabela podstawowaview
zawiera wszelkie indeksy domen oznaczone jakoIN_PROGRESS
lubFAILED
. -
Nie możesz wstawić do partycji, jeśli jakiekolwiek partycje indeksu, których dotyczy problem, są oznaczone
UNUSABLE
. -
Nie możesz określić
order_by_clause
w podzapytaniuDML_table_expression_clause
. -
Jeśli określisz indeks, partycję indeksu lub partycję indeksu, która została oznaczona jako
UNUSABLE
, to instrukcjaUPDATE
zakończy się niepowodzeniem, chyba żeSKIP_UNUSABLE_INDEXES
parametr sesji został ustawiony naTRUE
.
Zobacz także:
ALTER SESSION, aby uzyskać informacje o SKIP_UNUSABLE_INDEXES
parametr sesji
update_set_clause
update_set_clause
pozwala ustawić wartości kolumn.
kolumna
Określ nazwę kolumny obiektu, który ma zostać zaktualizowany. Jeśli pominiesz kolumnę tabeli z update_set_clause
, wartość tej kolumny pozostanie niezmieniona.
Jeśli column
odnosi się do atrybutu obiektu LOB, następnie musisz najpierw zainicjować go wartością pustą lub null. Nie możesz zaktualizować go literałem. Ponadto, jeśli aktualizujesz wartość LOB przy użyciu innej metody niż bezpośrednia instrukcja UPDATE
SQL, musisz najpierw zablokować wiersz zawierający LOB. Aby uzyskać więcej informacji, zobacz for_update_clause.
Jeśli column
jest częścią klucza partycjonowania tabeli podzielonej na partycje, to UPDATE
zakończy się niepowodzeniem, jeśli zmienisz wartość w kolumnie, która spowodowałaby przeniesienie wiersza do innej partycji lub podpartycji, chyba że włączysz przenoszenie wiersza. Zapoznaj się z row_movement_clause
instrukcji CREATE TABLE lub ALTER TABLE.
Ponadto, jeśli column
jest częścią klucz partycjonowania tabeli podzielonej na listy, a następnie UPDATE
zakończy się niepowodzeniem, jeśli określisz wartość kolumny, która nie istnieje jeszcze w partition_value
lista jednej z partycji.
podzapytanie
Określ podzapytanie, które zwraca dokładnie jeden wiersz dla każdego zaktualizowanego wiersza.
-
Jeśli określisz tylko jedną kolumnę w
update_set_clause
, wówczas podzapytanie może zwrócić tylko jedną wartość. -
Jeśli określisz wiele kolumn w
update_set_clause
, to podzapytanie musi zwrócić tyle wartości, ile podałeś kolumn. -
Jeśli podzapytanie nie zwróci żadnych wierszy, wówczas kolumna ma przypisaną wartość null.
-
Jeśli ta
subquery
odnosi się do obiektów zdalnych, wówczasUPDATE
może działać równolegle, o ile odwołanie ce nie zapętla się z powrotem do obiektu w lokalnej bazie danych. Jeśli jednaksubquery
wDML_table_expression_clause
odnosi się do jakichkolwiek zdalnych obiektów, wówczasUPDATE
operacja będzie wykonywana seryjnie bez powiadomienia.
Możesz użyć flashback_query_clause
w podzapytaniu, aby zaktualizować table
z wcześniejszymi danymi. Więcej informacji na temat tej klauzuli można znaleźć w flashback_query_clause z SELECT
.
Zobacz także:
-
SELECT i „Using Subqueries”
-
parallel_clause w dokumentacji CREATE TABLE
wyrażenie
Podaj wyrażenie, które będzie tłumaczone na nową wartość przypisaną do odpowiedniej kolumny.
Zobacz też:
Rozdział 6, „Wyrażenia”, aby poznać składnię i „Aktualizacja tabeli obiektów: przykład”
DOMYŚLNIE Określ DEFAULT
, aby ustawić w kolumnie wartość określoną wcześniej jako domyślną wartość dla kolumny. Jeśli nie określono wartości domyślnej dla odpowiedniej kolumny, baza danych ustawia kolumnę na wartość null.
Ograniczenie aktualizacji do wartości domyślnych Nie można określić DEFAULT
, jeśli aktualizujesz widok.
Klauzula VALUE
Klauzula VALUE
pozwala określić cały wiersz tabeli obiektów.
Ograniczenie klauzuli VALUE Tę klauzulę można określić tylko dla tabeli obiektów.
Uwaga:
Jeśli wstawisz literały ciągów do kolumny RAW
, to podczas kolejnych zapytań Oracle Database przeprowadzi pełne skanowanie tabeli zamiast używać jakiegokolwiek indeksu, który może istnieć w kolumnie RAW
.
Zobacz też:
„Aktualizacja tabeli obiektów: przykład”
where_clause
where_clause
pozwala ograniczyć wiersze zaktualizowane do tych, dla których określony condition
jest prawdą. Jeśli pominiesz tę klauzulę, baza danych zaktualizuje wszystkie wiersze w tabeli lub widoku. Zapoznaj się z rozdziałem 7, „Warunki”, aby zapoznać się ze składnią condition
.
Element where_clause
określa wiersze w które wartości są aktualizowane. Jeśli nie określisz where_clause
, wszystkie wiersze zostaną zaktualizowane. Dla każdego wiersza spełniającego kryteria where_clause
, kolumny po lewej stronie operatora równości (=) w update_set_clause
są ustawiane na wartości odpowiednich wyrażeń po prawej stronie operatora. Wyrażenia są oceniane podczas aktualizacji wiersza.
returning_clause
Klauzula return pobiera wiersze, na które ma wpływ instrukcja DML. Możesz określić tę klauzulę dla tabel i widoków zmaterializowanych oraz dla widoków z pojedynczą tabelą podstawową.
Podczas działania na jednym wierszu instrukcja DML z returning_clause
może pobrać wyrażenia kolumnowe za pomocą odpowiedniego wiersza, identyfikatora wiersza i REFs
do odpowiedniego wiersza i zapisać je w zmiennych języka macierzystego lub zmiennych PL / SQL.
Podczas pracy na w wielu wierszach instrukcja DML z returning_clause
przechowuje wartości z wyrażeń, rzędów i REFs
obejmujących odpowiednie wiersze w tablicach powiązań.
wyrażenie Każda pozycja na liście expr
musi mieć prawidłową składnię wyrażenia.
INTO INTO
oznacza, że wartości zmienionych wierszy mają być przechowywane w zmiennych określonych na liście data_item
.
data_item Każdy data_item
to zmienna języka macierzystego lub zmienna PL / SQL, która przechowuje pobraną wartość expr
.
Dla każdego wyrażenia na liście RETURNING
należy określić odpowiednią zmienną PL / SQL lub zmienną języka macierzystego zgodną z typem w INTO
lista.
Ograniczenia Poniższe ograniczenia dotyczą klauzuli RETURNING
:
-
expr
podlega następującym ograniczeniom:-
For
UPDATE
iDELETE
instrukcje, każdaexpr
musi być prostym wyrażeniem lub wyrażeniem funkcji agregującej z pojedynczym zestawem. Nie można łączyć prostych wyrażeń i wyrażeń funkcji agregujących z jednym zestawem w tym samymreturning_clause
. W przypadku instrukcjiINSERT
każdeexpr
musi być prostym wyrażeniem. Funkcje agregujące nie są obsługiwane w klauzuliINSERT
RETURNING
. -
Single- wyrażenia funkcji agregujących nie mogą zawierać słowa kluczowego
DISTINCT
.
-
-
Jeśli zawiera kolumnę klucza podstawowego lub inną kolumnę
NOT
NULL
, to instrukcja aktualizacji kończy się niepowodzeniem, jeśli tabela zawiera zdefiniowany w nim wyzwalaczBEFORE
UPDATE
. -
Nie można określić
returning_clause
dla wstawki z wieloma tabelami. -
Nie możesz używać tej klauzuli z równoległym DML lub zdalnymi obiektami.
-
Nie możesz pobrać typów
LONG
z tą klauzulą. -
Nie możesz określić tej klauzuli dla widoku, w którym zdefiniowano wyzwalacz
INSTEAD
OF
.
Zobacz też :
PL / SQL Użytkownik ” s Przewodnik i dokumentacja zawierająca informacje na temat używania klauzuli BULK
COLLECT
do zwracania wielu wartości do zmiennych kolekcji
error_logging_clause
error_logging_clause zachowuje się tak samo w instrukcji UPDATE
, jak w instrukcji INSERT
. Więcej informacji można znaleźć w instrukcji INSERT
error_logging_clause.
Zobacz także:
„Wstawianie do tabeli z rejestrowaniem błędów: przykład”
Przykłady
Aktualizowanie tabeli: przykłady Poniższe oświadczenie daje zerowe prowizje wszystkim pracownikom na stanowisku SH_CLERK
:
UPDATE employees SET commission_pct = NULL WHERE job_id = "SH_CLERK";
Poniższe oświadczenie promuje Douglasa Granta na stanowisko kierownika działu 20 z podwyżką o 1000 USD:
UPDATE employees SET job_id = "SA_MAN", salary = salary + 1000, department_id = 120 WHERE first_name||" "||last_name = "Douglas Grant";
Poniższe oświadczenie zwiększa pensję pracownika w employees
tabela w bazie danych remote
:
UPDATE employees@remote SET salary = salary*1.1 WHERE last_name = "Baer";
Następny przykład przedstawia następujące konstrukcje składniowe UPDATE
:
-
Obie formy
update_set_clause
razem w jednej instrukcji -
Skorelowane podzapytanie
-
A
where_clause
w celu ograniczenia zaktualizowanych wierszy
Poprzednia instrukcja UPDATE
wykonuje następujące operacje:
-
Aktualizuje tylko tych pracowników, którzy pracują w Genewie lub Monachium (lokalizacje 2900 i 2700)
-
Ustawia
department_id
dla tych pracowników dodepartment_id
odpowiadającego Bombaju (location_id
2100) -
Ustawia wynagrodzenie każdego pracownika na 1,1-krotność średniej pensji jego działu
-
Ustawia prowizję każdego pracownika na 1,5-krotność średniej prowizji jego działu
Aktualizowanie partycji: przykład Poniższy przykład aktualizuje wartości w jednej partycji tabeli sales
:
UPDATE sales PARTITION (sales_q1_1999) s SET s.promo_id = 494 WHERE amount_sold > 1000;
Aktualizowanie tabeli obiektów: przykład Poniższa instrukcja tworzy dwie tabele obiektów, people_demo1
i people_demo2
, obiektu people_typ
utworzonego w Kolekcje tabel: Przykłady. Przykład pokazuje, jak zaktualizować wiersz people_demo1
, wybierając wiersz z people_demo2
:
W przykładzie zastosowano VALUE
funkcja odniesienia do obiektu zarówno w klauzuli SET
, jak i w podzapytaniu.
Skorelowana aktualizacja: przykład Przykład, który używa skorelowanego podzapytania do aktualizacji zagnieżdżonych wierszy tabeli, zapoznaj się z „Kolekcje tabel: Przykłady”.
Korzystanie z klauzuli RETURNING Podczas UPDATE: Przykład Poniższy przykład zwraca wartości ze zaktualizowanego wiersza i zapisuje wynik w PL / Zmienne SQL bnd1
, bnd2
, bnd3
:
Poniższy przykład pokazuje, że możesz określić funkcję agregującą z pojedynczym zestawem w wyrażeniu klauzuli zwracającej:
UPDATE employees SET salary = salary * 1.1 WHERE department_id = 100 RETURNING SUM(salary) INTO :bnd1;