PIPELINED FUNCTION aneb jak na data dynamicky

Výsledný SQL dotaz v Oracle data­bázi lze maxi­málně dyna­micky ovlivnit/generovat pomocí tak­zva­ných PIPELINED FUNKCÍ. Jejich pou­žití si uká­žeme na násle­du­jí­cím příkladu:

[Eng­lish ver­sion — PIPELINED FUNCTION — how to get data dyna­mi­cally]

Vytvo­říme nové datové typy Per­son­Type a PersonTypeSet

Do těchto dato­vých typů budeme uklá­dat naše data.

CREATE TYPE PersonType AS OBJECT
(
  id number,
  first_name varchar2(2000),
  last_name varchar2(2000),
  description varchar2(2000)
)
/

CREATE TYPE PersonTypeSet AS TABLE OF PersonType
/

Vytvo­říme PIPELINED FUNKCI

CREATE OR REPLACE FUNCTION GET_PERSONS RETURN PersonTypeSet
PIPELINED
IS
    l_one_row PersonType := PersonType(NULL, NULL, NULL, NULL);

BEGIN

    FOR i IN 1..10 LOOP
        l_one_row.id := i;
        l_one_row.first_name := 'Johnny (' || i || ')';
        l_one_row.last_name := 'English';
        l_one_row.description := 'British Super Agent';
        PIPE ROW(l_one_row);
    END LOOP;

    RETURN;
END GET_PERSONS;
/

Podí­váme se na data (SQL dotaz nad pipe­li­ned funkcí!)

SQL> SELECT * FROM TABLE(GET_PERSONS());

Pipelined function result (SQL query)

UPDATE 14.09.2010 — Při výskytu chyby “ORA-22905: nelze při­stu­po­vat k řád­kám z položky tabulky, která není vno­řená” je nutné zavo­lat CAST takto: “SELECT * FROM TABLE(CAST(GET_PERSONS() AS Per­son­Ty­pe­Set));”pro­tože Oracle potře­buje znát objek­tový typ před tím, než nahradí hvěz­dičku názvy sloupců!

Post to Twitter

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Můžete používat následující HTML značky a atributy: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>