oracle DML 語言和事務
阿新 • • 發佈:2020-10-05
前言:
DML(Data Manipulation Language – 資料操縱語言) 可以在下列條件下執行:
--向表中插入資料
--修改現存資料
--刪除現存資料
事務是由完成若干項工作的DML語句組成的
一、向表中插入資料 ( insert )
建立study 表
create table study ( id varchar2(10), name varchar2(20), age number(5) )
複製study表結構,無資料 create table study2 as select * from study where 1=2
---------------------一條一條的插入--------------------方式一: INSERT INTO study VALUES('1','chen',20); 方式二: 省略某些列: INSERT INTO study (id,name) VALUES('2','yan'); 加入空值: INSERT INTO study VALUES('2','yan',null); 方式三 INSERT INTO study (id,name,age) VALUES('3','jiao',21); 總結: 方式一和方式三是一樣的效果。 方式二中的選擇欄位必須包含非空和主鍵欄位否則會報錯。 字元和日期型資料應包含在單引號中。 ----------------------多條插入------------------------------從其它表中拷貝資料 不必書寫 VALUES 子句。 子查詢中的值列表應與 INSERT 子句中的列名對應 insert into study2 select * from study ----------------------建立指令碼----------------------------- 在SQL 語句中使用 & 變數指定列值。 & 變數放在VALUES子句中 INSERT INTO study values('&id','&name',&age) select * from study2
二、修改現存資料 (update)
①使用 WHERE 子句指定需要更新的資料。 update study set age = 20 where id='1'; ②如果省略 WHERE 子句,則表中的所有資料都將被更新 update study set age = 20; ③在 UPDATE 語句中使用子查詢 UPDATE copy_emp SET department_id = (SELECT department_id FROM employees WHERE employee_id = 100) WHERE job_id = (SELECT job_id FROM employees WHERE employee_id = 200); ④在 UPDATE 中使用子查詢,使更新基於另一個表中的 資料。 UPDATE employees SET job_id = (SELECT job_id FROM employees WHERE employee_id = 205), salary = (SELECT salary FROM employees WHERE employee_id = 205) WHERE employee_id = 114;
三、刪除現存資料(delete)
①語法:
DELETE FROM table [WHERE condition]; ②使用 WHERE 子句刪除指定的記錄。 DELETE FROM departments WHERE department_name = 'Finance'; ③如果省略 WHERE 子句,則表中的全部資料將被刪除 DELETE FROM copy_emp; ④在 DELETE 中使用子查詢,使刪除基於另一個表中的資料。 DELETE FROM emp1 WHERE department_id = (SELECT department_id FROM dept1 WHERE department_name LIKE '%Public%');
四、事務是由完成若干項工作的DML語句組成的
1.資料庫事務由以下的部分組成:
一個或多個DML 語句 (手動commit)
一個 DDL(Data Definition Language – 資料定義語言) 語句 (create drop alter 自動提交)
一個 DCL(Data Control Language – 資料控制語言) 語句
2.事務的開始和結束
開始:
以第一個 DML 語句的執行作為開始
結束:
COMMIT 或 ROLLBACK 語句
DDL 語句(自動提交)
使用者會話正常結束
系統異常終止
3.自動提交在以下情況中執行:
DDL 語句。
DCL 語句。
不使用 COMMIT 或 ROLLBACK 語句提交或回滾,正常結束會話。(正常關閉會話)
會話異常結束或系統異常會導致自動回滾。
3.commit 、savapoint 、rollback的關係
commit ; 提交會話,覆水難收,提交不可rollback,回不去了~別想了~
delete from study where id ='1';
savepoint a ; ------ a點
delete from study where id ='2';
savepoint b ; ------- b點 rollback to savepoint a ; // 無 id ='1' 有 id ='2'
rollback to savepoint b ; // 無 id ='1' 無 id ='2'
rollback // 有 id ='1' 有 id ='2'
rollback 回到上一次commit 之後的狀態
① commit
資料的改變已經被儲存到資料庫中。
改變前的資料已經丟失。
所有使用者可以看到結果。
鎖被釋放,其他使用者可以操作涉及到的資料。
所有儲存點被釋放。
② rollback
資料改變被取消。
修改前的資料狀態被恢復。
鎖被釋放。
總結:
- commit前的改變的資料狀態是可以恢復的
- 執行 DML 操作的使用者可以通過 SELECT 語句查詢之前的修正
- 在沒有commit 之前insert、delete 、update 的資料只有當前操作會話可見,其他會話select 不可見。
- 其他使用者不能看到當前使用者所做的改變,直到當前使用者結束事務。
- DML語句所涉及到的行被鎖定, 其他使用者不能操作