ITPub博客

首页 > 数据库 > Oracle > PLSQL Language Referenc-PL/SQL静态SQL-自治事务(二)

PLSQL Language Referenc-PL/SQL静态SQL-自治事务(二)

原创 Oracle 作者: luisedalian 时间:2014-03-17 08:26:41 0 删除 编辑

事务上下文

主事务与嵌套程序共享它的上下文,但不与自治事务共享上下文。当一个自治程序调用另一个程序或递归调用,则程序不会共享事务上下文;当一个自治程序调用另一个非自治程序,则程序共享相同的事务上下文。

事务可见性

当自治事务提交时,自治事务所做的改变可以被其它事务看到。

如果隔离级别设置的为READ COMMIT(默认),则当主事务再次继续时,自治事务中的改变对于主事务是可见的;如果将主事务的隔离级别设置为SERIALIZABLE,则当主事务再次继续时,自治事务中的改变对于主事务是不可见的

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

注意:事务属性只作用于设置它的事务。光标属性不被自治事务影响。

声明自治事务

声明自治事务,使用AUTONOMOUS_TRANSACTION

技巧:虽然这个编译指示可以被放在声明的部分的任何地方,但一般放在最顶端。

不能对整个包或ADT应用AUTONOMOUS_TRANSACTION编译指示,但可以把它应用到包的每个子程序或ADT的每个方法上。

--在包中声明自治函数

CREATE OR REPLACE PACKAGE emp_actions AS

    FUNCTION raise_salary (emp_id NUMBER, sal_raise NUMBER)

    RETURN NUMBER;

END emp_actions;

/

CREATE OR REPLACE PACKAGE BODY emp_actions AS 

    FUNCTION raise_salary (emp_id NUMBER, sal_raise NUMBER)

    RETURN NUMBER IS

        --自治事务声明

        PRAGMA AUTONOMOUS_TRANSACTION;

        new_sal NUMBER(8,2);

    BEGIN

        UPDATE employees SET salary =

            salary + sal_raise WHERE employee_id = emp_id;

        COMMIT;

        SELECT salary INTO new_sal FROM employees

        WHERE employee_id = emp_id;

        RETURN new_sal;

    END raise_salary;

END emp_actions;

 

--声明自治的单独的过程

CREATE OR REPLACE PROCEDURE lower_salary

    (emp_id NUMBER, amount NUMBER)

AS

    PRAGMA AUTONOMOUS_TRANSACTION;

BEGIN

    UPDATE employees

    SET salary =  salary - amount

    WHERE employee_id = emp_id;

 

    COMMIT;

END lower_salary;

 

--声明自治PL/SQL

DROP TABLE emp;

CREATE TABLE emp AS SELECT * FROM employees;

 

DECLARE

    PRAGMA AUTONOMOUS_TRANSACTION;

    emp_id NUMBER(6)   := 200;

    amount NUMBER(6,2) := 200;

BEGIN

    UPDATE employees

    SET salary =  salary - amount

    WHERE employee_id = emp_id;

 

    COMMIT;

END;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17013648/viewspace-1122931/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-02-06

  • 博文量
    1986
  • 访问量
    5678373