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

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

Neue Beiträge

Zurück