Oracle數據庫入門之DML與事務控制
來源:易賢網 閱讀:1067 次 日期:2014-09-17 10:39:59
溫馨提示:易賢網小編為您整理了“Oracle數據庫入門之DML與事務控制”,方便廣大網友查閱!

insert語句

語法:insert into table [(column1, column2...)] values (value1, value2...);

說明:insert語句每次只能向表中插入一條記錄。缺省字段名列表時,應為新插入記錄中的每個字段顯式的設定新值

也可在insert語句中指定賦值字段列表,只為部分字段顯式設定新值,其余字段將被缺省賦值為null

舉例:insert into dept values(88,'研發(fā)部','北京');--此句便是缺省字段名列表的情況

insert into dept values(66,'美工部');--這句將執(zhí)行出錯,提示為沒有足夠的值。即必須為所有字段設定值

insert into dept(deptno,dname) values(99,'財務部');--也可以單獨為deptno和dname字段賦值

select table_name from user_tables;--用到了數據字典表。目的是查詢當前用戶方案下所有的表的名字

select user from dual;--查詢當前連接到數據庫的用戶名

補充:可以在insert語句中使用子查詢,實現表間數據拷貝。在現實開發(fā)中很少用的到,有點類似Java中的數組拷貝

比如insert into dept1(id, name) select deptno, dname from dept;

此時不必再給出values子句。子查詢中的值列表應與insert子句中的字段列表相匹配

實現數據復制的時候,也可以在應用程序層面采用這種方式進行數據備份,但一般來說這種備份是不可靠的

應該在數據庫的層面做備份,也可以由DBA對整個數據庫做自動的數據備份處理,包括出現問題的時候的恢復

update語句

語法:update table set column1=value1 [, column2=value2, ...] [where condition];

說明:update語句用于更新表中的數據。update語句每次可更新多條記錄

可使用where子句限定要更新的記錄,如果缺省where子句,則更新表中的所有記錄

舉例:update emp set sal=sal+88;--將所有員工的工資都漲88元錢

update student2 set phone='010-51288984' where name='張三';--將張三的電話改為010-51288984

delete語句

語法:delete [from] table [where condition];

說明:delete語句用于從表中刪除數據。delete語句每次可刪除多條記錄

可使用where子句限定要刪除的記錄,如果缺省where子句,則刪除表中的所有記錄

delete語句并不是刪除整個表,只是刪除表中的記錄,表仍然存在,還可用來存放數據

舉例:delete emp;--等價于delete from emp;

delete emp where empno=7778;--刪除empno字段的值為7778的所有記錄

merge語句

概述:merge語句用于進行數據合并,它是根據條件在表中執(zhí)行數據的修改或插入操作

如果要插入的記錄在目標表中已經存在,則執(zhí)行更新操作,否則執(zhí)行插入操作

實際開發(fā)的過程中使用它的機會并不是很多

語法:merge into table [alias]

using(table|view|sub_query) [alias]

on(join_condition)

when matched then

update set col1=col1_val, col2=col2_val

when not matched then

insert (column_list) values(column_values);

舉例:create table test1(eid number(10), name varchar2(20), birth date, salary number(8,2));

insert into test1 values (1001, 'Stone', '21-1月-10', 8888);

insert into test1 values (1002, 'Smith', '04-1月-09', 6666);

select * from test1;

create table test2(eid number(10), name varchar2(20), birth date, salary number(8,2));

select * from test2;

merge into test2

using test1

on(test1.eid=test2.eid)

when matched then

update set name=test1.name,birth=test1.birth,salary=test1.salary

when not matched then

insert (eid, name, birth) values(test1.eid, test1.name, test1.birth);

select * from test2;

說明:set設定的是目標表中的字段。即將源表中的字段值賦給目標表中的字段

insert設定的也是將字段值插入到目標表中。如果要插入全部的字段的值,那么column_list是可以省略的

注意:由于set和insert默認都是對目標表進行操作,所以,它們后面的字段不可以加目標表前綴

即本例中若出現set test2.name=test1.name或insert (test2.eid),執(zhí)行則出錯,提示信息為標識符無效

事務控制

概述:也叫做事務處理。是通過將一組相關操作組合為一個要么全部成功,要么全部失敗的邏輯工作單元

以簡化錯誤恢復,提高應用程序的可靠性。這里指的是在數據庫層面所進行的一種數據庫操作的集成或者說單元化控制

也可以在應用程序層面進行類似的處理。比如說逐個向數據庫發(fā)送多條DML指令,通過先后更新兩個表以對應轉賬操作

如果后面的一個操作出錯了,那么就取消前一個指令,或者進行相反的對沖的操作

但應用程序層面的這種原子的組合,實際上是不可靠的。在數據庫的層面或者在底層來進行這種集成,會更有效有些

事務:組成單個邏輯工作單元的一系列操作被稱為事務(Transaction)。實際上事務不是僅限于在數據庫領域中的一個概念

數據庫事務通常由0到多條DML語句或1條DDL(Data Define Language)語句或1條DCL(Data Control Language)語句組成

所謂的單個邏輯工作單元就是能夠完成一個相對獨立的功能,或者說是不應該分隔開的一個操作系列

比如銀行的轉賬業(yè)務,該業(yè)務至少可以分為A賬戶的轉出和B賬戶的轉入。也就是從A賬戶的余額中減掉一定的數額

然后再將B賬戶的余額增加一定的數額。整個過程等于是修改了兩條記錄,這兩個操作就可以認為就組成了一個事務

