2017-12-18 1 views
1

Ich habe versucht, eine Funktion erstellen (vielleicht wird die Prozedur besser sein?), Die eine Tabelle zurückgeben. Zur Zeit habe ich folgendes:SQL Oracle, Rückgabe einer Tabelle aus einer Funktion

CREATE OR REPLACE TYPE rowx AS OBJECT 
(
    nam1 VARCHAR2 (100), 
    nam2  VARCHAR2 (100) 
); 
/ 

CREATE OR REPLACE TYPE tablex 
IS TABLE OF rowx; 
/

CREATE OR REPLACE FUNCTION example(FS varchar2) 
RETURN tablex 
IS 
tab tablex; 

BEGIN 
select y.ident as PARENT, x.ident as CHILD into tab 
from relation2 rt 
inner join plate x on rt.child = x.id 
inner join plate y on rt.parent =y.id 
where x.ident like 'string1' or y.ident like 'string2'; 

RETURN tab; 
END; 

Nach Kompilation über Funktion empfange ich ORA-00947. Irgendwelche Tipps?

+0

Es wäre schön, wenn es eine einfache Möglichkeit, dies zu tun wäre, aber soweit ich weiß, die nächste Sache Oracle bietet pipeline Funktionen; Hier ist eine Verknüpfung mit Details. https://www.akadia.com/services/ora_pipe_functions.html Persönlich denke ich, dass sie in der Regel mehr Mühe als sie wert sind. – kfinity

Antwort

1

Schauen Sie sich dieses Beispiel an; hilft es?

Meine TEST-Tabelle repräsentiert Ihre Tabellen. Diese Funktion gibt eine Auflistung zurück, die dann zusammen mit dem TABLE-Operator in der SELECT-Anweisung verwendet wird.

SQL> create table test (nam1 varchar2(10), nam2 varchar2(10)); 

Table created. 

SQL> insert into test values ('Little', 'Foot'); 

1 row created. 

SQL> insert into test values ('Stack', 'Overflow'); 

1 row created. 

SQL> create or replace type t_tf_row as object (nam1 varchar2(10), nam2 varchar2(10)); 
    2/

Type created. 

SQL> create or replace type t_tf_tab is table of t_tf_row; 
    2/

Type created. 

SQL> 
SQL> create or replace function get_tab_tf return t_tf_tab as 
    2 l_tab t_tf_tab := t_tf_tab(); 
    3 begin 
    4 for cur_r in (select nam1, nam2 from test) loop 
    5  l_tab.extend; 
    6  l_tab(l_tab.last) := t_tf_row(cur_r.nam1, cur_r.nam2); 
    7 end loop; 
    8 return l_tab; 
    9 end; 
10/

Function created. 

SQL> 
SQL> select * From table(get_Tab_tf); 

NAM1  NAM2 
-------------------- 
Little Foot 
Stack  Overflow 

SQL> 
+0

Ja, es war sehr hilfreich. Ich basierte auf deinem Beispiel und ich habe erreicht, was ich wollte. Vielen Dank! – Hadean

2

Ihre Abfrage wählt zwei Skalarwerte aus und versucht, sie in eine Tabelle eines Objekttyps einzufügen. Dieser Typ hat zwei Felder, aber es gibt keine automatische Umwandlung. Also müssen Sie das Objekt explizit erstellen, was Sie als Teil der Abfrage tun können.

Sie sollten auch eine Bulk-Abfrage verwenden, um Ihre Sammlung zu füllen:

select rowx(y.ident, x.ident) 
bulk collect into tab 
from relation2 rt 
... 
Verwandte Themen