PLSQL Language Referenc-PL/SQL靜態SQL-事務處理和控制-savepoint語句

LuiseDalian發表於2014-03-17

savepoint語句

savepoint語句命名和標記事務處理中的當前點。使用savepoing可以回滾事務的一部分,而不是整個事務。對於會話而言,活動的savepoint的數目是沒有限制的。

DROP TABLE emp_name;

CREATE TABLE emp_name AS

    SELECT employee_id, last_name, salary

    FROM employees;

 

CREATE UNIQUE INDEX empname_ix ON emp_name (employee_id);

 

DECLARE

    emp_id        employees.employee_id%TYPE;

    emp_lastname  employees.last_name%TYPE;

    emp_salary    employees.salary%TYPE;

 

BEGIN

    SELECT employee_id, last_name, salary

    INTO emp_id, emp_lastname, emp_salary

    FROM employees

    WHERE employee_id = 120;

 

    UPDATE emp_name

    SET salary = salary * 1.1

    WHERE employee_id = emp_id;

 

    DELETE FROM emp_name

    WHERE employee_id = 130;

 

    SAVEPOINT do_insert;

 

    INSERT INTO emp_name (employee_id, last_name, salary)

    VALUES (emp_id, emp_lastname, emp_salary);

 

EXCEPTION

    WHEN DUP_VAL_ON_INDEX THEN

        ROLLBACK TO do_insert;

    DBMS_OUTPUT.PUT_LINE('插入被回滾');

END;

當回滾到一個儲存點的時候,該儲存點後宣告的所有儲存點被刪除。回滾到的這個儲存點不被刪除。最簡單的提交或回滾語句會刪除所有的儲存點。

 

如果在遞迴子程式中宣告瞭儲存點,則在遞迴的每個層次上,儲存點的新例項都會執行,但只能回滾到最近宣告的儲存點。

儲存點是非宣告的識別符號。在一個事務中重用儲存點的名稱,相當於將儲存點從舊的位置移動到當前位置。

--重用儲存點名稱

DROP TABLE emp_name;

CREATE TABLE emp_name AS

    SELECT employee_id, last_name, salary

    FROM employees;

 

CREATE UNIQUE INDEX empname_ix ON emp_name (employee_id);

 

DECLARE

    emp_id        employees.employee_id%TYPE;

    emp_lastname  employees.last_name%TYPE;

    emp_salary    employees.salary%TYPE;

 

BEGIN

    SELECT employee_id, last_name, salary

    INTO emp_id, emp_lastname, emp_salary

    FROM employees

    WHERE employee_id = 120;

    --儲存點原來位置

    SAVEPOINT my_savepoint;

 

    UPDATE emp_name

    SET salary = salary * 1.1

    WHERE employee_id = emp_id;

 

    DELETE FROM emp_name

    WHERE employee_id = 130;

    --儲存點新位置

    SAVEPOINT my_savepoint;

 

    INSERT INTO emp_name (employee_id, last_name, salary)

    VALUES (emp_id, emp_lastname, emp_salary);

 

EXCEPTION

    WHEN DUP_VAL_ON_INDEX THEN

        ROLLBACK TO my_savepoint;

        DBMS_OUTPUT.PUT_LINE('事務回滾.');

END;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17013648/viewspace-1122925/,如需轉載,請註明出處,否則將追究法律責任。

相關文章