它們應該是一個單個的邏輯工作單元,也就是銀行的一個單筆業(yè)務

ACID:事務必須滿足ACID屬性,即原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)

原子性:即事務中所有操作要么全成功,要么全失敗,它們應該作為一個整體被處理

一致性:事務執(zhí)行完畢之后,數據必須處于一致性的狀態(tài),不能出現數據狀態(tài)上的錯誤。比如將員工工資級別從C升到B級

但工資卻沒有從應該的4000升到6000,于是就出現了數據的不一致。也就是說這時的工資級別雖然是B級

但工資的數額卻屬于C級的范圍。這就說明事務結束的時候,數據處于一種不一致性的狀態(tài),會影響后續(xù)的使用

隔離性:這是相對其它事務而言的。有時可能出現多個事務并發(fā)執(zhí)行的情況,比如多個用戶同時對同一個數據庫表進行操作

碰巧操縱的又是該表的同一個數據。此時應該有這樣的一個保證,即當前事務在執(zhí)行過程中所做的數據狀態(tài)的改變

是不受其它事務影響的。其它事務所讀取或查看的數據,仍是當前事務執(zhí)行之前的狀態(tài)

直到當前事務結束,其它事務看到的才會是當前事務結束之后的數據狀態(tài)

所有事務中間的狀態(tài)對其它事務而言,是被隔離開的,不受其它事務影響

持久性:當事務執(zhí)行完畢并提交操作之后,數據將永久生效,永久保存在數據庫中,將來不可撤銷,不可恢復

開始:事務開始于第一條可執(zhí)行語句

結束:當遇到commit或rollback語句、遇到DDL或DCL語句、用戶會話結束、系統(tǒng)崩潰等情況時會結束事務

提交:在執(zhí)行一個DDL語句、執(zhí)行一個DCL語句、正常結束會話等情況下會自動提交事務

提交就是讓事務永久生效,不可撤銷?;貪L就是撤銷先前操作,但回滾到事務開始之前的狀態(tài)時,數據仍然是一致的

回滾:當會話異常終止或系統(tǒng)崩潰時,事務會被自動回滾。事務的顯式的提交和回滾操作是為了更好的保證數據的一致性

狀態(tài):事務回滾后:數據的修改被撤銷。數據恢復到修改前的狀態(tài)。記錄鎖被釋放

事務提交后:數據的修改永久生效,不可撤銷。數據以前的狀態(tài)永久性丟失,無法恢復。保存點(savepoints)被清除

所有用戶(會話)都將看到操作后的結果。記錄鎖被釋放,其它用戶此時才可以對這些數據進行修改操作

提交或回滾前:事務中DML操作結果只對當前用戶(會話)可見,其它用戶(會話)看不到當前事務中數據的改變,直到事務結束

事務中DML語句所涉及到的行會被鎖定,其它用戶(會話)不能對其進行修改操作,但可以查詢

事務中數據狀態(tài)的改變是可以恢復的

SqlPlus的自動提交

概述:SqlPlus中執(zhí)行SQL語句時可以設置是否自動提交,缺省為非自動提交。這里的提交指的不是事務,而是SqlPlus的每條語句

將來在commit或正常關閉窗口即關閉本地到數據庫連接的時候,Sql Plus中的語句也會被自動的提交

設置:show autocommit;--查看設置。其中autocommit OFF表示當前設置為非自動提交,而autocommit IMMEDIATE代表自動提交

set autocommit on;--更改為自動提交。set autocommit off;--更改為非自動提交

舉例:insert into dept values(88,'Stone','Beijing');

select * from dept;

說明:自動提交狀態(tài)為OFF的情況下,這是一個未提交的事務。插入新記錄的操作并沒有永久生效,只是當前用戶(會話)可見

其它會話中看不見這個未提交事務,即使當前用戶再一次連接到數據庫,即建立了一個新的會話,也查詢不到88號記錄

比如不關閉當前SQLPlus,然后再打開一個SQLPlus窗口,并使用當前登錄的scott用戶再一次登錄新打開的SQLPlus窗口

然后執(zhí)行查詢,在結果中根本沒有查詢到前一次會話中沒有提交的操作指令,即查詢結果中沒有88號記錄

這時可以在原SQLPlus窗口中顯式的提交一下,即執(zhí)行commit指令。提交完成后,插入88號記錄的操作便永久生效了

然后回到后打開的SQLPlus窗口中執(zhí)行查詢,查詢結果中很自然的就查到了88號記錄

也就是說已經提交的事務影響所有其它的事務和會話。而對于未提交的事務,其它用戶(會話)是看不見的

保存點(Savepoint)

概述:通過保存點在當前的事務中創(chuàng)建標記,將來可回退到指定的標記(保存點)處,實現事務的部分回滾

舉例:insert into dept values(55,'Adv','Beijing');

insert into dept values(56,'Sec','Shanghai');

savepoint p1;

insert into dept values(57,'Acc','Dalian');

select * from dept;

rollback to p1;

select * from dept;

說明:前提是當前SqlPlus的設置是非自動提交。所以這些都是當前會話中未提交的事務

代碼執(zhí)行時p1之后的數據狀態(tài)的改變被撤銷,p1之前的操作仍然存在

若執(zhí)行rollback;則回滾到整個事務的最初

更多信息請查看IT技術專欄

更多信息請查看數據庫
易賢網手機網站地址:Oracle數據庫入門之DML與事務控制

2025國考·省考課程試聽報名

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯(lián)系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 加入群交流 | 手機站點 | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:526150442(9:00—18:00)版權所有:易賢網