[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.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
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.pldoc.pisz.plpdf.pisz.plnumervin.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 |
|