ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 自治事务---函数

自治事务---函数

原创 Linux操作系统 作者:lsq_008 时间:2011-06-16 15:08:11 0 删除 编辑

当在select查询中调用function时,oracle不允许该function执行DML操作,而如果这个function被定义为自治事务,则不受此限制影响,如下测试

 

SQL> CREATE TABLE debug_output (msg VARCHAR2(200));

 

表已创建。

 

SQL> create or replace package debugging as

  2                function log_msg(msg varchar2) return varchar2;

  3  --              pragma restrict_references(log_msg,WNDS,RNDS);

  4             END debugging;

  5  /

 

程序包已创建。

 

SQL> create or replace package body debugging as

  2    function log_msg(msg varchar2) return varchar2 is

  3  -- pragma autonomous_transaction;

  4  begin

  5     insert into debug_output values(msg);

  6  commit;

  7  return msg;

  8  end;

  9  end debugging;

 10  /

 

程序包体已创建。

 

SQL>  select debugging.log_msg(ename) from emp where empno=9999;

 select debugging.log_msg(ename) from emp where empno=9999

        *

第 1 行出现错误:

ORA-14551: 无法在查询中执行 DML 操作

ORA-06512: 在 "SCOTT.DEBUGGING", line 5

 

执行查询时报错,无法在查询中执行DML操作,再将此function定义为自治事务:

 

SQL> create package debugging as

  2                function log_msg(msg varchar2) return varchar2;

  3                pragma restrict_references(log_msg,WNDS,RNDS);

  4             END debugging;

  5  /

 

程序包已创建。

 

SQL> create package body debugging as

  2    function log_msg(msg varchar2) return varchar2 is

  3   pragma autonomous_transaction;

  4  begin

  5     insert into debug_output values(msg);

  6  commit;

  7  return msg;

  8  end;

  9  end debugging;

 10  /

 

程序包体已创建。

 

SQL> declare

  2     my_emp_id number(6);

  3     my_last_name varchar2(25);

  4     my_count number;

  5  begin

  6     my_emp_id :=9999;

  7     select debugging.log_msg(ename) into my_last_name from emp where empno=my_emp_id;

  8     rollback;

  9  end;

 10  /

 

PL/SQL 过程已成功完成。

 

SQL> select * from debug_output;

 

MSG

--------------------------------------------------------------------------------

lsq

 

SQL> select debugging.log_msg(ename) from emp where empno=9999;

 

DEBUGGING.LOG_MSG(ENAME)

--------------------------------------------------------------------------------

lsq

 

SQL> select * from debug_output;

 

MSG

--------------------------------------------------------------------------------

lsq

lsq

 

可见每执行一次select查询,function都会执行一次,将数据插入到表debug_output中。

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

下一篇: 使用动态PL/SQL
请登录后发表评论 登录
全部评论
十余年大型金融及电信系统数据库管理经验,曾服务于中国建设银行、中国移动。对oracle,mysql数据库有深入了解。 擅长python开发,独立开发了开源数据库自动化监控运维平台Power Monitor。

注册时间:2008-02-29

  • 博文量
    325
  • 访问量
    1255265