1. 程式人生 > 實用技巧 >oracle DML 語言和事務

oracle DML 語言和事務

前言:

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語句所涉及到的行被鎖定, 其他使用者不能操作