oracle管道函數的用法


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錯誤。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM