日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Oracle Pipelined Table Functions简介

發布時間:2024/9/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle Pipelined Table Functions简介 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

//概況??
//基本上,當你希望一個PLSQL(或者java或者c)程序作為數據源,而不是表,??
//你可能會用到管道函數(pipelined function).??
//pipelined function操作起來就像一張表??
//一個pl/sql函數可能會用于數據倉庫的數據庫里面,轉換大量的數據。??

?


//這可能包括格式化一系列轉換數據,它們是不同的函數執行后得到的結果。??
//在oracle database 9i之前,大量的數據轉換,既需要顯著的內存開銷,??
//又需要在轉換的每個階段將數據存儲在中間表里面。在這兩種情況下,??
//加載進程都會致使性能的下降。?

//使用PL/SQL表函數,可以在數據轉換的時候有效的減少開銷。PL/SQL表函數??
//可以接收和返回多行,交付這些數據,當他們準備好的時候,而不是一次性的處理;??
//而且PL/SQL表函數還可以并行執行操作。??
--??
//實例1:生成隨機數??
//你怎么樣用一條sql語句生成在1-49之間的互不相同的隨機數呢???
//我們可能從一組已經生成的數中去查詢(注意下面的最內層的查詢);??
//任何擁有大于等于49行記錄的表都可以做到。若不使用管道函數的話,下面是最好的解決辦法:??
select r??
? from (select r??
?????????? from (select rownum r??
?????????????????? from all_objects??
????????????????? where rownum < 50)??
????????? order by dbms_random.value)??
where rownum <= 6;??
/??
???????? R??
----------??
??????? 36??
??????? 40??
??????? 30??
??????? 26??
???????? 3??
??????? 42??
//我們將最內部的查詢叫做內嵌視圖,它產生了1..49這些數,我們通過DBMS_RANDOM.VALUE,??
//來對這49個數進行排序。我們將結果集打包在另一個內嵌視圖中只返回6行,??
//如果我們反復的執行這個查詢,我們每次得到的6個數都會不同。??
--??
//這種問題經常出現,或許不是關于怎么生成6個隨機數,而是怎么樣得到N行???
//例如,我們想要得到包括在2011-05-01和2011-05-15之間的所有日期;怎樣不用"真實"表,??
//解決這個問題呢?Oracle9i/10g內置的PIPELINED function將會告訴你答案。??
//我們編寫一個PL/SQL函數,它工作起來就像一個表。我們需要借助于sql的集合類型,??
//它描述了PIPELINED function返回的值。這個例子中,我們選擇了一個數的表,我們創建的虛擬表,??
//它將會返回下面的數:1,2,3,...N :??
create type array??
??? as table of number;??
/??
//下一步,我們創建這個PIPELINED function,它將會接收一個輸入來限制返回的行數。如果沒有輸入,??
//這個函數將會一直長時間的生成很多行(所以,在這個查詢中,一定要細心,確保使用rownum,??
//或其他的數來限制產生的行數)。??
//位于第4行的PIPELINED關鍵字,將會使這個函數工作起來想像一個表:??
create function??
? gen_numbers(n in number default null)??
? return array??
? PIPELINED??
? as?
? begin??
???? for i in 1 .. nvl(n,999999999)??
???? loop??
???????? pipe row(i);??
???? end loop;??
???? return;??
? end;??
/??
//假設我們需要3行數據,我們現在可以使用下面的其中一個查詢實現:??
select * from TABLE(gen_numbers(3));??
COLUMN_VALUE??
------------??
?????????? 1??
?????????? 2??
?????????? 3??
or??
select * from TABLE(gen_numbers)??
where rownum <= 3;??
COLUMN_VALUE??
------------??
?????????? 1??
?????????? 2??
?????????? 3??
//現在我們準備去回答最開始的問題了,語句如下:??
select *??
? from (??
? select *??
??? from (select * from table(gen_numbers(49)))??
? order by dbms_random.random??
? )??
where rownum <= 6??
/??
COLUMN_VALUE??
------------??
????????? 27??
????????? 24??
????????? 46??
????????? 17??
????????? 44??
????????? 45??
//我們可以使用這個虛擬表的功能去做很多事情,例如產生一個范圍內的所有日期:??
select to_date('2011-05-01','yyyy-mm-dd')+??
??????? column_value-1??
? from TABLE(gen_numbers(15))??
/??
TO_DATE('2'?
-----------??
2011-05-01???
2011-05-02???
2011-05-03???
2011-05-04???
2011-05-05???
2011-05-06???
2011-05-07???
2011-05-08???
2011-05-09???
2011-05-10???
2011-05-11???
2011-05-12???
2011-05-13???
2011-05-14???
2011-05-15???
//注意上面我們使用了column_value,這是一個PIPELINED function返回的默認列的名字。??
//典型的Pipelined例子??
//當使用PL/SQL表函數時,下面是典型的步驟??
//? ·生產函數必須在其定義中使用PIPELINED關鍵字??
//? ·生產函數必須使用一個out參數,這個參數是一個集合,對應到返回的結果集??
//? ·一旦有結果產生,通過使用PIPE ROW關鍵字將其輸送給消費函數??
//? ·生產函數必須以RETURN語句結束,但是不需要制定返回值??
//? ·消費函數必須使用TABLE關鍵字,將從PIPELINE function返回的行集當成一個常規表??
//第一步.定義一個返回的行集的格式。??
//?????? 在這個實例中,我們返回這三個類型的值:int,date,varchar2(25)??
CREATE OR REPLACE TYPE myObjectFormat???
AS OBJECT??
(??
? A?? INT,??
? B?? DATE,??
? C?? VARCHAR2(25)??
)??
/??
//下一步,為第一步定義的類型定義一個集合類型??
CREATE OR REPLACE TYPE myTableType??
?? AS TABLE OF myObjectFormat??
/??
//最后,生產函數被打包到一個包里面,它是一個pipelined function就像被pipelined關鍵字所標記一樣。??
CREATE OR REPLACE PACKAGE myDemoPack??
AS??
????? FUNCTION prodFunc RETURN myTableType PIPELINED;??
END;??
/??
CREATE OR REPLACE PACKAGE BODY myDemoPack AS??
FUNCTION prodFunc RETURN myTableType PIPELINED IS??
BEGIN??
? FOR i in 1 .. 5??
??? LOOP??
????? PIPE ROW (myObjectFormat(i,SYSDATE+i,'Row '||i));??
??? END LOOP;??
??? RETURN;??
? END;??
END;??
/??
//測試結果:??
alter session set nls_date_format='yyyy-mm-dd';??
SELECT * FROM TABLE(myDemoPack.prodFunc());??
??????????????? A B?????????? C??
----------------- ----------- ------------??
??????????????? 1 2011-05-05? Row 1??
??????????????? 2 2011-05-06? Row 2??
??????????????? 3 2011-05-07? Row 3??
??????????????? 4 2011-05-08? Row 4??
??????????????? 5 2011-05-09? Row 5??
//結論:??
//在一個select語句里面,我們需要一個數據源,而不是一張表的話,Pipelined functions非常有用。

總結

以上是生活随笔為你收集整理的Oracle Pipelined Table Functions简介的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲国内在线 | 影音先锋成人 | 嫩草国产精品 | 亚洲综合视频一区 | 国产精品一区二区人人爽 | 精品人妻大屁股白浆无码 | 亚洲免费av网 | 亚洲大胆人体 | 久久久久久久久国产精品一区 | 91黄色片| 亚洲网在线观看 | 日本高清中文字幕 | 日韩一区二区免费播放 | 麻豆爱爱 | 国产sm调教视频 | 成人先锋av | 亚洲国产视频在线 | 日韩成人在线免费观看 | 精品人妻少妇一区二区三区 | 99视频在线精品免费观看2 | 半推半就一ⅹ99av | 操操操视频 | 亚洲AV无码成人精品区麻豆 | 操bbbbb| 夜色在线影院 | 自拍视频在线观看 | 黄色片不卡 | 日本黄页网站免费大全 | 国产精品成人一区二区网站软件 | 日韩在线1 | 久久艹国产精品 | 国产suv精品一区二区 | 丰满多毛的大隂户视频 | 特级精品毛片免费观看 | 欧美高清视频一区二区三区 | 欧美男人亚洲天堂 | 熟妇人妻无乱码中文字幕真矢织江 | 手机在线看黄色 | 五月天婷婷基地 | 免费无遮挡无码永久视频 | 老女人丨91丨九色 | 午夜一区二区视频 | 风韵少妇性饥渴推油按摩视频 | 老司机精品视频在线播放 | 婷婷五月情 | 日韩a√ | 日韩欧美在线观看 | 全黄性性激高免费视频 | 无码乱人伦一区二区亚洲 | 国产日产精品一区二区 | 国产亚洲欧美日韩精品 | www.youjizz.com日本 | 蜜桃av色偷偷av老熟女 | 欧美激情国产在线 | 青草视频免费看 | 亚洲成人黄色av | 国产精品色片 | 一区二区三区黄色录像 | 女人舌吻男人茎视频 | 麻豆影视在线观看 | 国产一区二区三区在线视频观看 | 久久乐视频 | 青青草精品 | www.av天天 | 日韩av在线资源 | 国产成人精品综合久久久久99 | 一区二区久久精品66国产精品 | 木下凛凛子av一区二区三区 | 六月丁香激情网 | 欧美a v在线播放 | 激情久久五月天 | 四虎影院新网址 | 麻豆回家视频区一区二 | 日日干日日操 | 性久久久久久久 | 亚洲av无码国产精品麻豆天美 | 狠狠五月天 | 日本免费一区二区三区 | 姐姐你真棒插曲快来救救我电影 | 少妇与公做了夜伦理69 | 成人av黄色 | 久久蜜桃av一区二区天堂 | 亚洲性视频网站 | 亚洲天堂五码 | 男人的天堂a在线 | 色狠狠一区 | 久草视频在线观 | 亚洲裸体视频 | 超碰在线a | 国产在线精品一区 | 女女同性女同一区二区三区九色 | 天天干夜夜想 | 日韩片在线观看 | 国产精品极品 | 日韩中文第一页 | 天堂色在线| 天天干天天狠 | 国产福利小视频 | 日日射天天射 |