Oracle管道函數(shù)pipelined?function的用法小結
Oracle 管道函數(shù)pipelined function簡單的使用
如果在函數(shù)(function)中加關鍵字 pipelined,就表明這是一個oracle管道函數(shù),其返回值類型必為 集合,體現(xiàn)出來的數(shù)據(jù)結構類似于表,即可以理解成,使用管道函數(shù)可以返回一張查詢表,可以是單行數(shù)據(jù)也可以是多行數(shù)據(jù),而不是平常函數(shù)返回的單行數(shù)據(jù)
這種返回多行數(shù)據(jù)在需要大數(shù)據(jù)量處理的時候很有用,且在復雜的方法下更好地去處理一些復雜的邏輯查詢
要使用管道函數(shù)的話需要先進行一下類型的類型的創(chuàng)建
首先我們創(chuàng)建一個類型對象
CREATE OR REPLACE Type test_Row_Type As Object ( test1 Varchar2(512), test2 Varchar2(3000), test3 Varchar2(3000), test4 Varchar2(3000), test5 Varchar2(3000), test6 Number, test7 Number )
然后我們創(chuàng)建嵌套的表
CREATE OR REPLACE TYPE test_Row_Type_TABLE AS TABLE OF test_Row_Type;
接下來創(chuàng)建一個臨時表,用來測試數(shù)據(jù)
create table TTTtable ( aaa VARCHAR2(50), bbb VARCHAR2(50), ccc VARCHAR2(50) )
其中數(shù)據(jù)如下

然后我們開始寫管道函數(shù)
CREATE OR REPLACE FUNCTION test_Row_pipelined(p_varchar in varchar2)
return test_Row_Type_TABLE
--關鍵字加在這里
pipelined as
p_num integer := 0;
ret test_Row_Type;
begin
--查詢臨時表數(shù)據(jù)
for sub_data in (select t.bbb, t.ccc
from TTTtable t
where t.aaa = p_varchar) loop
p_num := p_num + 1;
ret := test_Row_Type(p_num,
sub_data.bbb,
sub_data.ccc,
'',
'',
0,
0);
--將數(shù)據(jù)放入管道,pipe row()語法被用來返回該集合的單個元素
pipe row(ret);
end loop;
--函數(shù)使用一個空的return結束
return;
end;如果是使用
select test_Row_pipelined('a') from dual則返回的是<Collection>數(shù)據(jù),此時在PL/SQL中打開就是這樣的

同時,我們還可以使用這種語法
select * from table(test_Row_pipelined('a')) t結果也是這樣的,不過推薦使用這種方法,因為這種方式是可以使用where條件去進行過濾的
比如我們加上where
select t.* from table(test_Row_pipelined('a')) t where t.test1 = 1則得到的結果就是這樣的

這就是管道函數(shù)的最基本的用法
PS:在管道函數(shù)中可以進行DML操作,一般要加自治事務處理,但是不能直接對管道函數(shù)結果集進行DML操作,如果要對管道函數(shù)進行DML操作,建議做成視圖再加觸發(fā)器
使用管道函數(shù)制作分割函數(shù)的部分放在了這里
具體實現(xiàn)邏輯:
CREATE OR REPLACE FUNCTION test_Row_pipelined(p_insvar in varchar2,
p_delimiter in varchar2)
return test_Row_Type_TABLE
pipelined as
p_num integer := 1;
p_num1 integer;
p_length integer;
p_start integer := 1;
p_varchar varchar2(200);
ret test_Row_Type;
begin
--如果不是以分隔符結尾的,就拼接上去
select case
when (select count(1)
from dual
where p_insvar like '%' || p_delimiter) > 0 then
p_insvar
else
p_insvar || p_delimiter
end
into p_varchar
from dual;
--整個字符串的長度
select length(p_varchar) into p_length from dual;
--當起始長度大于整體長度的時候
while (p_start <= p_length) loop
--找到字符串與分隔符的分割后的下標
select instr(p_varchar, p_delimiter, p_start) into p_num1 from dual;
--如果沒有,則返回全部字符串,說明到了結尾了
if p_num1 = 0 then
ret := test_Row_Type(p_num,
substr(p_varchar, p_start),
p_num1,
p_start,
p_length,
0,
0);
pipe row(ret);
else
--否則,截取字符傳中,從p_start開始找到下標減去p_start的部分
ret := test_Row_Type(p_num,
substr(p_varchar, p_start, p_num1 - p_start),
p_num1,
p_start,
p_length,
0,
0);
pipe row(ret);
--新的起始點為下標加1
p_start := p_num1 + 1;
end if;
--序號加1
p_num := p_num + 1;
end loop;
return;
end;到此這篇關于Oracle管道函數(shù)pipelined function簡單的使用的文章就介紹到這了,更多相關oracle管道函數(shù)使用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
win7 64位操作系統(tǒng)中Oracle 11g + plsql安裝教程詳解(圖解)
這篇文章主要介紹了win7 64位操作系統(tǒng)中Oracle 11g + plsql安裝教程詳解(圖解),詳細的介紹了Oracle 11g 安裝的步驟,有興趣的可以了解一下。2017-04-04
oracle中commit之后進行數(shù)據(jù)回滾的方法
這篇文章主要介紹了oracle中commit之后如何進行數(shù)據(jù)回滾,本文給大家分享兩種方法,每種方法都給大家介紹的比較詳細,需要的朋友可以參考下2021-12-12
向Oracle數(shù)據(jù)庫的CLOB屬性插入數(shù)據(jù)報字符串過長錯誤
在項目中向數(shù)據(jù)庫的CLOB屬性插入一段篇文章(1000~2000)字就會報一個字符串過長的錯誤,有類似情況的朋友可以參考下2014-08-08
Oracle DATABASE LINK(DBLINK)創(chuàng)建與刪除方法
這篇文章主要介紹了Oracle DATABASE LINK(DBLINK)創(chuàng)建與刪除方法,需要的朋友可以參考下2016-02-02
Oracle生成不重復票號與LPAD,RPAD與NEXTVAL函數(shù)解析
這篇文章主要介紹了Oracle生成不重復票號與LPAD,RPAD與NEXTVAL函數(shù)解析,小編覺得還是挺不錯的,這里分享給大家,供需要的朋友參考。2017-10-10
如何使用Oracle PL/SQL 實現(xiàn)發(fā)送電子郵件功能(UTL_MAIL)
這篇文章主要介紹了Oracle PL/SQL 實現(xiàn)發(fā)送電子郵件功能,今天主要給大家介紹使用UTL_MAIL實現(xiàn)發(fā)送電子郵件功能,具體實例代碼跟隨小編一起看看吧2021-08-08
Oracle誤刪除表數(shù)據(jù)后的數(shù)據(jù)恢復詳解
這篇文章主要介紹了Oracle誤刪除表數(shù)據(jù)后的數(shù)據(jù)恢復詳解,需要的朋友可以參考下2015-08-08

