關於 pipe row的用法(轉,待做實驗)
為了讓 PL/SQL 函式返回資料的多個行,必須透過返回一個 REF CURSOR 或一個資料集合來完成。REF CURSOR 的這種情況侷限於可以從查詢中選擇的資料,而整個集合在可以返回前,必須進行具體化。Oracle 9i 透過引入的管道化表函式糾正了後一種情況。表函式是返回整個行的集(通常作為一個集合)的函式,可以直接從 SQL 語句中進行查詢,就好像它是一個真正的資料庫表一樣。管道化表函式與之相似,但是它像在構建時一樣返回資料,而不是一次全部返回。管道化表函式更加有效,因為資料可以儘可能快地返回。
管道化表函式必須返回一個集合。在函式中,PIPE ROW 語句被用來返回該集合的單個元素,該函式必須以一個空的 RETURN 語句結束,以表明它已經完成。一旦我們建立了上述函式,我們就可以使用 TABLE 運算子從 SQL 查詢中呼叫它。
管道化表函式經常被用來把資料從一種型別轉化成另一種型別。
下面是用 Pipelined Table 實現 split 函式的例子:
CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR2 (4000);<wbr>
CREATE OR REPLACE FUNCTION fn_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2)<wbr>
<wbr>RETURN ty_str_split PIPELINED <wbr> <wbr>
IS<wbr>
j INT := 0;<wbr>
i INT := 1;<wbr>
len INT := 0;<wbr>
len1 INT := 0;<wbr>
str VARCHAR2 (4000);<wbr>
BEGIN<wbr>
len := LENGTH (p_str);<wbr>
len1 := LENGTH (p_delimiter);<wbr>
WHILE j < len<wbr>
LOOP<wbr>
j := INSTR (p_str, p_delimiter, i);<wbr>
IF j = 0<wbr>
THEN<wbr>
j := len;<wbr>
str := SUBSTR (p_str, i);<wbr>
<wbr>PIPE ROW (str); <wbr> <wbr>
IF i >= len<wbr>
THEN<wbr>
EXIT;<wbr>
END IF;<wbr>
ELSE<wbr>
str := SUBSTR (p_str, i, j - i);<wbr>
i := j + len1;<wbr>
<wbr>PIPE ROW (str); <wbr> <wbr>
END IF;<wbr>
END LOOP;<wbr>
RETURN;<wbr>
END fn_split;<wbr>
/<wbr>
<wbr>測試: <wbr> <wbr>SELECT * FROM TABLE (fn_split ('1;;12;;123;;1234;;12345', ';;'));<wbr>
結果:<wbr>
1<wbr>
12<wbr>
123<wbr>
1234<wbr>
12345<wbr>
<wbr>又<wbr> <wbr><wbr>一個簡單的例子: <wbr> <wbr>CREATE TYPE mytype AS OBJECT (<wbr>
field1 NUMBER,<wbr>
field2 VARCHAR2 (50)<wbr>
);<wbr>
CREATE TYPE mytypelist AS TABLE OF mytype;<wbr>
CREATE OR REPLACE FUNCTION pipelineme<wbr>
<wbr>RETURN mytypelist PIPELINED <wbr>IS <wbr>
v_mytype mytype;<wbr>
BEGIN<wbr>
FOR v_count IN 1 .. 20<wbr>
LOOP<wbr>
v_mytype := mytype (v_count, 'Row ' || v_count);<wbr>
<wbr>PIPE ROW (v_mytype); <wbr> END LOOP; <wbr>
RETURN;<wbr>
END pipelineme;<wbr>
SELECT * FROM TABLE (pipelineme);<wbr><wbr>
FIELD1 FIELD2<wbr>
------ ------------------------<wbr>
1 Row 1<wbr>
2 Row 2<wbr>
3 Row 3<wbr>
4 Row 4<wbr>
5 Row 5<wbr>
6 Row 6<wbr>
7 Row 7<wbr>
8 Row 8<wbr>
9 Row 9<wbr>
10 Row 10<wbr>
11 Row 11<wbr>
12 Row 12<wbr>
13 Row 13<wbr>
14 Row 14<wbr>
15 Row 15<wbr>
16 Row 16<wbr>
17 Row 17<wbr>
18 Row 18<wbr>
19 Row 19<wbr>
20 Row 20<wbr>
[@more@]
管道化表函式必須返回一個集合。在函式中,PIPE ROW 語句被用來返回該集合的單個元素,該函式必須以一個空的 RETURN 語句結束,以表明它已經完成。一旦我們建立了上述函式,我們就可以使用 TABLE 運算子從 SQL 查詢中呼叫它。
管道化表函式經常被用來把資料從一種型別轉化成另一種型別。
下面是用 Pipelined Table 實現 split 函式的例子:
CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR2 (4000);
CREATE OR REPLACE FUNCTION fn_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2)
IS
j INT := 0;
i INT := 1;
len INT := 0;
len1 INT := 0;
str VARCHAR2 (4000);
BEGIN
len := LENGTH (p_str);
len1 := LENGTH (p_delimiter);
WHILE j < len
LOOP
j := INSTR (p_str, p_delimiter, i);
IF j = 0
THEN
j := len;
str := SUBSTR (p_str, i);
IF i >= len
THEN
EXIT;
END IF;
ELSE
str := SUBSTR (p_str, i, j - i);
i := j + len1;
END IF;
END LOOP;
RETURN;
END fn_split;
/
結果:
1
12
123
1234
12345
field1 NUMBER,
field2 VARCHAR2 (50)
);
CREATE TYPE mytypelist AS TABLE OF mytype;
CREATE OR REPLACE FUNCTION pipelineme
v_mytype mytype;
BEGIN
FOR v_count IN 1 .. 20
LOOP
v_mytype := mytype (v_count, 'Row ' || v_count);
RETURN;
END pipelineme;
SELECT * FROM TABLE (pipelineme);
FIELD1 FIELD2
------ ------------------------
1 Row 1
2 Row 2
3 Row 3
4 Row 4
5 Row 5
6 Row 6
7 Row 7
8 Row 8
9 Row 9
10 Row 10
11 Row 11
12 Row 12
13 Row 13
14 Row 14
15 Row 15
16 Row 16
17 Row 17
18 Row 18
19 Row 19
20 Row 20
[@more@]
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/11423276/viewspace-985511/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- pipe row的用法, Oracle split 函式寫法.Oracle函式
- oracle實驗-RMAN的PIPE介面Oracle
- [轉]關於oracle with as用法Oracle
- 分享一個關於Cookie做的實驗結果Cookie
- Oracle vs PostgreSQL Develop(19) - PIPE ROWOracleSQLdev
- 關於JDBC用法的練習 (轉)JDBC
- 關於oracle中的row pieceOracle
- 關於SHOW_SPACE()工具的用法(轉)
- 關於hibernate的 No row with the given identifier existsIDE
- 關於oracle with as用法Oracle
- 關於ELF檔案格式的實驗
- 關於append sql hint的實驗APPSQL
- 關於delete cascade的小實驗delete
- oracle系統包——DBMS_PIPE用法Oracle
- 關於AI、關於chatGPT的幾十種用法AIChatGPT
- vue中 關於$emit的用法VueMIT
- 關於JavaScript中arguments的用法JavaScript
- 關於linux的test用法Linux
- 關於lag函式的用法函式
- ROW_NUMBER() OVER() 分析函式的用法函式
- ROW_NUMBER() OVER函式的基本用法函式
- 關於 VC 編譯的猜想與試驗 (轉)編譯
- 一個關於JAVA GC的小實驗JavaGC
- 管道函式及表函式的測試PIPELINED__PIPE ROW函式
- Flutter之Row/Column用法詳解Flutter
- 關於Python的super用法研究Python
- 關於SHOW_SPACE()工具的用法
- 關於enq: TX - row lock contention行鎖的總結ENQ
- 關於windows installer的一點小經驗(轉)Windows
- element-ui中row-class-name的用法UI
- 關於計算機網路的 Wireshark 實驗計算機網路
- 一次關於偷拍的網路實驗
- 關於JS迴圈效率小實驗JS
- 關於 lambda 在 WebDriverWait () 中的用法實在不明白WebAI
- oracle實驗記錄 (關於表實際大小)Oracle
- 關於angularJS的一些用法AngularJS
- css關於/deep/的解釋和用法CSS
- 關於sed的用法。 - V2EXV2EX