關於 DML 敘述句和交易

資料處理語言 (DML) 敘述句:新增、變更以及刪除資料庫表格資料。交易是一或多個 SQL 敘述句的序列,Oracle AI Database 會將其視為一個單位:執行所有敘述句,或沒有任何敘述句。

關於交易控制敘述句

交易是一或多個 SQL 敘述句的序列,Oracle AI Database 會將其視為一個單位:執行所有敘述句,或沒有任何敘述句。您需要交易來建立需要以數個作業為一個單位執行的商業處理作業之模型。

例如,當經理人員離開公司時,必須將一列插入 JOB_HISTORY 表格,以顯示經理人員離開的時機,而對於每一位向該經理人員報告的員工,則 MANAGER_ID 的值必須在 EMPLOYEES 表格中更新。若要在應用程式中建立此程序的模型,您必須將 INSERT 和 UPDATE 陳述式分組為單一交易。

基本的交易控制陳述式為:

在 SQL*Plus 環境中,您可以在 SQL> 提示之後輸入交易控制敘述句。

在 SQL Developer 環境中,您可以在「工作表」中輸入交易控制陳述式。SQL Developer 也具有「確認變更」和「倒回變更」圖示,其說明於確認交易倒回交易

注意:

若您未明確確認異動,且程式不正常終止,則資料庫會自動回復上次未確認的異動。

Oracle 建議您透過確認交易或倒回交易,來明確地結束應用程式中的交易。

另請參閱:

確認交易

確認交易會永久變更、清除其儲存點,以及釋放其鎖定。

若要明確確認異動,請使用 COMMIT 陳述式或 (在 SQL Developer 環境中) 確認變更為圖示。

注意:Oracle AI Database 會在任何資料定義語言 (DDL) 陳述式之前和之後發出隱含 COMMIT 陳述式。如需有關 DDL 敘述句的資訊,請參閱「關於資料定義語言 (DDL) 敘述句」。

在您確認交易之前:

在您確認交易之後:

範例 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-1REGIONS 表格具有稱為「中東與非洲」的區域,以及稱為「非洲」的區域。範例 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 敘述句的相關資訊