# [Oracle] Kleines Beispiel zu Pipelined Table Functions in PL/SQL



## Thomas Darimont (31. Mai 2012)

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)

```
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 
	
	
	



```
SELECT ROWNUM rn FROM dual CONNECT BY LEVEL < rowcnt
```
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)

```
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:

```
--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:

```
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


----------

