UPDATE (Čeština)
Účel
Pomocí příkazu UPDATE
můžete změnit existující hodnoty v tabulce nebo v základní tabulce pohledu nebo hlavní tabulka materializovaného pohledu.
Další témata
-
Předpoklady
-
Syntaxe
-
Sémantika
-
Příklady
Předpoklady
Pro Pokud chcete aktualizovat hodnoty v tabulce, musí být tabulka ve vašem vlastním schématu, nebo musíte mít v tabulce oprávnění UPDATE
.
Aktualizace hodnoty v základní tabulce pohledu:
-
Musíte mít oprávnění
UPDATE
k objektu a -
Kdokoli vlastní schéma obsahující pohled, musí mít oprávnění
UPDATE
k objektu v základní tabulce.
Systémové oprávnění UPDATE
ANY
TABLE
také umožňuje aktualizovat hodnoty v libovolném tabulce nebo v základní tabulce jakéhokoli zobrazení.
Musíte mít také oprávnění SELECT
k objektu, který chcete aktualizovat, pokud:
-
Objekt je ve vzdálené databázi nebo
-
Inicializační parametr
SQL92_SECURITY
je nastaven naTRUE
a operaceUPDATE
odkazuje na sloupce tabulky, například na sloupce vwhere_clause
.
Syntaxe
aktualizace :: =
Popis obrázku update.gif
(DML_table_expression_clause :: =, update_set_clause :: =, where_clause :: =, returns_clause :: =, error_logging_clause :: =)
DML_table_expression_clause :: =
Popis ilustrace DML_table_expression_clause.gif
(subquery :: = – část SELECT, subquery_restriction_clause :: =, table_collection_expression :: =)
subquery_restriction_clause :: =
Popis obrázku subquery_restriction_clause.gif
table_collection_expression :: =
Popis ilustrace table_collection_expression.gif
update_set_clause :: =
Popis ilustrace update_set_clause. gif
where_clause :: =
Popis ilustrace where_clause.gif
návratu_clause :: =
Popis obrázku návratu_clause.gif
error_logging_clause :: =
Popis obrázku error_logging_clause.gif
Sémantika
nápověda
Upřesněte komentář který předává pokyny optimalizátoru při výběru plánu provádění příkazu.
Okamžitě za klíčové slovo UPDATE
můžete umístit paralelní nápovědu, která paralelizuje oba lhaní a operace UPDATE
.
Viz také:
-
Průvodce optimalizací výkonu databáze Oracle a “ Použití tipů „pro syntaxi a popis rad
-
Průvodce optimalizací výkonu databáze Oracle a koncepty Oracle Database pro podrobné informace o paralelním DML
DML_table_expression_clause
Klauzule ONLY
se vztahuje pouze na výběry dat. Zadejte ONLY
syntaxi, pokud je pohled v klauzuli UPDATE
pohled, který patří do hierarchie a nechcete aktualizovat řádky ze žádného jejích dílčích zobrazení.
Viz také:
„Omezení DML_table_expression_clause“ a „Aktualizace tabulky: příklady“
schéma
Určete schéma obsahující objekt, který má být aktualizován. Pokud vynecháte schema
, databáze předpokládá, že objekt je ve vašem vlastním schématu.
tabulka | zobrazit | materialized_view | subquery
Určete název tabulky, pohledu, materializovaného pohledu nebo sloupců vrácených poddotazem, které mají být aktualizovány. Vydání příkazu UPDATE
proti tabulce spustí jakékoli UPDATE
spouštěče spojené s tabulkou.
-
Pokud zadáte
view
, databáze aktualizuje základní tabulku pohledu.Nelze aktualizovat zobrazení kromě spouštěčůINSTEAD
OF
, pokud definující dotaz pohledu obsahuje jeden z následujících konstruktů:
operátor množiny ADISTINCT
operátor agregační nebo analytická funkce AGROUP
BY
,ORDER
BY
,MODEL
,CONNECT
BY
neboSTART
WITH
klauzule Výraz kolekce vSELECT
seznam Poddotaz vSELECT
seznamu Poddotaz označenýWITH READ ONLY
Spojení, až na několik výjimek , jak je dokumentováno v příručce Oracle Database Administrator’s Guide
-
Prostřednictvím pohledu nemůžete aktualizovat více než jednu základní tabulku.
-
Navíc, pokud pohled byl vytvořen pomocí
WITH
CHECK
, pak můžete pohled aktualizovat, pouze pokud výsledná data splňují definující dotaz pohledu. -
Pokud
table
nebo základní tabulkaview
obsahuje jeden nebo více sloupců indexu domény, pak tento příkaz provede příslušnou rutinu aktualizace typu indexu. -
Řádky nelze aktualizovat v materializovaném zobrazení jen pro čtení. Pokud aktualizujete řádky v zapisovatelném materializovaném zobrazení, pak databáze aktualizuje řádky z podkladové tabulky kontejneru. Aktualizace jsou však přepsány při další operaci obnovení. Pokud aktualizujete řádky v aktualizovatelném materializovaném pohledu, který je součástí skupiny materializovaného pohledu, pak databáze také aktualizuje odpovídající řádky v hlavní tabulce.
Viz Také:
-
Příručka pro vývojáře Oracle Data Cartridge pro více informací o rutinách aktualizace typu indexu
-
CREATE MATERIALIZED VIEW pro informace o vytváření aktualizovatelných materializovaných pohledů
PARTITION | SUBPARTITION
Zadejte název oddílu nebo podčásti v rámci table
cílené na aktualizace. Při aktualizaci hodnot v dělené tabulce nemusíte zadávat název oddílu. V některých případech však může být zadání názvu oddílu efektivnější než složitější where_clause
.
Viz také:
„Odkazy na rozdělené tabulky a indexy“ a „Aktualizace oddílu: příklad“
dblink
Upřesnit úplný nebo částečný název databázového odkazu na vzdálenou databázi, kde t objekt se nachází. Odkaz na databázi můžete použít k aktualizaci vzdáleného objektu, pouze pokud používáte distribuovanou funkčnost Oracle Database.
Pokud vynecháte dblink,
, pak databáze předpokládá, že objekt je v místní databázi.
Viz také:
„Odkazy na objekty ve vzdálených databázích“ pro informace o odkazování na odkazy na databázi
subquery_restriction_clause
Použijte subquery_restriction_clause
k omezení poddotazu jedním z následujících způsobů:
POUZE PRO ČTENÍ Určete WITH READ ONLY
k označení, že tabulku nebo pohled nelze aktualizovat.
S KONTROLA MOŽNOSTI Určete WITH CHECK OPTION
k označení, že Oracle Database zakazuje jakékoli změny v tabulce nebo pohledu, které by vedly řádky, které nejsou zahrnuty v poddotazu. Při použití v poddotazu příkazu DML můžete tuto klauzuli zadat v poddotazu v klauzuli FROM
, ale ne v poddotazu v WHERE
klauzule.
Omezení CONSTRAINT Zadejte název omezení CHECK OPTION
. Pokud tento identifikátor vynecháte, Oracle automaticky přiřadí omezení omezení ve tvaru SYS_C
n
, kde n je celé číslo, které dělá název omezení jedinečný v databázi.
Viz také:
„Použití klauzule WITH CHECK OPTION: Example“
table_collection_expression
table_collection_expression
umožňuje informovat společnost Oracle, že s hodnotou collection_expression
je třeba zacházet s operacemi dotazu a DML jako s tabulkou. collection_expression
může být poddotaz, sloupec, funkce nebo konstruktor kolekce. Bez ohledu na jeho formu musí vrátit hodnotu kolekce – tj. Hodnotu, jejíž typem je vnořená tabulka nebo varray. Tento proces extrakce prvků kolekce se nazývá unnesting kolekce.
Volitelné plus (+) je relevantní, pokud se připojujete k výrazu TABLE
s nadřazeným prvkem stůl. + Vytváří vnější spojení dvou, takže dotaz vrací řádky z vnější tabulky, i když je výraz kolekce null.
Poznámka:
V dřívějších verzích Oracle když collection_expression
byl poddotaz, table_collection_expression
byl vyjádřen jako THE
subquery
.Toto použití je nyní zastaralé.
Pomocí table_collection_expression
můžete aktualizovat řádky v jedné tabulce na základě řádků z jiné tabulky. Můžete například zahrnout čtyři čtvrtletní prodejní tabulky do roční prodejní tabulky.
t_alias
Zadejte korelační název (alias) pro tabulku, pohled nebo poddotaz, na který se bude odkazovat jinde v prohlášení. Tento alias je vyžadován, pokud DML_table_expression_clause
odkazuje na jakékoli atributy typu objektu nebo metody typu objektu.
Viz také:
„Související aktualizace: Příklad „
Omezení DML_table_expression_clause Na toto ustanovení se vztahují následující omezení:
-
Toto prohlášení nelze provést, pokud
table
nebo základní tabulkaview
obsahuje jakékoli indexy domén označenéIN_PROGRESS
neboFAILED
. -
Nelze vložit do oddílu, pokud jsou všechny postižené indexové oddíly označeny
UNUSABLE
. -
V poddotazu
DML_table_expression_clause
nemůžete zadatorder_by_clause
. -
Pokud zadáte index, oddíl indexu nebo pododdíl indexu, který byl označen
UNUSABLE
, pak příkazUPDATE
selže, pokudSKIP_UNUSABLE_INDEXES
parametr relace byl nastaven naTRUE
.
Viz také:
ALTER SESSION pro informace o SKIP_UNUSABLE_INDEXES
parametr relace
update_set_clause
update_set_clause
umožňuje nastavit hodnoty sloupců.
sloupec
Zadejte název sloupce objektu, který má být aktualizován. Pokud vynecháte sloupec tabulky z update_set_clause
, hodnota tohoto sloupce zůstane nezměněna.
Pokud column
odkazuje na atribut objektu LOB, pak jej musíte nejprve inicializovat s hodnotou empty nebo null. Nelze jej aktualizovat pomocí literálu. Pokud také aktualizujete hodnotu LOB pomocí jiné metody než přímého UPDATE
příkazu SQL, musíte nejprve uzamknout řádek obsahující LOB. Další informace naleznete v části for_update_clause.
Pokud je column
součástí klíče rozdělení tabulky rozdělené na tabulky, pak UPDATE
selže, pokud ve sloupci změníte hodnotu, která by přesunula řádek do jiného oddílu nebo podčásti, pokud nepovolíte pohyb řádku. Přečtěte si row_movement_clause
v CREATE TABLE nebo ALTER TABLE.
Navíc je-li column
součástí klíč rozdělení tabulky rozdělené na seznamy, pak UPDATE
selže, pokud zadáte hodnotu pro sloupec, která ještě v partition_value
seznam jednoho z oddílů.
poddotaz
Zadejte poddotaz, který vrací přesně jeden řádek pro každý aktualizovaný řádek.
-
Pokud v
update_set_clause
zadáte pouze jeden sloupec, pak poddotaz může vrátit pouze jednu hodnotu. -
Pokud v poli zadáte více sloupců
update_set_clause
, pak poddotaz musí vrátit tolik hodnot, kolik jste zadali sloupce. -
Pokud poddotaz nevrací žádné řádky, pak sloupci je přidělena hodnota null.
-
Pokud toto
subquery
odkazuje na vzdálené objekty, pakUPDATE
operace může běžet paralelně tak dlouho, dokud odkaz ce se nesmyčkuje zpět k objektu v místní databázi. Pokud všaksubquery
vDML_table_expression_clause
odkazuje na jakékoli vzdálené objekty, pakUPDATE
operace bude probíhat sériově bez upozornění.
Pomocí flashback_query_clause
v poddotazu můžete aktualizovat table
s minulými údaji. Další informace o této klauzuli najdete v části flashback_query_clause z SELECT
.
Viz také:
-
SELECT a „Používání poddotazů“
-
parallel_clause v dokumentaci CREATE TABLE
expr
Určete výraz, který vyřeší novou hodnotu přiřazenou příslušnému sloupci.
Viz také:
Kapitola 6 „Výrazy“ pro syntaxi a „Aktualizace tabulky objektů: příklad“
DEFAULT Určete DEFAULT
a nastavte sloupec na hodnotu dříve určenou jako výchozí hodnota pro sloupec. Pokud pro příslušný sloupec nebyla zadána žádná výchozí hodnota, databáze nastaví sloupec na hodnotu null.
Omezení při aktualizaci na výchozí hodnoty Nelze zadat DEFAULT
pokud aktualizujete zobrazení.
Klauzule VALUE
Klauzule VALUE
umožňuje zadat celý řádek tabulky objektů.
Omezení klauzule VALUE Tuto klauzuli můžete zadat pouze pro tabulku objektů.
Poznámka:
Pokud vložíte řetězcové literály do sloupce RAW
, pak během následujících dotazů provede Oracle Database úplnou kontrolu tabulky namísto použití jakéhokoli indexu, který by mohl existovat ve sloupci RAW
.
Viz také:
„Aktualizace tabulky objektů: Příklad“
where_clause
where_clause
umožňuje omezit řádky aktualizované na ty, pro které zadaný condition
je pravda. Pokud tuto klauzuli vynecháte, databáze aktualizuje všechny řádky v tabulce nebo zobrazení. Syntaxi condition
naleznete v kapitole 7 „Podmínky“.
where_clause
určuje řádky v které hodnoty jsou aktualizovány. Pokud nezadáte where_clause
, aktualizují se všechny řádky. Pro každý řádek, který splňuje where_clause
, jsou sloupce nalevo od operátoru rovnosti (=) v update_set_clause
nastaveny na hodnoty odpovídajících výrazů vpravo od operátora. Výrazy se vyhodnocují při aktualizaci řádku.
returns_clause
Vracící klauzule načte řádky ovlivněné příkazem DML. Tuto klauzuli můžete zadat pro tabulky a materializovaná zobrazení a pro zobrazení s jednou základní tabulkou.
Při práci na jednom řádku je příkaz DML s returning_clause
může načíst výrazy sloupců pomocí ovlivněného řádku, řádku a REFs
do ovlivněného řádku a uložit je do hostitelských proměnných nebo proměnných PL / SQL.
Při práci na více řádků, příkaz DML s returning_clause
ukládá hodnoty z výrazů, řádků a REFs
zahrnujících ovlivněné řádky v polích vazeb.
expr Každá položka v seznamu expr
musí být platná syntaxe výrazu.
DO INTO
označuje, že hodnoty změněných řádků mají být uloženy v proměnných uvedených v seznamu data_item
.
data_item each data_item
je hostitelská proměnná nebo proměnná PL / SQL, která ukládá načtenou expr
hodnotu.
Pro každý výraz v seznamu RETURNING
musíte v INTO
seznam.
Omezení Na klauzuli RETURNING
se vztahují následující omezení:
-
The
expr
je omezeno následovně:-
Pro
UPDATE
aDELETE
každý příkazexpr
musí být jednoduchý výraz nebo výraz s jednou agregovanou funkcí. Ve stejnémreturning_clause
nelze kombinovat jednoduché výrazy a výrazy agregované funkce s jednou sadou. U příkazůINSERT
musí být každýexpr
jednoduchý výraz. Agregační funkce nejsou v klauzuliINSERT
RETURNING
podporovány. -
Single- výrazy sady agregovaných funkcí nemohou obsahovat klíčové slovo
DISTINCT
.
-
-
Pokud obsahuje sloupec primárního klíče nebo jiný
NOT
NULL
sloupec, pak se aktualizační příkaz nezdaří, pokud má tabulka aBEFORE
UPDATE
v něm definovaný spouštěč. -
Nelze zadat
returning_clause
pro mnohostrannou vložku. -
Tuto klauzuli nelze použít s paralelním DML nebo se vzdálenými objekty.
-
S touto klauzulí nelze načíst
LONG
typy. -
Tuto klauzuli nemůžete určit pro pohled, na který byl definován
INSTEAD
OF
spouštěč.
Viz také :
Uživatel PL / SQL “ s Guide and Reference for information on using the BULK
COLLECT
klauzule k vrácení více hodnot do proměnných kolekce
error_logging_clause
Error_logging_clause se chová v příkazu UPDATE
stejně jako v příkazu INSERT
. Další informace naleznete v prohlášení INSERT
error_logging_clause.
Viz také:
„Vkládání do tabulky s protokolováním chyb: Příklad“
Příklady
Aktualizace tabulky: Příklady Následující prohlášení dává nulové provize všem zaměstnancům s úkolem SH_CLERK
:
UPDATE employees SET commission_pct = NULL WHERE job_id = "SH_CLERK";
Následující prohlášení povýší Douglase Granta na manažera oddělení 20 s navýšením o 1 000 $:
UPDATE employees SET job_id = "SA_MAN", salary = salary + 1000, department_id = 120 WHERE first_name||" "||last_name = "Douglas Grant";
Následující prohlášení zvyšuje plat zaměstnance v employees
tabulka v databázi remote
:
UPDATE employees@remote SET salary = salary*1.1 WHERE last_name = "Baer";
Následující příklad ukazuje následující syntaktické konstrukty UPDATE
prohlášení:
-
Obě formy
update_set_clause
společně v jednom prohlášení -
Korelovaný poddotaz
-
A
where_clause
k omezení aktualizovaných řádků
Předchozí příkaz UPDATE
provádí následující operace:
-
Aktualizuje pouze ty zaměstnance, kteří pracují v Ženevě nebo Mnichově (pobočky 2900 a 2700)
-
Nastaví
department_id
pro tyto zaměstnancedepartment_id
odpovídající Bombaji (location_id
2100) -
Nastaví plat každého zaměstnance na 1,1násobek průměrného platu jeho oddělení
-
Nastaví provizi každého zaměstnance na 1,5násobek průměrné provize jeho oddělení
Aktualizace oddílu: Příklad Následující příklad aktualizuje hodnoty v jednom oddílu sales
tabulky:
UPDATE sales PARTITION (sales_q1_1999) s SET s.promo_id = 494 WHERE amount_sold > 1000;
Aktualizace tabulky objektů: Příklad Následující příkaz vytvoří dvě tabulky objektů, people_demo1
a people_demo2
objektu people_typ
vytvořeného v kolekcích tabulek: Příklady. Příklad ukazuje, jak aktualizovat řádek people_demo1
výběrem řádku z people_demo2
:
Příklad používá VALUE
referenční funkce objektu v klauzuli SET
i v poddotazu.
Korelovaná aktualizace: Příklad Příklad, který používá korelovaný poddotaz k aktualizaci vnořených řádků tabulky, viz „Kolekce tabulek: příklady“.
Použití klauzule RETURNING během UPDATE: Příklad Následující příklad vrací hodnoty z aktualizovaného řádku a uloží výsledek do PL / Proměnné SQL bnd1
, bnd2
, bnd3
:
následující příklad ukazuje, že můžete zadat agregovanou funkci s jednou sadou ve výrazu vracející se klauzule:
UPDATE employees SET salary = salary * 1.1 WHERE department_id = 100 RETURNING SUM(salary) INTO :bnd1;