本文鏈接:https://blog.csdn.net/GoldenKitten/article/details/84947386 以下內容為轉載以上博客,自己做了略微的補充,如需查看原文,請點擊上面的鏈接,指引到原博主的博客。
1 Oracle
1.1 Oracle簡介
ORACLE數據庫系統是美國ORACLE公司(甲骨文)提供的以分布式數據庫為核心的一組軟件產品,是目前最流行的客戶/服務器(CLIENT/SERVER)或B/S體系結構的數據庫之一。比如SilverStream就是基於數據庫的一種中間件。ORACLE數據庫是目前世界上使用最為廣泛的數據庫管理系統,作為一個通用的數據庫系統,它具有完整的數據管理功能;作為一個關系數據庫,它是一個完備關系的產品;作為分布式數據庫它實現了分布式處理]功能。但它的所有知識,只要在一種機型上學習了ORACLE知識,便能在各種類型的機器上使用它。
1.2 Oracle體系結構
它由至少一個表空間和數據庫模式對象組成。這里,模式是對象的集合,而模式對象是直接引用數據庫數據的邏輯結構。模式對象包括這樣一些結構:表、視圖、序列、存儲過程、同義詞、索引、簇和數據庫鏈等。邏輯存儲結構包括表空間、段和范圍,用於描述怎樣使用數據庫的物理空間。
總之,邏輯結構由邏輯存儲結構(表空間,段,范圍,塊)和邏輯數據結構(表、視圖、序列、存儲過程、同義詞、索引、簇和數據庫鏈等)組成,而其中的模式對象(邏輯數據結構)和關系形成了數據庫的關系設計。
段(Segment):是表空間中一個指定類型的邏輯存儲結構,它由一個或多個范圍組成,段將占用並增長存儲空間。
數據庫的物理存儲結構是由一些多種物理文件組成,主要有數據文件、控制文件、重做日志文件、歸檔日志文件、參數文件、口令文件、警告文件等。
控制文件:存儲實例、數據文件及日志文件等信息的二進制文件。alter system set control_files='路徑'。V$CONTROLFILE。
數據文件:存儲數據,以.dbf做后綴。一句話:一個表空間對多個數據文件,一個數據文件只對一個表空間。dba_data_files/v$datafile。
-
數據庫: Oracle數據庫是數據的物理存儲。這就包括(數據文件ORA或者DBF、控制文件、聯機日志、參數文件)。其實Oracle數據庫的概念和其它數據庫不一樣,這里的數據庫是一個操作系統只有一個庫。可以看作是Oracle就只有一個大數據庫。
-
實例: 一個Oracle實例(Oracle Instance)有一系列的后台進程(Backguound Processes)和內存結構(Memory Structures)組成。一個數據庫可以有n個實例。
-
用戶: 用戶是在實例下建立的。不同實例可以建相同名字的用戶。
-
表空間: 表空間是Oracle對物理數據庫上相關數據文件(ORA或者DBF文件)的邏輯映射。一個數據庫在邏輯上被划分成一到若干個表空間,每個表空間包含了在邏輯上相關聯的一組結構。每個數據庫至少有一個表空間(稱之為system表空間)。每個表空間由同一磁盤上的一個或多個文件組成,這些文件叫數據文件(datafile)。一個數據文件只能屬於一個表空間。
-
數據文件(dbf、ora): 數據文件是數據庫的物理存儲單位。數據庫的數據是存儲在表空間中的,真正是在某一個或者多個數據文件中。而一個表空間可以由一個或多個數據文件組成,一個數據文件只能屬於一個表空間。一旦數據文件被加入到某個表空間后,就不能刪除這個文件,如果要刪除某個數據文件,只能刪除其所屬於的表空間才行。
注: 表的數據,是由用戶放入某一個表空間的,而這個表空間會隨機把這些表數據放到一個或者多個數據文件中。
由於oracle的數據庫不是普通的概念,oracle是有用戶和表空間對數據進行管理和存放的。但是表不是有表空間去查詢的,而是由用戶去查的。因為不同用戶可以在同一個表空間建立同一個名字的表!這里區分就是用戶了!
1.3
DDL : 數據定義語言 create alter drop truncate DML : 數據操縱語言 insert update delete DCL : 數據控制語言 安全 授權 grant revoke DQL : 數據查詢語言 select from子句 where子句
1.3 Oracle常用操作
1.3.1 登錄
運行cmd進入命令行 Sqlplus 用戶名/密碼@ip地址:1521/orcl [as sysdba] 如果是超級管理員需要在用戶名/密碼后面加上 as sysdba,是以系統管理員的身份來登錄的 sqlplus sys/sys as sysdba; 如果是普通用戶不需要as sysdba sqlplus scott/tiger
1.3.2 查看當前連接數據庫的用戶
-- 只在sql plus中有效
show user
-- PL/SQL中使用下面的語句
select user from dual
1.3.3 用戶的切換
#切換為超級管理員 conn sys/sys as sysdba; #切換為普通用戶 conn scott/scott
1.3.4 查看用戶下的表
在用戶登錄的情況下輸入:select * from tab; 為了防止命令行中數據展示表格錯亂的情況可以設計行寬和列寬 set linesize 300; 每行展示300個字符 Col 列名 for a[數字],某一列占幾個字符
1.3.5 查看表結構
desc 表名;
1.3.6 創建表空間
表空間, ORACLE數據庫的邏輯單元。 數據庫—表空間 一個表空間可以與多個數據文件(物理結構)關聯,一個數據庫下可以建立多個表空間,一個表空間可以建立多個用戶、一個用戶下可以建立多個表。
create tablespace test1 datafile 'E:\test1.dbf' size 100m autoextend on
next 10m # test1 為表空間名稱 # datafile 指定表空間對應的數據文件 # size 后定義的是表空間的初始大小 # autoextend on 自動增長 ,當表空間存儲都占滿時,自動增長 # next 后指定的是一次自動增長的大小。
1.3.7 創建用戶
create user c##testuser identified by testuser default tablespace test1 # oracle12 用戶名必須以c##開頭 # identified by 后邊是用戶的密碼 # default tablespace 后邊是表空間名稱 # oracle數據庫與其它數據庫產品的區別在於,表和其它的數據庫對象都是存儲在用戶下的。
新創建用戶沒有任何權限,登錄會報錯:
Oracle中已存在三個重要的角色:connect角色,resource角色,dba角色。
CONNECT角色: --是授予最終用戶的典型權利,最基本的
ALTER SESSION --修改會話 CREATE CLUSTER --建立聚簇 CREATE DATABASE LINK --建立數據庫鏈接 CREATE SEQUENCE --建立序列 CREATE SESSION --建立會話 CREATE SYNONYM --建立同義詞 CREATE VIEW --建立視圖
RESOURCE角色: --是授予開發人員的
CREATE CLUSTER --建立聚簇 CREATE PROCEDURE --建立過程 CREATE SEQUENCE --建立序列 CREATE TABLE --建表 CREATE TRIGGER --建立觸發器 CREATE TYPE --建立類型
DBA角色:擁有全部特權,是系統最高權限,只有DBA才可以創建數據庫結構,並且系統權限也需要DBA授出,且DBA用戶可以操作全體用戶的任意基表,包括刪除
# 進入system用戶下給用戶賦予dba權限,否則無法正常登陸 grant dba to testuser
1.3.8 文件操作命令
start和@ 說明: 運行sql腳本 案例: sql>@ d:\a.sql或是sql>start d:\a.sql edit 說明: 該命令可以編輯指定的sql腳本 案例: sql>edit d:\a.sql,這樣會把d:\a.sql這個文件打開 spool 說明: 該命令可以將sql*plus屏幕上的內容輸出到指定文件中去。 案例: sql>spool d:\b.sql並輸入sql>spool off eg、 sql>spool d:\b.sql; sql>select * from emp; sql>spool off;
1.3.9 交互式命令
&說明:可以替代變量,而該變量在執行時,需要用戶輸入。 select * from emp where job='&job';
1.4 用戶管理
1.4.1 創建用戶
概述:在oracle中要創建一個新的用戶使用create user語句,一般是具有dba(數據庫管理員)的權限才能使用。
create user 用戶名 identified by 密碼;
注意:oracle有個毛病,密碼必須以字母開頭,如果以數字開頭,它不會創建用戶
create user xiaoming identified by oracle;
1.4.2 給用戶修改密碼
概述:如果給自己修改密碼可以直接使用SQL> password 用戶名或passw,如果給別人修改密碼則需要具有dba的權限,或是擁有alter user的系統權限 SQL> alter user 用戶名 identified by 新密碼
1.4.3 刪除用戶
概述:一般以dba的身份去刪除某個用戶,如果用其它用戶去刪除用戶則需要具有drop user的權限。 比如drop user 用戶名 【cascade】 注意:在刪除用戶時,如果要刪除的用戶,已經創建了表,那么就需要在刪除的時候帶一個參數cascade,即把該用戶及表一同刪除;1.4.4 權限
權限分為系統權限和對象權限。 何為系統權限?用戶對數據庫的相關權限,connect、resource、dba等系統權限,如建庫、建表、建索引、建存儲過程、登陸數據庫、修改密碼等。何為對象權限? 用戶對其他用戶的數據對象操作的權限,insert、delete、update、select、all等對象權限,數據對象有很多,比如表,索引,視圖,觸發器、存儲過程、包等。 執行SELECT * FROM Dba_Object_Size;語句可得到oracle數據庫對象。1.4.5 角色
角色分為預定義角色和自定義角色。1.4.6 用戶管理的綜合案例
概述:創建的新用戶是沒有任何權限的,甚至連登陸的數據庫的權限都沒有,需要為其指定相應的權限。給一個用戶賦權限使用命令grant,回收權限使用命令revoke。 為了講清楚用戶的管理,這里我給大家舉一個案例。SQL> conn xiaoming/oracle ERROR: ORA-01045: user XIAOMING lacks CREATE SESSION privilege; logon denied 警告: 您不再連接到 ORACLE。 SQL> show user USER 為 "" SQL> conn system/oracle 已連接。 SQL> grant connect to xiaoming; 授權成功。 SQL> conn xiaoming/oracle 已連接。
現在說下對象權限,現在要做這么件事情:
- 希望xiaoming用戶可以去查詢emp表
- 希望xiaoming用戶可以去查詢scott的emp表
grant select on scott.emp to xiaoming - 希望xiaoming用戶可以去修改scott的emp表
grant update on scott.emp to xiaoming - 希望xiaoming 用戶可以去修改/刪除,查詢,添加scott的emp表
grant all on scott.emp to xiaoming - scott希望收回xiaoming對emp表的查詢權限
revoke select on scott.emp from xiaoming
1.4.7 權限的傳遞
對權限的維護。 希望xiaoming用戶可以去查詢scott的emp表/還希望xiaoming可以把這個權限傳遞給別人。
如果是對象權限,就加入with grant option
grant select on emp to xiaoming with grant option 我的操作過程: SQL> conn scott/oracle; 已連接。 SQL> grant select on scott.emp to xiaoming with grant option; 授權成功。 SQL> conn system/oracle; 已連接。 SQL> create user xiaohong identified by oracle; 用戶已創建。 SQL> grant connect to xiaohong; 授權成功。 SQL> conn xiaoming/oracle; 已連接。 SQL> grant select on scott.emp to xiaohong; 授權成功。
如果是系統權限。 system給xiaoming權限時:grant connect to xiaoming with admin option 問題:如果scott把xiaoming對emp表的查詢權限回收,那么xiaohong會怎樣?
答案:被回收。 下面是我的操作過程:
SQL> conn scott/oracle; 已連接。 SQL> revoke select on emp from xiaoming; 撤銷成功。 SQL> conn xiaohong/oracle; 已連接。 SQL> select * from scott.emp; select * from scott.emp * 第 1 行出現錯誤: ORA-00942: 表或視圖不存在 結果顯示:小紅受到誅連了。。
with admin option與with grant option區別
- with admin option用於系統權限授權,with grant option用於對象授權。
- 給一個用戶授予系統權限帶上with admin option時,此用戶可把此系統權限授予其他用戶或角色,但收回這個用戶的系統權限時,這個用戶已經授予其他用戶或角色的此系統權限不會因傳播無效,如授予A系統權限create session with admin option,然后A又把create session權限授予B,但管理員收回A的create session權限時,B依然擁有create session的權限,但管理員可以顯式收回B create session的權限,即直接revoke create session from B. 而with grant option用於對象授權時,被授予的用戶也可把此對象權限授予其他用戶或角色,不同的是但管理員收回用with grant option授權的用戶對象權限時,權限會因傳播而失效,如grant select on table with grant option to A,A用戶把此權限授予B,但管理員收回A的權限時,B的權限也會失效,但管理員不可以直接收回B的SELECT ON TABLE 權限。
1.5 用戶口令管理
1.5.1 使用profile管理用戶口令
概述:profile是口令限制,資源限制的命令集合,當建立數據庫時,oracle會自動建立名稱為default的profile。當建立用戶沒有指定profile選項時,那么oracle就會將default分配給用戶。
1.5.2 賬戶鎖定
概述:指定該賬戶(用戶)登陸時最多可以輸入密碼的次數,也可以指定用戶鎖定的時間(天)一般用dba的身份去執行該命令。
例子:指定scott這個用戶最多只能嘗試3次登陸,鎖定時間為2天,讓我們看看怎么實現。
創建profile文件
SQL> create profile lock_account limit failed_login_attempts 3 password_lock_time 2; SQL> alter user scott profile lock_account;
1.5.3 給賬戶(用戶)解鎖
SQL> alter user scott account unlock;
1.5.4 終止口令
為了讓用戶定期修改密碼可以使用終止口令的指令來完成,同樣這個命令也需要dba的身份來操作。
例子:給前面創建的用戶test創建一個profile文件,要求該用戶每隔10天要修改自己的登陸密碼,寬限期為2天。看看怎么做。
SQL> create profile myprofile limit password_life_time 10 password_grace_time 2; SQL> alter user test profile myprofile;
1.5.5 口令歷史
概述:如果希望用戶在修改密碼時,不能使用以前使用過的密碼,可使用口令歷史,這樣oracle就會將口令修改的信息存放到數據字典中,這樣當用戶修改密碼時,oracle就會對新舊密碼進行比較,當發現新舊密碼一樣時,就提示用戶重新輸入密碼。
例子:
-
建立profile
SQL>create profile password_history limit password_life_time 10 password_grace_time 2 password_reuse_time 10 //password_reuse_time指定口令可重用時間即10天后就可以重用
-
分配給某個用戶
SQL> alter user test profile password_history; -
刪除profile
概述:當不需要某個profile文件時,可以刪除該文件。
SQL> drop profile password_history 【casade】注意:文件刪除后,用這個文件去約束的那些用戶通通也都被釋放了。。加了casade,就會把級聯的相關東西也給刪除掉
1.6 Oracle數據類型
常用的數據類型
| No | 數據類型 | 描述 |
|---|---|---|
| 1 | Varchar, varchar2 | 表示一個字符串 |
| 2 | NUMBER | Number(10,2):整數部分占 8 位,小數部分占2份 |
| 3 | DATE | 表示日期類型 |
| 4 | CLOB | 大對象,表示大文本數據類型,可存4G |
| 5 | BLOB | 大對象,表示二進制數據,可存4G |
- 字符類 char 長度固定,最多容納2000個字符。 例子:char(10) ‘小韓’前四個字符放‘小韓’,后添6個空格補全,如‘小韓 ’ varchar2(20) 長度可變,最多容納4000個字符。 例子:varchar2(10) ‘小韓’ oracle分配四個字符。這樣可以節省空間。 clob(character large object) 字符型大對象,最多容納4g char 查詢的速度極快浪費空間,適合查詢比較頻繁的數據字段。 varchar 節省空間
- 數字型 number范圍-10的38次方到10的38次方,可以表示整數,也可以表示小數 number(5,2)表示一位小數有5位有效數,2位小數;范圍:-999.99 到999.99 number(5)表示一個5位整數;范圍99999到-99999
- 日期類型 date 包含年月日和時分秒 oracle默認格式1-1月-1999 timestamp 這是oracle9i對date數據類型的擴展。可以精確到毫秒。
- 圖片 blob 二進制數據,可以存放圖片/聲音4g;一般來講,在真實項目中是不會把圖片和聲音真的往數據庫里存放,一般存放圖片、視頻的路徑,如果安全需要比較高的話,則放入數據庫。
1.7 表管理
1.7.1 建表
語法:
Create table 表名( 字段1 數據類型 [default 默認值], 字段2 數據類型 [default 默認值], ... 字段n 數據類型 [default 默認值] );
范例:創建person表
create table person( pid number(10), name varchar2(10), gender number(1) default 1, birthday date ); insert into person(pid, name, gender, birthday) values(1, '張三', 1, to_date('1999-12-22', 'yyyy-MM-dd'));
1.7.2 刪除表
DROP TABLE 表名;
1.7.3 修改表
在sql中使用alter可以修改表
- 添加語法:
-
ALTER TABLE 表名稱 ADD(列名1 類型 [DEFAULT 默認值],列名1 類型 [DEFAULT 默認值]…)
- 修改語法:
-
ALTER TABLE 表名稱 MODIFY(列名1 類型 [DEFAULT 默認值],列名1 類型 [DEFAULT 默認值]…)
- 修改列名:
-
ALTER TABLE 表名稱 RENAME COLUMN 列名1 TO 列名2
–添加一個字段
sql>alter table student add (classid number(2));
–修改一個字段的長度
sql>alter table student modify (xm varchar2(30));
–修改字段的類型或是名字(不能有數據) 不建議做
sql>alter table student modify (xm char(30));
–刪除一個字段 不建議做(刪了之后,順序就變了。加就沒問題,應該是加在后面)
sql>alter table student drop column sal;
–修改表的名字 很少有這種需求
sql>rename student to stu;
范例:在person表中增加列address
alter table person add(address varchar2(10));
范例:把person表的address列的長度修改成20長度
alter table person modify(address varchar2(20));
1.7.4 截斷表
在person表中使用delete語句刪除數據,則可以使用rollback來回滾,如果想要清空一張表的數據,同時不想回滾可以立即釋放資源需要使用截斷表的語法
語法:TRUNCATE TABLE 表名
范例:截斷person表
truncate table person;
1.8 表數據更新
1.8.1 INSERT
語法:
INSERT INTO表名[(列名1,列名2,…)]VALUES(值1,值2,…)
標准寫法
insert into person(pid,name,gender,birthday,addrress) values(1,'張三',1,'9-5月-1981','北京');
時候,想要將從其它表中選擇數據並將其插入另一個表中。要做到這一點,可使用Oracle INSERT INTO SELECT語句,如下所示:
INSERT INTO target_table (col1, col2, col3) SELECT col1, col2, col3 FROM source_table WHERE condition;
Oracle INSERT INTO SELECT語句要求源表和目標表匹配,有時我們可能希望將多行插入到一個或多個表中。 在這種情況下,就可以使用Oracle INSERT ALL語句,該語句也被稱為多項式插入語句。
Oracle提供了兩種類型的多項式插入語句:無條件的和有條件的。
無條件的Oracle INSERT ALL語句
將多行插入到表中,要將多行插入到表中,請使用以下Oracle INSERT ALL語句:
INSERT ALL INTO table_name(col1,col2,col3) VALUES(val1,val2, val3) INTO table_name(col1,col2,col3) VALUES(val4,val5, val6) INTO table_name(col1,col2,col3) VALUES(val7,val8, val9) Subquery;
在這個語句中,每個值表達式值:val1,val2或val3必須引用由子查詢的選擇列表返回的列對應的值。
如果要使用文字值而不是子查詢返回的值,請使用以下子查詢:
SELECT * FROM dual;
條件多項插入語句允許根據指定的條件將行插入到表中。
以下顯示了條件多項插入語句的語法:
INSERT [ ALL | FIRST ] WHEN condition1 THEN INTO table_1 (column_list ) VALUES (value_list) WHEN condition2 THEN INTO table_2(column_list ) VALUES (value_list) ELSE INTO table_3(column_list ) VALUES (value_list) Subquery
如果指定了ALL關鍵字,則Oracle將在WHEN子句中評估每個條件。如果條件評估/計算為true,則Oracle執行相應的INTO子句。
但是,當指定FIRST關鍵字時,對於由子查詢返回的每一行,Oracle都會從WHEN子句的上下方向評估每個條件。 如果Oracle發現條件的計算結果為true,則執行相應的INTO子句並跳過給定行的后續WHEN子句。
請注意,單條件多項式插入語句最多可以有127個WHEN子句。
Oracle多表插入語句受以下主要限制:
- 它可以用來將數據只插入到表中,而不是視圖或物化視圖。
- 它不能用來將數據插入到遠程表中。
- 所有
INSERT INTO子句中的列總和不得超過999。 - 一個表集合表達式不能在一個多表插入語句中使用。
- 多表插入語句的子查詢不能使用序列。
1.8.2 事務
因為oracle的事務對數據庫的變更的處理,我們必須做提交事務才能讓數據真正的插入到數據庫中,在同樣在執行完數據庫變更的操作后還可以把事務進行回滾,這樣就不會插入到數據庫。如果事務提交后則不可以再回滾。
提交:commit
回滾:rollback
-
事務保存點與回滾:
語法:
savepoint 保存點名字
示例:
savepoint a1; --設置一個保存點 a1; update person set name='張三' where pid='101' --修改一條數據 savepoint a2; --設置一個保存點 a1; update tmp set name='李四' where id='102 --再修改一條數據
rollback to a2; --回滾到a2 保存點。 此時在 a2 保存點之后的所有數據修改視為無效。 rollback to a1; --這里可以再從a2保存點再回滾到a1 保存點。 此時在 a1 保存點之后的所有數據修改視為無效。 rollback; --回滾全部。即撤消至上一次提交事務后的所有數據修改。 commit; --提交事務 將回滾后的事務提交,並會刪除所有保存點。
-
注意:我們可以從a2向前再回滾到a1 ,但無法從a1回滾到a2。也就是只能向前回滾,不能從前面的點再向后回滾!
1.8.3 UPDATE
全部修改:
UPDATE 表名 SET 列名1=值1,列名2=值2,…
局部修改:
UPDATE 表名 SET 列名1=值1,列名2=值2,…WHERE 修改條件
1.8.4 DELETE
語法 :
DELETE FROM 表名 WHERE 刪除條件;
在刪除語句中如果不指定刪除條件的話就會刪除所有的數據
現實應用中,經常從與其他表中的行具有外鍵關系的表中來刪除行記錄。
例如,想要從orders表中刪除id為1的銷售訂單,並從order_items表中刪除與訂單id是1關聯的所有行項目。 通常可以發出兩個DELETE語句,如下所示:
-- 第一條 DELETE FROM orders WHERE order_id = 1; -- 第二條 DELETE FROM order_items WHERE order_id = 1; COMMIT WORK;
請注意,COMMIT WORK語句確保兩個DELETE語句以全部或全部方式執行,以防第一條語句成功,但第二個DELETE語句失敗時在order_items表中的孤行。
但是,如果知道如何正確設置表的約束,那么這是不必要的。
在這種情況下,當創建order_items表時,可以使用DELETE CASCADE選項定義一個外鍵約束,如下所示:
CREATE TABLE order_items ( order_id NUMBER( 12, 0 ) , -- other columns -- ... CONSTRAINT fk_order_items_orders FOREIGN KEY( order_id ) REFERENCES orders( order_id ) ON DELETE CASCADE );
通過這樣做,每當從orders表中刪除一行時,例如:
DELETE FROM orders WHERE order_id = 1;
order_items表中order_id為1的所有行也被數據庫系統自動刪除。
Truncate table實現數據刪除
比較truncat與delete實現數據刪除?
delete刪除的數據可以rollback,也可以閃回
delete刪除可能產生碎片,並且不釋放空間
truncate是先摧毀表結構,再重構表結構
1.8.5 Merge語句
Oracle MERGE語句從一個或多個源表中選擇數據並更新或將其插入到目標表中。 MERGE語句可指定一個條件來確定是更新數據還是將數據插入到目標表中。
以下說明了Oracle MERGE語句的語法:
MERGE INTO target_table USING source_table ON search_condition WHEN MATCHED THEN UPDATE SET col1 = value1, col2 = value2,... WHERE <update_condition> [DELETE WHERE <delete_condition>] WHEN NOT MATCHED THEN INSERT (col1,col2,...) values(value1,value2,...) WHERE <insert_condition>;
下面來仔細看看上面MERGE語句的語法:
- 首先,指定要在
INTO子句中更新或插入的目標表(target_table)。 - 其次,指定要更新或插入
USING子句中的數據源(source_table)。 - 第三,指定合並操作在
ON子句中更新或插入的搜索條件。
對於目標表中的每一行,Oracle都會評估搜索條件:
- 如果結果為
true,則Oracle使用源表(source_table)中的相應數據更新該行。 - 如果任何行的結果為
false,則Oracle將源表(source_table)中相應的行插入到目標表(target_table)中。
當想要在單個操作中組合多個INSERT,UPDATE和DELETE語句時,MERGE語句變得很方便。
因為MERGE是確定性語句,所以不能在同一個MERGE語句中多次更新目標表的同一行。
可以將一個可選的DELETE WHERE子句添加到MATCHED子句中,以在合並操作之后進行清理。 DELETE子句只刪除目標表中與ON和DELETE WHERE子句匹配的行。
Oracle MERGE前提條件
要執行MERGE語句,必須在源表上具有INSERT和UPDATE對象權限。 如果使用DELETE子句,則還必須在目標表上具有DELETE對象特權。
