PLSQL Language Referenc-PL/SQL靜態SQL-事務處理和控制-savepoint語句
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PLSQL Language Referenc-PL/SQL靜態SQL-事務處理和控制SQL
- PLSQL Language Referenc-PL/SQL靜態SQL-事務處理和控制-隱式回滾SQL
- PLSQL Language Referenc-PL/SQL靜態SQL-事務處理和控制-覆蓋預設的鎖SQL
- PLSQL Language Referenc-PL/SQL靜態SQL-靜態SQL的描述-語句SQL
- PLSQL Language Referenc-PL/SQL靜態SQL-自治事務-控制自治事務SQL
- PLSQL Language Referenc-PL/SQL靜態SQL-自治事務(二)SQL
- PLSQL Language Referenc-PL/SQL靜態SQL-查詢結果集處理SQL
- PLSQL Language Referenc-PL/SQL靜態SQL-靜態SQL的描述-偽列SQL
- PLSQL Language Referenc-PL/SQL動態SQL-本地動態SQL(EXECUTE IMMEDIATE語句)SQL
- PLSQL Language Referenc-PL/SQL靜態SQL-游標變數SQL變數
- PLSQL Language Referenc-PL/SQL控制語句-順序控制語句-NULLSQLNull
- PLSQL Language Referenc-PL/SQL靜態SQL-靜態SQL的描述-游標-顯式游標SQL
- PLSQL Language Referenc-PL/SQL靜態SQL-帶有子查詢的查詢結果集處理SQL
- PLSQL Language Referenc-PL/SQL控制語句-迴圈語句-FOR迴圈SQL
- PLSQL Language Referenc-PL/SQL控制語句-迴圈語句-CONTINUESQL
- PLSQL Language Referenc-PL/SQL控制語句-迴圈語句-EXIT WHENSQL
- PLSQL Language Referenc-PL/SQL動態SQL-何時需要動態SQLSQL
- PLSQL Language Referenc-PL/SQL控制語句-迴圈語句-FOR迴圈-下限和上限SQL
- PLSQL Language Referenc-PL/SQL靜態SQL-靜態SQL的描述-游標-開啟和關閉顯式游標SQL
- PLSQL Language Referenc-PL/SQL控制語句-迴圈語句-WHILE迴圈SQLWhile
- PLSQL Language Referenc-PL/SQL控制語句-迴圈語句-CONTINUE WHENSQL
- PLSQL Language Referenc-PL/SQL控制語句-條件選擇語句-IF THEN ELSeIFSQL
- PLSQL Language Referenc-PL/SQL控制語句-條件選擇語句-IF THEN ELSESQL
- PLSQL Language Referenc-PL/SQL靜態SQL-游標變數-建立游標變數SQL變數
- PLSQL Language Referenc-PL/SQL控制語句-迴圈語句-基本迴圈(EXIT語句)SQL
- PLSQL Language Referenc-PL/SQL靜態SQL-游標變數-游標變數賦值SQL變數賦值
- PLSQL Language Referenc-PL/SQL靜態SQL-游標變數-開啟和關閉游標變數SQL變數
- PLSQL Language Referenc-PL/SQL控制語句-條件選擇語句-搜尋CASESQL
- PLSQL Language Referenc-PL/SQL控制語句-條件選擇語句-簡單CASESQL
- PLSQL Language Referenc-PL/SQL靜態SQL-使用顯式游標OPEN-FETCH-CLOSE處理查詢結果集SQL
- PLSQL Language Referenc-PL/SQL靜態SQL-游標變數-游標變數作為宿主變數SQL變數
- PLSQL Language Referenc-PL/SQL控制語句-迴圈語句-FOR迴圈-FOR迴圈中的索引SQL索引
- PLSQL Language Referenc-PL/SQL動態SQL-練習:在動態SQL塊中呼叫子程式。SQL
- PLSQL Language Referenc-PL/SQL靜態SQL-游標變數-游標變數作為子程式引數SQL變數
- PLSQL Language Referenc-PL/SQL動態SQL-動態SQL中重複的佔位符名名稱SQL
- PLSQL Language Referenc-4PL/SQL控制語句-條件選擇語句-IF THENSQL
- PLSQL Language Referenc-PL/SQL動態SQL-SQL隱碼攻擊-SQL隱碼攻擊技術-語句修改SQL
- PLSQL Language Referenc-PL/SQL動態SQL-練習:在USING子句中未初始化的變數表示NULLSQL變數Null