分类: Oracle
2008-03-30 14:51:01
来源:赛迪网 作者:Alizze |
很多人都知道,在普通的函数中,使用dbms_output输出的信息,需要在服务器执行完整个函数后一次性的返回给客户端。但你如果需要在客户端实时的输出函数执行过程中的一些信息,在Oracle 9i以后则可以使用管道函数(pipeline function)。
PIPELINED(关键字)表明这是一个管道函数,管道函数的返回值类型必须为集合,在函数中,PIPE ROW语句被用来返回该集合的单个元素,函数则以一个空的RETURN语句结束,以表明它已经完成。
在sql*plus中执行该函数,大家需要首先设置arraysize为1,否则服务器会按照默认的15来向客户端返回信息,这会影响我们的测试效果。
11 rows selected.
如果要在pipeline中执行DML操作,则必须使用自治事务,否则会报ORA-14551错误
在Oracle 9205及其之后的版本中,在pipeline function中使用自治事务,则必须在pipe row之前提交或者回滚事务,否则会报ORA-06519错误。
此处是由于在9205中修复Bug 2711518导致了自治事务的行为有所改变。如果系统从9205之前的版本升级到之后的版本,需要保证pipeline function的行为和以前版本一致,Oracle提供了一个10946事件来设置和以前版本的兼容性,如果在管道函数中使用了select for update的cursor,则必须设置event回归以前的特性,否则即使在pipe row之前commit也会导致出现ORA-1002错误。
|