oracle管道函數的用法

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

相關文章
相關標籤/搜索