關於 DML 敘述句和交易
資料處理語言 (DML) 敘述句:新增、變更以及刪除資料庫表格資料。交易是一或多個 SQL 敘述句的序列,Oracle AI Database 會將其視為一個單位:執行所有敘述句,或沒有任何敘述句。
關於交易控制敘述句
交易是一或多個 SQL 敘述句的序列,Oracle AI Database 會將其視為一個單位:執行所有敘述句,或沒有任何敘述句。您需要交易來建立需要以數個作業為一個單位執行的商業處理作業之模型。
例如,當經理人員離開公司時,必須將一列插入 JOB_HISTORY 表格,以顯示經理人員離開的時機,而對於每一位向該經理人員報告的員工,則 MANAGER_ID 的值必須在 EMPLOYEES 表格中更新。若要在應用程式中建立此程序的模型,您必須將 INSERT 和 UPDATE 陳述式分組為單一交易。
基本的交易控制陳述式為:
-
SAVEPOINT,在交易中標示儲存點,這是您稍後可以倒回的點。儲存點是選擇性的,交易可以有多個儲存點。
-
結束目前交易的 COMMIT 讓其永久變更、清除其儲存點,並釋放其鎖定。
-
ROLLBACK,它會倒回 (還原) 整個目前的交易,或只倒回在指定的儲存點之後所做的變更。
在 SQL*Plus 環境中,您可以在 SQL> 提示之後輸入交易控制敘述句。
在 SQL Developer 環境中,您可以在「工作表」中輸入交易控制陳述式。SQL Developer 也具有「確認變更」和「倒回變更」圖示,其說明於確認交易和倒回交易。
注意:
若您未明確確認異動,且程式不正常終止,則資料庫會自動回復上次未確認的異動。
Oracle 建議您透過確認交易或倒回交易,來明確地結束應用程式中的交易。
另請參閱:
-
Oracle AI Database Concepts,瞭解交易管理的詳細資訊
-
Oracle AI Database SQL Language Reference,瞭解交易控制敘述句的詳細資訊
確認交易
確認交易會永久變更、清除其儲存點,以及釋放其鎖定。
若要明確確認異動,請使用 COMMIT 陳述式或 (在 SQL Developer 環境中) 確認變更為圖示。
注意:Oracle AI Database 會在任何資料定義語言 (DDL) 陳述式之前和之後發出隱含 COMMIT 陳述式。如需有關 DDL 敘述句的資訊,請參閱「關於資料定義語言 (DDL) 敘述句」。
在您確認交易之前:
-
您看得到您的變更,但資料庫執行處理的其他使用者不會見到變更。
-
您所做的變更不是最終的,您可以在 ROLLBACK 陳述式中還原這些變更。
在您確認交易之後:
-
其他使用者和在您確認交易之後執行的敘述句看得見您的變更。
-
您的變更是最終的,您無法使用 ROLLBACK 陳述式還原這些變更。
範例 3-1 會將一列新增至 REGIONS 表格 (非常簡單的交易)、檢查結果,然後確認交易。
範例 3-1 確認異動
交易前:
SELECT * FROM REGIONS
ORDER BY REGION_ID;
結果:
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East and Africa
4 rows selected.
交易 (新增資料列至表格):
INSERT INTO regions (region_id, region_name) VALUES (5, 'Africa');
結果:
1 row created.
檢查是否已新增資料列:
SELECT * FROM REGIONS
ORDER BY REGION_ID;
結果:
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East and Africa
5 Africa
5 rows selected.
確認交易:
COMMIT;
結果:
Commit complete.
另請參閱:Oracle AI Database SQL Language Reference,瞭解 COMMIT 陳述式的相關資訊
倒回交易
倒回交易會還原其變更。您可以倒回目前的整個交易,或者僅倒回至指定儲存點。
如果只要將目前的交易倒回指定的儲存點,請使用具備 TO SAVEPOINT 子句的 ROLLBACK 敘述句。
若要倒回整個目前交易,請使用 ROLLBACK 敘述句 (不含 TO SAVEPOINT 子句),或 (在 SQL Developer 環境中) 倒回變更圖示。
倒回整個目前交易:
-
結束交易
-
反轉所有變更
-
清除全部儲存點。
-
釋出任何交易鎖定
僅將目前的交易倒回指定儲存點:
-
請勿結束交易
-
僅反轉指定儲存點之後所做的變更
-
僅清除在指定儲存點之後設定的儲存點 (不包含指定儲存點本身)
-
釋放在指定儲存點之後取得的所有表格和資料列
要求存取在指定儲存點之後鎖定的資料列之其他交易,必須繼續等待直到交易確認或倒回。未要求存取資料列的其他交易可以立即要求並存取資料列。
若要在 SQL Developer 中查看倒回的效果,您可能需要按一下重新整理圖示。
由於範例 3-1 ,REGIONS 表格具有稱為「中東與非洲」的區域,以及稱為「非洲」的區域。範例 3-2 會更正這個問題 (非常簡單的交易),然後檢查變更,然後倒回交易並檢查倒回。
範例 3-2 倒回整個交易
交易前:
SELECT * FROM REGIONS
ORDER BY REGION_ID;
結果:
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East and Africa
5 Africa
5 rows selected.
交易 (變更表格):
UPDATE REGIONS
SET REGION_NAME = 'Middle East'
WHERE REGION_NAME = 'Middle East and Africa';
結果:
1 row updated.
檢查變更:
SELECT * FROM REGIONS
ORDER BY REGION_ID;
結果:
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East
5 Africa
5 rows selected.
倒回交易:
ROLLBACK;
結果:
Rollback complete.
檢查倒回:
SELECT * FROM REGIONS
ORDER BY REGION_ID;
結果:
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East and Africa
5 Africa
5 rows selected.
另請參閱:Oracle AI Database SQL Language Reference,瞭解 ROLLBACK 敘述句的相關資訊
設定交易中的儲存點
SAVEPOINT 敘述句會在交易中標記儲存點,也就是稍後可以倒回的交易點。儲存點是選擇性的,交易可以有多個儲存點。範例 3-3 會進行包含數個 DML 敘述句與數個儲存點的交易,然後將交易倒回一個儲存點,只還原該儲存點之後所做的變更。
範例 3-3 將交易倒回至 Savepoint
交易前檢查「區域」表:
SELECT * FROM REGIONS
ORDER BY REGION_ID;
結果:
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East and Africa
5 Africa
5 rows selected.
交易之前檢查區域 4 的國家:
SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 4
ORDER BY COUNTRY_NAME;
結果:
COUNTRY_NAME CO REGION_ID
---------------------------------------- -- ----------
Egypt EG 4
Israel IL 4
Kuwait KW 4
Nigeria NG 4
Zambia ZM 4
Zimbabwe ZW 4
6 rows selected.
交易之前檢查區域 5 的國家:
SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 5
ORDER BY COUNTRY_NAME;
結果:
no rows selected
有數個儲存點的交易:
UPDATE REGIONS
SET REGION_NAME = 'Middle East'
WHERE REGION_NAME = 'Middle East and Africa';
UPDATE COUNTRIES
SET REGION_ID = 5
WHERE COUNTRY_ID = 'ZM';
SAVEPOINT zambia;
UPDATE COUNTRIES
SET REGION_ID = 5
WHERE COUNTRY_ID = 'NG';
SAVEPOINT nigeria;
UPDATE COUNTRIES
SET REGION_ID = 5
WHERE COUNTRY_ID = 'ZW';
SAVEPOINT zimbabwe;
UPDATE COUNTRIES
SET REGION_ID = 5
WHERE COUNTRY_ID = 'EG';
SAVEPOINT egypt;
在交易後檢查 REGIONS 表格:
SELECT * FROM REGIONS
ORDER BY REGION_ID;
結果:
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East
5 Africa
5 rows selected.
交易之後檢查區域 4 的國家:
SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 4
ORDER BY COUNTRY_NAME;
結果:
COUNTRY_NAME CO REGION_ID
---------------------------------------- -- ----------
Israel IL 4
Kuwait KW 4
2 rows selected.
交易之後檢查區域 5 的國家:
SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 5
ORDER BY COUNTRY_NAME;
結果:
COUNTRY_NAME CO REGION_ID
---------------------------------------- -- ----------
Egypt EG 5
Nigeria NG 5
Zambia ZM 5
Zimbabwe ZW 5
4 rows selected.
ROLLBACK TO SAVEPOINT nigeria;
回復後檢查 REGIONS 表格:
SELECT * FROM REGIONS
ORDER BY REGION_ID;
結果:
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East
5 Africa
5 rows selected.
倒回之後檢查區域 4 的國家:
SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 4
ORDER BY COUNTRY_NAME;
結果:
COUNTRY_NAME CO REGION_ID
---------------------------------------- -- ----------
Egypt EG 4
Israel IL 4
Kuwait KW 4
Zimbabwe ZW 4
4 rows selected.
倒回之後檢查區域 5 的國家:
SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 5
ORDER BY COUNTRY_NAME;
結果:
COUNTRY_NAME CO REGION_ID
---------------------------------------- -- ----------
Nigeria NG 5
Zambia ZM 5
2 rows selected.
另請參閱:Oracle AI Database SQL Language Reference,瞭解 SAVEPOINT 敘述句的相關資訊