网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>数据库技术>>Oracle技术>>Oracle开发>查看文档  
  如何使用pipeline function获得实时输出     
  文章作者:未知  文章来源:赛迪网技术社区  
  查看:80次  录入:管理员--2008-03-18  
 

【赛迪网-it技术报道】很多人都知道,在普通的函数中,使用dbms_output输出的信息,需要在服务器执行完整个函数后一次性的返回给客户端。但你如果需要在客户端实时的输出函数执行过程中的一些信息,在oracle 9i以后则可以使用管道函数(pipeline function)。

pipelined(关键字)表明这是一个管道函数,管道函数的返回值类型必须为集合,在函数中,pipe row语句被用来返回该集合的单个元素,函数则以一个空的return语句结束,以表明它已经完成。

create or replace type msgtype as table of varchar2(4000);
/

create or replace function f_pipeline_test
return msgtype
pipelined
as
begin
    for i in 1 .. 10
    loop
        pipe row( 'iteration ' || i || ' at ' || systimestamp );
        dbms_lock.sleep(1);
    end loop;
    pipe row( 'all done!' );
    return;
end;
/

在sql*plus中执行该函数,大家需要首先设置arraysize为1,否则服务器会按照默认的15来向客户端返回信息,这会影响我们的测试效果。

sql> set arraysize 1
sql> select * from table( f_pipeline_test );

column_value
-----------------------------------------------------
iteration 1 at 14-feb-08 02.13.18.273988000 pm +08:00
iteration 2 at 14-feb-08 02.13.19.275988000 pm +08:00
iteration 3 at 14-feb-08 02.13.20.277767000 pm +08:00
iteration 4 at 14-feb-08 02.13.21.279591000 pm +08:00
iteration 5 at 14-feb-08 02.13.22.281366000 pm +08:00
iteration 6 at 14-feb-08 02.13.23.283189000 pm +08:00
iteration 7 at 14-feb-08 02.13.24.283965000 pm +08:00
iteration 8 at 14-feb-08 02.13.25.285785000 pm +08:00
iteration 9 at 14-feb-08 02.13.26.286570000 pm +08:00
iteration 10 at 14-feb-08 02.13.27.288387000 pm +08:00
all done!

11 rows selected.

如果要在pipeline中执行dml操作,则必须使用自治事务,否则会报ora-14551错误

create or replace function f_pipeline_testdml
return msgtype
pipelined
as
begin
    for i in 1 .. 10
    loop
        insert into test values(1);
        pipe row( 'insert into test values( ' || i || ') success at ' || systimestamp );
        dbms_lock.sleep(1);
    end loop;
    pipe row( 'all done!' );
    return;
end;
/

sql>  select * from table( f_pipeline_testdml );
 select * from table( f_pipeline_testdml )
                      *
error at line 1:
ora-14551: cannot perform a dml operation inside a query
ora-06512: at "ning.f_pipeline_testdml", line 8
create or replace function f_pipeline_testdml
return msgtype
pipelined
as
pragma autonomous_transaction;
begin
for i in 1 .. 10
loop
insert into test values(1);
commit;
pipe row( 'insert values ' || i || ' success at ' || systimestamp );
dbms_lock.sleep(1);
end loop;
pipe row( 'all done!' );
return;
end;
/

sql> select * from table( f_pipeline_testdml );

column_value
--------------------------------------------------------------------------------
insert values  1  success at 14-feb-08 02.16.47.855158000 pm +08:00
insert values  2  success at 14-feb-08 02.16.48.865559000 pm +08:00
insert values  3  success at 14-feb-08 02.16.49.867377000 pm +08:00
insert values  4  success at 14-feb-08 02.16.50.873154000 pm +08:00
insert values  5  success at 14-feb-08 02.16.51.874942000 pm +08:00
insert values  6  success at 14-feb-08 02.16.52.880781000 pm +08:00
insert values  7  success at 14-feb-08 02.16.53.882543000 pm +08:00
insert values  8  success at 14-feb-08 02.16.54.894348000 pm +08:00
insert values  9  success at 14-feb-08 02.16.55.896153000 pm +08:00
insert values  10 success at 14-feb-08 02.16.56.901904000 pm +08:00
all done!

11 rows selected.

在oracle 9205及其之后的版本中,在pipeline function中使用自治事务,则必须在pipe row之前提交或者回滚事务,否则会报ora-06519错误。

create or replace function f_pipeline_testdml
return msgtype
pipelined
as
pragma autonomous_transaction;
begin
for i in 1 .. 10
loop
insert into test values(1);
pipe row( 'insert values ' || i || ' success at ' || systimestamp );
dbms_lock.sleep(1);
end loop;
pipe row( 'all done!' );
commit;
return;
end;
/

sql> select * from table( f_pipeline_testdml );
select * from table( f_pipeline_testdml )
                     *
error at line 1:
ora-06519: active autonomous transaction detected and rolled back
ora-06512: at "ning.f_pipeline_testdml", line 10

此处是由于在9205中修复bug 2711518导致了自治事务的行为有所改变。如果系统从9205之前的版本升级到之后的版本,需要保证pipeline function的行为和以前版本一致,oracle提供了一个10946事件来设置和以前版本的兼容性,如果在管道函数中使用了select for update的cursor,则必须设置event回归以前的特性,否则即使在pipe row之前commit也会导致出现ora-1002错误。

alter system set event = "10946 trace name context forever, level 8" scope=spfile;

 
 
上一篇: 深入讲解oracle数据库的多栏输出语句    下一篇: oracle数据库中如何对时间格式进行处理
  相关文档
将Oracle的数据倒入EXCEL中的方法 04-23
带你深入了解管理oracle实例的相关方法 (1) 04-23
详细讲解oracle i/o子系统的配置和设计 (1) 04-30
通过Backup Exec实施Oracle来灾难恢复 05-27
oracle data的一个常见问题计算时间差 01-28
快速掌握解决ora-00844错误的实用方法 03-07
如何利用oracle的全文索引实现切词功能 02-27
Oracle数据库的空间管理技巧 01-15
解析:如何修改 oracle 数据库表的大小 11-21
Oracle 10g数据库的安全性和身份管理 06-03
oracle中用表外键来保证系统参照完整性 (1) 01-24
如何才能解决job的interval输入参数过长 03-24
oracle11g之初体验 数据中心自动化等功能 09-24
分析Oracle下导出某用户所有表的方法 05-13
教你轻松掌握oracle与foxpro的数据转换 11-15
如何检测oracle的可用性和表空间容量 02-28
windows下oracle数据库进程的启动和关闭 06-10
教你在windows环境下kill掉oracle的线程 06-04
带你深入的了解执着并购中的--甲骨文 11-15
oracle数据库exp imp按用户导出导入实例 (1) 03-31
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息