Thomas Darimont
Erfahrenes Mitglied
Hallo,
hier mal ein kleines Beispiel zu Pipeline Table Functions
(http://docs.oracle.com/cd/E11882_01/appdev.112/e10765/pipe_paral_tbl.htm)
in Oracle PL/SQL.
Unsere Package Specification (example.pks)
Das Konstrukt
verwende ich hierbei zum generieren einer gewünschten Anzahl von Zeilen.
Hier weitere Beispiele dazu:
http://www.tutorials.de/relationale...zeugung-von-beliebig-vielen-dummy-zeilen.html
http://www.tutorials.de/relationale...iken-zur-kuenstlichen-record-generierung.html
Unsere Package Implementierung (example.pkb)
Aufruf:
Ausgabe:
eine weites schöneres und umfangreicheres Beispiel zu Pipeline Table Functions in Oracle PL/SQL findet man hier:
http://www.tutorials.de/relationale...ndungsbeispiel-pipelined-table-functions.html
Gruß Tom
hier mal ein kleines Beispiel zu Pipeline Table Functions
(http://docs.oracle.com/cd/E11882_01/appdev.112/e10765/pipe_paral_tbl.htm)
in Oracle PL/SQL.
Unsere Package Specification (example.pks)
SQL:
CREATE OR REPLACE
PACKAGE example AS
TYPE example_row IS RECORD ( val0 NUMBER, val1 NUMBER);
TYPE example_table IS TABLE OF example_row;
/**
* Generiert {rowcnt} viele Zeilen vom Typ {example_row}
*/
FUNCTION gen_example_rows(rowcnt NUMBER) RETURN example_table PIPELINED;
TYPE NUM_ARRAY IS TABLE OF NUMBER;
/**
* Generiert {rowcnt} viele ganzzahlige aufsteigende Zahlen vom Typ Number
*/
FUNCTION gen_numbers(rowcnt number) RETURN NUM_ARRAY PIPELINED;
END example;
Das Konstrukt
SQL:
SELECT ROWNUM rn FROM dual CONNECT BY LEVEL < rowcnt
Hier weitere Beispiele dazu:
http://www.tutorials.de/relationale...zeugung-von-beliebig-vielen-dummy-zeilen.html
http://www.tutorials.de/relationale...iken-zur-kuenstlichen-record-generierung.html
Unsere Package Implementierung (example.pkb)
SQL:
CREATE OR REPLACE
PACKAGE BODY example AS
FUNCTION gen_example_rows(rowcnt NUMBER) RETURN example_table PIPELINED AS
current_row example_row;
BEGIN
FOR rec IN (SELECT ROWNUM rn FROM dual CONNECT BY LEVEL < rowcnt) LOOP
current_row.val0 := rec.rn;
current_row.val1 := rec.rn * 2;
pipe ROW(current_row);
END LOOP;
END gen_example_rows;
FUNCTION gen_numbers(rowcnt NUMBER) RETURN NUM_ARRAY PIPELINED AS
BEGIN
FOR rec IN (SELECT ROWNUM rn FROM dual CONNECT BY LEVEL < rowcnt) LOOP
pipe ROW(rec.rn);
END LOOP;
END gen_numbers;
END example;
Aufruf:
SQL:
--künstliche Spalte column_name
SELECT COLUMN_VALUE AS num FROM TABLE(example.gen_numbers(10));
--Splaten aus Record Definition (example.example_row)
SELECT * FROM TABLE(example.gen_example_rows(10));
--Beispiel für Join zwischen zwei Table-Functions
SELECT
a.*,
b.*
FROM TABLE(example.gen_numbers(5)) A
JOIN TABLE(example.gen_example_rows(10)) b
ON a.column_value = b.val0;
Ausgabe:
Code:
NUM
---
1
2
3
4
5
6
7
8
9
9 rows selected
VAL0 VAL1
---- ----
1 2
2 4
3 6
4 8
5 10
6 12
7 14
8 16
9 18
9 rows selected
COLUMN_VALUE VAL0 VAL1
------------ ---- ----
1 1 2
2 2 4
3 3 6
4 4 8
eine weites schöneres und umfangreicheres Beispiel zu Pipeline Table Functions in Oracle PL/SQL findet man hier:
http://www.tutorials.de/relationale...ndungsbeispiel-pipelined-table-functions.html
Gruß Tom