首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle資料庫入門:DML 與交易控制實戰

     編輯:Oracle 資料庫相關知識

資料操作語言 (DML) 核心指令

INSERT - 新增資料

INSERT INTO table_name [(col1, col2, ...)] VALUES (val1, val2, ...);
  • 每次僅插入一筆記錄。
  • 省略欄位清單時,必須為所有欄位依序指定值。
  • 指定欄位清單時,未列入欄位自動填入 NULL(或預設值)。

範例

-- 完整欄位插入
INSERT INTO dept VALUES (88, '研發部', '北京');

-- 錯誤:值數量不足
INSERT INTO dept VALUES (66, '美工部');

-- 指定欄位插入
INSERT INTO dept (deptno, dname) VALUES (99, '財務部');

子查詢插入 (跨表複製)

INSERT INTO dept1 (id, name) SELECT deptno, dname FROM dept;
  • 子查詢結果欄位須與目標欄位清單對應。
  • 實務上資料備份建議在資料庫層面(RMAN、Data Pump)而非應用層執行。

UPDATE - 修改資料

UPDATE table_name SET col1 = val1 [, col2 = val2, ...] [WHERE condition];
  • 可一次更新多筆記錄。
  • 省略 WHERE 將更新全表所有列。
-- 全員加薪 88
UPDATE emp SET sal = sal + 88;

-- 單筆精準更新
UPDATE student2 SET phone = '010-51288984' WHERE name = '張三';

DELETE - 刪除資料

DELETE [FROM] table_name [WHERE condition];
  • 可一次刪除多筆。
  • 省略 WHERE 清空全表資料(表結構保留)。
  • 非 DDL,可回滾,不釋放空間。
DELETE emp;              -- 等同 DELETE FROM emp;
DELETE emp WHERE empno = 7778;

MERGE - 合併資料 (UPSERT)

根據條件決定更新或插入,適用於資料同步場景。

MERGE INTO target_table [alias]
USING (source_table | view | subquery) [alias]
ON (join_condition)
WHEN MATCHED THEN
    UPDATE SET col1 = val1, col2 = val2, ...
WHEN NOT MATCHED THEN
    INSERT (col_list) VALUES (val_list);

完整範例

-- 建立來源與目標表
CREATE TABLE test1 (eid NUMBER(10), name VARCHAR2(20), birth DATE, salary NUMBER(8,2));
CREATE TABLE test2 (eid NUMBER(10), name VARCHAR2(20), birth DATE, salary NUMBER(8,2));

INSERT INTO test1 VALUES (1001, 'Stone', DATE '2010-01-21', 8888);
INSERT INTO test1 VALUES (1002, 'Smith', DATE '2009-01-04', 6666);

-- 合併:依 eid 比對,存在則更新,不存在則插入
MERGE INTO test2 t2
USING test1 t1
ON (t1.eid = t2.eid)
WHEN MATCHED THEN
    UPDATE SET t2.name = t1.name, t2.birth = t1.birth, t2.salary = t1.salary
WHEN NOT MATCHED THEN
    INSERT (eid, name, birth) VALUES (t1.eid, t1.name, t1.birth);

注意:UPDATE SET 與 INSERT 子句中目標表欄位不可加表前綴,否則報「標識符無效」。

交易控制

交易概念

  • 一組邏輯上不可分割的操作單元:要麼全成功,要麼全失敗。
  • 簡化錯誤恢復,提升應用可靠性。
  • 資料庫層面交易比應用層手動補償更可靠、高效。

交易組成

  • 0~N 條 DML (INSERT/UPDATE/DELETE/MERGE)。
  • 或 1 條 DDL (CREATE/ALTER/DROP/TRUNCATE)。
  • 或 1 條 DCL (GRANT/REVOKE)。

經典案例:銀行轉帳

-- 單一交易包含兩步:
-- 1. A 帳戶扣款
-- 2. B 帳戶入帳
-- 兩步必須同時成功或同時失敗

ACID 特性

特性說明
原子性所有操作全成或全敗,視為不可分割整體
一致性交易完成後資料處於合法狀態(如職級與薪資對應)
隔離性並發交易互不干擾,未提交變更對其他 Session 不可見
持久性提交後永久生效,不可撤銷

交易生命週期

事件交易狀態
第一條可執行 SQL開始
COMMIT / ROLLBACK結束
DDL / DCL 指令隱含提交並結束
Session 正常結束自動提交
Session 異常中斷 / 系統崩潰自動回滾

提交與回滾效果對照

階段資料可見性鎖定狀態可恢復性
提交/回滾前僅當前 Session 可見相關列鎖定,他 Session 僅可查詢可恢復
COMMIT 後所有 Session 可見釋放鎖定永久生效,不可恢復
ROLLBACK 後還原修改前狀態釋放鎖定資料恢復一致

存檔點 - 部分回滾

SAVEPOINT savepoint_name;
ROLLBACK TO savepoint_name;

範例

INSERT INTO dept VALUES (55, 'Adv', 'Beijing');
INSERT INTO dept VALUES (56, 'Sec', 'Shanghai');
SAVEPOINT p1;
INSERT INTO dept VALUES (57, 'Acc', 'Dalian');

-- 僅回滾到 p1 之後的操作
ROLLBACK TO p1;
-- p1 之前的兩筆 INSERT 保留

前提:Session 為非自動提交模式。

SQL*Plus 自動提交設定

SHOW AUTOCOMMIT;        -- 查看設定
SET AUTOCOMMIT ON;      -- 開啟自動提交
SET AUTOCOMMIT OFF;     -- 關閉(預設)
  • OFF:需手動 COMMIT 才永久生效,新 Session 不可見未提交資料。
  • ON:每條語句執行後自動提交。
  • 正常關閉視窗/斷開連線亦會觸發提交。

驗證隔離性範例

-- Session 1 (AUTOCOMMIT OFF)
INSERT INTO dept VALUES (88, 'Stone', 'Beijing');
SELECT * FROM dept;  -- 可見 88

-- Session 2 (新視窗,同用戶登入)
SELECT * FROM dept;  -- 不可見 88

-- Session 1
COMMIT;

-- Session 2
SELECT * FROM dept;  -- 此時可見 88
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved