CREATE OR REPLACE TYPE Lookup_Row AS OBJECT
(
Idx NUMBER,
Text VARCHAR2(20)
)
create or replace type lookups_tab as table of lookup_row
CREATE OR REPLACE FUNCTION Lookups_Fn RETURN Lookups_Tab
PIPELINED IS
v_Row Lookup_Row;
BEGIN
FOR j IN 1 .. 10 LOOP
v_Row := CASE j
WHEN 1 THEN
Lookup_Row(1, 'one')
WHEN 2 THEN
Lookup_Row(2, 'TWO')
WHEN 3 THEN
Lookup_Row(3, 'three')
WHEN 4 THEN
Lookup_Row(4, 'FOUR')
WHEN 5 THEN
Lookup_Row(5, 'five')
WHEN 6 THEN
Lookup_Row(6, 'SIX')
WHEN 7 THEN
Lookup_Row(7, 'seven')
ELSE
Lookup_Row(j, 'other')
END;
PIPE ROW(v_Row);
END LOOP;
RETURN;
END Lookups_Fn;
很多人都知道,在普通的函数中,使用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 包要授权,要不提示没有定义 grant execute on dbms_lock to wms_ls;
dbms_lock.sleep(seconds => 1);
END LOOP;
PIPE ROW('All done!');
RETURN;
END;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21861353/viewspace-757571/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/21861353/viewspace-757571/