Oracle基礎教程(一)


本文鏈接: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區別

  1. with admin option用於系統權限授權,with grant option用於對象授權。
  2. 給一個用戶授予系統權限帶上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就會對新舊密碼進行比較,當發現新舊密碼一樣時,就提示用戶重新輸入密碼。
例子:

  1. 建立profile

     
                   
    SQL>create profile password_history limit password_life_time 10 password_grace_time 2 
    password_reuse_time 10 
    //password_reuse_time指定口令可重用時間即10天后就可以重用
  2. 分配給某個用戶SQL> alter user test profile password_history;

  3. 刪除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
  1. 字符類 char 長度固定,最多容納2000個字符。 例子:char(10) ‘小韓’前四個字符放‘小韓’,后添6個空格補全,如‘小韓 ’ varchar2(20) 長度可變,最多容納4000個字符。 例子:varchar2(10) ‘小韓’ oracle分配四個字符。這樣可以節省空間。 clob(character large object) 字符型大對象,最多容納4g char 查詢的速度極快浪費空間,適合查詢比較頻繁的數據字段。 varchar 節省空間
  2. 數字型 number范圍-10的38次方到10的38次方,可以表示整數,也可以表示小數 number(5,2)表示一位小數有5位有效數,2位小數;范圍:-999.99 到999.99 number(5)表示一個5位整數;范圍99999到-99999
  3. 日期類型 date 包含年月日和時分秒 oracle默認格式1-1月-1999 timestamp 這是oracle9i對date數據類型的擴展。可以精確到毫秒。
  4. 圖片 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;

 

在這個語句中,每個值表達式值:val1val2val3必須引用由子查詢的選擇列表返回的列對應的值。

如果要使用文字值而不是子查詢返回的值,請使用以下子查詢:

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子句。

請注意,單條件多項式插入語句最多可以有127WHEN子句。

Oracle多表插入語句受以下主要限制:

  • 它可以用來將數據只插入到表中,而不是視圖或物化視圖。
  • 它不能用來將數據插入到遠程表中。
  • 所有INSERT INTO子句中的列總和不得超過999
  • 一個表集合表達式不能在一個多表插入語句中使用。
  • 多表插入語句的子查詢不能使用序列。

1.8.2 事務

因為oracle的事務對數據庫的變更的處理,我們必須做提交事務才能讓數據真正的插入到數據庫中,在同樣在執行完數據庫變更的操作后還可以把事務進行回滾,這樣就不會插入到數據庫。如果事務提交后則不可以再回滾。

提交:commit

回滾:rollback

  1. 事務保存點與回滾:

    語法:

    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;  --提交事務 將回滾后的事務提交,並會刪除所有保存點。
     
  2. 注意:我們可以從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表中刪除id1的銷售訂單,並從order_items表中刪除與訂單id1關聯的所有行項目。 通常可以發出兩個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_id1的所有行也被數據庫系統自動刪除。

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子句只刪除目標表中與ONDELETE WHERE子句匹配的行。

Oracle MERGE前提條件

要執行MERGE語句,必須在源表上具有INSERTUPDATE對象權限。 如果使用DELETE子句,則還必須在目標表上具有DELETE對象特權。

DDL : 數據定義語言 create alter drop truncate
DML : 數據操縱語言 insert update delete
DCL : 數據控制語言 安全 授權 grant revoke
DQL : 數據查詢語言 select from子句 where子句


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM