首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
Linux资讯 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>linux数据库>oracle>正文

如何使用pipeline function获得实时输出

http://www.oklinux.cn  2008-03-18  来源: 赛迪网 Alizze  会员收藏  游客收藏  【 】 

【赛迪网-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错误。

共2页: 上一页 1 [2] 下一页
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

上一篇:深入讲解Oracle数据库的多栏输出语句   下一篇:Linux终端图形库 Curses简介和实例分析


收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·深入讲解Oracle数据库的多栏输出语句
·教你快速掌握Oracle数据库的周数计算
·带你轻松接触Oracle DBLink的简单运用
·实例讲解"Oracle"数据库的分页显示
·Oracle数据库中如何对时间格式进行处理
·Oracle利用传输表空间导出导入数据的步骤
·讲解jython访问Oracle数据库的具体步骤
·通过幸存的Oracle文件修复Oracle9i数据
·详细讲解获得当前"SCN"的几种有效方式
·快速解决"Oracle"数据库中的常见问题
·用SYS执行全文索引的建立时出现权限不足
·实例讲解Oracle中一些关于权限的数据字典
·详细讲解Oracle表分区的相关概念及其优点
·教你快速掌握“外连接”的两种标准写法
·带你轻松掌握行分链与行迁移的相关概念
·在存储过程中拥有"role"权限的特殊性
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·讲解jython访问Oracle数据库的具体步骤
·Oracle利用传输表空间导出导入数据的步
·Oracle数据库中如何对时间格式进行处理
·深入讲解Oracle数据库的多栏输出语句
·教你快速掌握Oracle数据库的周数计算
·带你轻松接触Oracle DBLink的简单运用
·实例讲解"Oracle"数据库的分页显示
·通过幸存的Oracle文件修复Oracle9i数据
·详细讲解获得当前"SCN"的几种有效方式
·快速解决"Oracle"数据库中的常见问题
·用SYS执行全文索引的建立时出现权限不
·实例讲解Oracle中一些关于权限的数据字
  阅读排行
·如何修改遗失的MySQL的ROOT用户密码
·详解远程SHELL下安装配置RedHat ES 5的
·教你如何将MySQL数据库的密码恢复
·教你在MySQL从口令恢复设置的密码
·在 Oracle Enterprise Linux 上升级到
·oracle9i installation on fedora core
·Oracle Instant client介绍
·Oracle高级复制(同步复制)配置步骤详细
·用Oracle归档日志进行恢复的方法
·Oracle 数据库存储结构简介
·Linux下的Oracle数据库编程详解
·Linux下Oracle9i RMAN备份及恢复步骤介
·带你轻松接触一些比较常用的sql*plus命
·Oracle的快照复制
·Oracle HA 在Unix上双机环境的安装指南
网摘收藏: