oracle管道函數是一類特殊的函數,oracle管道函數返回值類型必須為集合,下面將介紹oracle管道函數的語法。
在普通的函數中,使用dbms_output輸出的信息,需要在服務器執行完整個函數后一次性的返回給客戶端。如果需要在客戶端實時的輸出函數執行過程中的一些信息,在oracle9i以后可以使用管道函數(pipeline function)。
關鍵字PIPELINED表明這是一個oracle管道函數,oracle管道函數的返回值類型必須為集合,在函數中,PIPE ROW語句被用來返回該集合的單個元素,函數以一個空的RETURN 語句結束,以表明它已經完成。
1 create or replace type MsgType as table of varchar2(4000); 2 / 3 4 create or replace function f_pipeline_test return MsgType 5 PIPELINED as 6 begin 7 for i in 1 .. 10 loop 8 pipe row('Iteration ' || i || ' at ' || systimestamp); 9 sys.dbms_lock.sleep(1); 10 end loop; 11 pipe row('All done!'); 12 return; 13 end; 14 /
若以上function執行過程中提示錯誤:“Error: PLS-00201: 必須說明標識符 'DBMS_LOCK'”,則是由於授權的原因,可通過如下方案解決:
conn system/bitservice@ttonline as sysdba; grant execute on dbms_lock to tt;
為了在sql*plus演示管道函數的執行效果,我們需要將arraysize為1,否則服務器會按照默認的15來向客戶端返回信息,這會影響我們的測試效果。
set arraysize 1 select * from table( f_pipeline_test );
如果要在pipeline中執行DML操作,則必須使用自治事務,否則會報ORA-14551錯誤。
在oracle9205及其之后的版本中,在pipeline function中使用自治事務,則必須在pipe row之前提交或者回滾事務,否則會報ORA-06519錯誤。