ďťż
 
[oracle] Funkcja zwracajaca typ tablicowy ďťż
 
[oracle] Funkcja zwracajaca typ tablicowy
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

[oracle] Funkcja zwracajaca typ tablicowy



remg - 31-03-2007 00:06
[oracle] Funkcja zwracajaca typ tablicowy
  Witam,

Czy jest mozliwe w PL/SQL zrobienie funkcji zwracajacej typ tablicowy, ktora mozna wykorzystac w instrukcji SELECT?

Przykladowo mam w pakiecie zdefiniowany typ:
TYPE MojTyp IS TABLE OF MojaTabela%ROWTYPE INDEX BY BINARY_INTEGER;
Nastepnie definiuje sobie funkcje:

FUNCTION MojaFunkcja() RETURN MojTyp;

Niestety proba wywolania instrukcji SELECT * FROM ( SELECT Cast(SELECT MojaFunkcja() as MojTyp) from dual) zwraca mi blad "invalid datatype".





=?ISO-8859-2?Q?S=B3awomir_Szysz=B3o?= - 31-03-2007 00:06

  Dnia Fri, 30 Mar 2007 08:26:44 +0200, "remg" <remg@xgen.pl> wklepał(-a):

>Witam,
>
>Czy jest mozliwe w PL/SQL zrobienie funkcji zwracajacej typ tablicowy, ktora mozna wykorzystac w instrukcji SELECT?
>
>Przykladowo mam w pakiecie zdefiniowany typ:
>TYPE MojTyp IS TABLE OF MojaTabela%ROWTYPE INDEX BY BINARY_INTEGER;
>Nastepnie definiuje sobie funkcje:
>
>FUNCTION MojaFunkcja() RETURN MojTyp;
>
>Niestety proba wywolania instrukcji SELECT * FROM ( SELECT Cast(SELECT MojaFunkcja() as MojTyp) from dual) zwraca mi blad "invalid datatype".

Da się. Tyle, że tablicy asocjacyjnej nie zwrócisz - a to właśnie zrobiłeś.

CREATE TYPE obj_row AS OBJECT (
OWNER VARCHAR2(30),
OBJECT_NAME VARCHAR2(30),
);

CREATE TYPE obj_tab AS TABLE OF obj_row;
--------------------------
CREATE OR REPLACE FUNCTION get_all_objects RETURN obj_tab PIPELINED AS
BEGIN
FOR cur IN (SELECT owner, object_name, status
FROM all_objects)
LOOP
PIPE ROW(obj_row(cur.owner, cur.object_name));
END LOOP;
RETURN;
END;

SELECT * FROM TABLE( CAST (get_all_objects as obj_tab) ) JAKIS_ALIAS;

PIPE ROW jest o tyle dobrym rozwiązaniem, że zwraca rekordy "na bieżąco", nie
czekając na utworzenie całego recordsetu.
--
Sławomir Szyszło mailto:slaszysz@poczta.onet.pl
Primus inter FAQires & Grand Inquisitor no.0 of pl.comp.bazy-danych
FAQ pl.comp.bazy-danych http://www.dbf.pl/faq/
Archiwum http://groups.google.com/groups?grou...mp.bazy-danych




remg - 03-04-2007 00:07

 
Użytkownik "Sławomir Szyszło" <slaszysz@poczta.onet.pl> napisał w wiadomości
news:eujtjv.19k.1@slaszysz.poczta.onet.pl...
> Da się. Tyle, że tablicy asocjacyjnej nie zwrócisz - a to właśnie
zrobiłeś.
>
> CREATE TYPE obj_row AS OBJECT (
> OWNER VARCHAR2(30),
> OBJECT_NAME VARCHAR2(30),
> );
>
> CREATE TYPE obj_tab AS TABLE OF obj_row;
> --------------------------
> CREATE OR REPLACE FUNCTION get_all_objects RETURN obj_tab PIPELINED AS
> BEGIN
> FOR cur IN (SELECT owner, object_name, status
> FROM all_objects)
> LOOP
> PIPE ROW(obj_row(cur.owner, cur.object_name));
> END LOOP;
> RETURN;
> END;
>
> SELECT * FROM TABLE( CAST (get_all_objects as obj_tab) ) JAKIS_ALIAS;
>
> PIPE ROW jest o tyle dobrym rozwiązaniem, że zwraca rekordy "na bieżąco",
nie
> czekając na utworzenie całego recordsetu.

Dzieki, wlasnie tez do tego doszedlem.
Natomiast jeszcze jedna kwestia. Jak w zapytaniu wyciagajacym dane z takiego
typu, odwolac sie do poszczegolnych pol?
Wywolanie:
SELECT JAKIS_ALIAS.jakies_pole FROM TABLE( CAST (get_all_objects as
obj_tab) ) JAKIS_ALIAS
niestety nie dziala




TW - 03-04-2007 00:07

  On 2 Kwi, 08:21, "remg" <r...@xgen.pl> wrote:
> Użytkownik "Sławomir Szyszło" <slasz...@poczta.onet.pl> napisał wwiadomościnews:eujtjv.19k.1@slaszysz.poczta.onet. pl...
>
>
>
>
>
> > Da się. Tyle, że tablicy asocjacyjnej nie zwrócisz - a to właśnie
> zrobiłeś.
>
> > CREATE TYPE obj_row AS OBJECT (
> > OWNER VARCHAR2(30),
> > OBJECT_NAME VARCHAR2(30),
> > );
>
> > CREATE TYPE obj_tab AS TABLE OF obj_row;
> > --------------------------
> > CREATE OR REPLACE FUNCTION get_all_objects RETURN obj_tab PIPELINED AS
> > BEGIN
> > FOR cur IN (SELECT owner, object_name, status
> > FROM all_objects)
> > LOOP
> > PIPE ROW(obj_row(cur.owner, cur.object_name));
> > END LOOP;
> > RETURN;
> > END;
>
> > SELECT * FROM TABLE( CAST (get_all_objects as obj_tab) ) JAKIS_ALIAS;
>
> > PIPE ROW jest o tyle dobrym rozwiązaniem, że zwraca rekordy "na bieżąco",
> nie
> > czekając na utworzenie całego recordsetu.
>
> Dzieki, wlasnie tez do tego doszedlem.
> Natomiast jeszcze jedna kwestia. Jak w zapytaniu wyciagajacym dane z takiego
> typu, odwolac sie do poszczegolnych pol?
> Wywolanie:
> SELECT JAKIS_ALIAS.jakies_pole FROM TABLE( CAST (get_all_objects as
> obj_tab) ) JAKIS_ALIAS
> niestety nie dziala- Ukryj cytowany tekst -
>
> - Pokaż cytowany tekst -

Hm, u mnie działa. Oracle 9i. Jakiś błąd?
<code>
SELECT JAKIS_ALIAS.OWNER FROM TABLE( CAST (get_all_objects as
obj_tab) ) JAKIS_ALIAS;
</code>





remg - 03-04-2007 00:07

 
Użytkownik "TW" <twrzodak@gmail.com> napisał w wiadomości
news:1175502101.929322.218590@p15g2000hsd.googlegr oups.com...
On 2 Kwi, 08:21, "remg" <r...@xgen.pl> wrote:

Hm, u mnie działa. Oracle 9i. Jakiś błąd?
<code>
SELECT JAKIS_ALIAS.OWNER FROM TABLE( CAST (get_all_objects as
obj_tab) ) JAKIS_ALIAS;
</code>

Dzieki, o to mi wlasnie chodzilo
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    Oracle, SQL, PL/SQL. Jak =?ISO-8859-2?Q?napisa=E6_zapytanie=2C?==?ISO-8859-2?Q?_kt=F3re_zwr=F3ci_nazw=EA_atrybutu=2C_kt=F3reg o?==?ISO-8859-2?Q?_warto=B6ci_spe=B3niaj=B1_zadany_warunek?= Oracle 19g +Insert +Insert +Insert... [oracle] zapytanie dynamiczne z =?ISO-8859-2?Q?=22dynamiczn=B1_?==?ISO-8859-2?Q?nazw=B1_tabeli=22?= [Oracle] jak =?ISO-8859-2?Q?ograniczy=E6_pami=EA=E6_dla_se?==?ISO-8859-2?Q?rwera=3F?= =?ISO-8859-2?Q?=5BOT=5D_Zdany_egzamin_Oracle_1Z0-007_a?==?ISO-8859-2?Q?_brak_informacji_na_stronie_Prometric_-_czy?==?ISO-8859-2?Q?_co=B6_nie_tak=3F?= [oracle] czy da =?ISO-8859-2?Q?si=EA_z_poziomu_procedury_?==?ISO-8859-2?Q?zrobi=E6_kopi=EA_zapasow=B1=3F?= [oracle 10g] czy =?ISO-8859-2?Q?mo=BFna_wy=B3=B1czy=E6_wszys?==?ISO-8859-2?Q?tkie_wi=EAzy_w_schemacie=3F?= MSSQL Express czy Oracle Express =?iso-8859-2?q?[oracle]_Jak_sprawdzi=E6_wielko=B6=E6_tabeli_=3F=3F?= =?ISO-8859-2?Q?Poszukjue_ksi=B1=BFki_"Oracle_?= =?ISO-8859-2?Q?optymalizacja_wydajno=B6ci"..?=
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • numervin.keep.pl
  • Cytat

    Decede mihi sole - nie zasłaniaj mi słonca.
    Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści
    Hoc fac - tak czyń.
    A tergo - od tyłu; z tyłu.
    I czarne włosy posiwieją. Safona

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com