oracle管道函數是一類特殊的函數,oracle管道函數返回值類型必須爲集合,下面將介紹oracle管道函數的語法。sql
在普通的函數中,使用dbms_output輸出的信息,須要在服務器執行完整個函數後一次性的返回給客戶端。若是須要在客戶端實時的輸出函數執行過程當中的一些信息,在oracle9i之後能夠使用管道函數(pipeline function)。服務器
關鍵字PIPELINED代表這是一個oracle管道函數,oracle管道函數的返回值類型必須爲集合,在函數中,PIPE ROW語句被用來返回該集合的單個元素,函數以一個空的RETURN 語句結束,以代表它已經完成。oracle
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來向客戶端返回信息,這會影響咱們的測試效果。oop
set arraysize 1 select * from table( f_pipeline_test );
若是要在pipeline中執行DML操做,則必須使用自治事務,不然會報ORA-14551錯誤。測試
在oracle9205及其以後的版本中,在pipeline function中使用自治事務,則必須在pipe row以前提交或者回滾事務,不然會報ORA-06519錯誤。spa