Oracle管道函數(shù)pipelined?function的用法小結(jié)
Oracle 管道函數(shù)pipelined function簡(jiǎn)單的使用
如果在函數(shù)(function)中加關(guān)鍵字 pipelined
,就表明這是一個(gè)oracle管道函數(shù),其返回值類型必為 集合,體現(xiàn)出來的數(shù)據(jù)結(jié)構(gòu)類似于表,即可以理解成,使用管道函數(shù)可以返回一張查詢表,可以是單行數(shù)據(jù)也可以是多行數(shù)據(jù),而不是平常函數(shù)返回的單行數(shù)據(jù)
這種返回多行數(shù)據(jù)在需要大數(shù)據(jù)量處理的時(shí)候很有用,且在復(fù)雜的方法下更好地去處理一些復(fù)雜的邏輯查詢
要使用管道函數(shù)的話需要先進(jìn)行一下類型的類型的創(chuàng)建
首先我們創(chuàng)建一個(gè)類型對(duì)象
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)建一個(gè)臨時(shí)表,用來測(cè)試數(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 --關(guān)鍵字加在這里 pipelined as p_num integer := 0; ret test_Row_Type; begin --查詢臨時(shí)表數(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()語法被用來返回該集合的單個(gè)元素 pipe row(ret); end loop; --函數(shù)使用一個(gè)空的return結(jié)束 return; end;
如果是使用
select test_Row_pipelined('a') from dual
則返回的是<Collection>
數(shù)據(jù),此時(shí)在PL/SQL中打開就是這樣的
同時(shí),我們還可以使用這種語法
select * from table(test_Row_pipelined('a')) t
結(jié)果也是這樣的,不過推薦使用這種方法,因?yàn)檫@種方式是可以使用where條件去進(jìn)行過濾的
比如我們加上where
select t.* from table(test_Row_pipelined('a')) t where t.test1 = 1
則得到的結(jié)果就是這樣的
這就是管道函數(shù)的最基本的用法
PS:在管道函數(shù)中可以進(jìn)行DML操作,一般要加自治事務(wù)處理,但是不能直接對(duì)管道函數(shù)結(jié)果集進(jìn)行DML操作,如果要對(duì)管道函數(shù)進(jìn)行DML操作,建議做成視圖再加觸發(fā)器
使用管道函數(shù)制作分割函數(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 --如果不是以分隔符結(jié)尾的,就拼接上去 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; --整個(gè)字符串的長(zhǎng)度 select length(p_varchar) into p_length from dual; --當(dāng)起始長(zhǎng)度大于整體長(zhǎng)度的時(shí)候 while (p_start <= p_length) loop --找到字符串與分隔符的分割后的下標(biāo) select instr(p_varchar, p_delimiter, p_start) into p_num1 from dual; --如果沒有,則返回全部字符串,說明到了結(jié)尾了 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開始找到下標(biāo)減去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); --新的起始點(diǎn)為下標(biāo)加1 p_start := p_num1 + 1; end if; --序號(hào)加1 p_num := p_num + 1; end loop; return; end;
到此這篇關(guān)于Oracle管道函數(shù)pipelined function簡(jiǎn)單的使用的文章就介紹到這了,更多相關(guān)oracle管道函數(shù)使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
win7 64位操作系統(tǒng)中Oracle 11g + plsql安裝教程詳解(圖解)
這篇文章主要介紹了win7 64位操作系統(tǒng)中Oracle 11g + plsql安裝教程詳解(圖解),詳細(xì)的介紹了Oracle 11g 安裝的步驟,有興趣的可以了解一下。2017-04-04oracle中commit之后進(jìn)行數(shù)據(jù)回滾的方法
這篇文章主要介紹了oracle中commit之后如何進(jìn)行數(shù)據(jù)回滾,本文給大家分享兩種方法,每種方法都給大家介紹的比較詳細(xì),需要的朋友可以參考下2021-12-12向Oracle數(shù)據(jù)庫(kù)的CLOB屬性插入數(shù)據(jù)報(bào)字符串過長(zhǎng)錯(cuò)誤
在項(xiàng)目中向數(shù)據(jù)庫(kù)的CLOB屬性插入一段篇文章(1000~2000)字就會(huì)報(bào)一個(gè)字符串過長(zhǎng)的錯(cuò)誤,有類似情況的朋友可以參考下2014-08-08Oracle DATABASE LINK(DBLINK)創(chuàng)建與刪除方法
這篇文章主要介紹了Oracle DATABASE LINK(DBLINK)創(chuàng)建與刪除方法,需要的朋友可以參考下2016-02-02Oracle生成不重復(fù)票號(hào)與LPAD,RPAD與NEXTVAL函數(shù)解析
這篇文章主要介紹了Oracle生成不重復(fù)票號(hào)與LPAD,RPAD與NEXTVAL函數(shù)解析,小編覺得還是挺不錯(cuò)的,這里分享給大家,供需要的朋友參考。2017-10-10如何使用Oracle PL/SQL 實(shí)現(xiàn)發(fā)送電子郵件功能(UTL_MAIL)
這篇文章主要介紹了Oracle PL/SQL 實(shí)現(xiàn)發(fā)送電子郵件功能,今天主要給大家介紹使用UTL_MAIL實(shí)現(xiàn)發(fā)送電子郵件功能,具體實(shí)例代碼跟隨小編一起看看吧2021-08-08Oracle誤刪除表數(shù)據(jù)后的數(shù)據(jù)恢復(fù)詳解
這篇文章主要介紹了Oracle誤刪除表數(shù)據(jù)后的數(shù)據(jù)恢復(fù)詳解,需要的朋友可以參考下2015-08-08