2017-10-02 1 views
0

In einer Anwendung können GUI-Elemente mit SQL-Anweisungen initialisiert werden.So geben Sie mehrere Werte aus einer Funktion ohne globale Typen zurück

Da sich die zugrunde liegende Datenbankstruktur ändern kann, bevorzuge ich es, die Struktur zu verbergen und stattdessen ein Oracle-Paket als Schnittstelle zu verwenden. Für einzelne Werte funktioniert dieser Ansatz gut mit Funktionen wie:

SELECT myPackage.getNameByID(1337) $GUIElement 
FROM DUAL; 

Jetzt habe ich das Problem der Initialisierung einer Liste. Ursprünglicher Code:

SELECT name $GUIList 
FROM myTable; 

Um mehrere Werte von einer Funktion zurückzugeben, muss ich einen neuen SQL-Typ definieren. Wenn die Funktion ein TABLE OF VARCHAR2 gibt diesen Code funktioniert:

SELECT COLUMN_VALUE $GUIList 
FROM TABLE(myPackage.getNames()) 

Leider habe ich keine Rechte habe, um neue Typen auf der produktiven Datenbank zu erstellen. Gibt es also in Oracle eine Möglichkeit, ein ähnliches Verhalten zu erhalten, ohne einen neuen Datentyp zu definieren? Ich habe in SYS_REFCURSER geschaut, aber es scheint nicht richtig zu funktionieren.

+0

Warum richten Sie es nicht ein, so dass die Funktion immer eine Tabelle zurückgibt? –

+0

Soweit ich weiß, benötigen Sie einen neuen SQL-Typ, um eine Tabelle zurückzugeben. – Thanthla

+0

Sie können dies tun, indem Sie eine Datenkassette in PL/SQL erstellen. Siehe z.B. hier: http://www.oracle-developer.net/display.php?id=422 und hier: https://github.com/method5/method4 –

Antwort

1

Was ist mit Xmltype. Die Funktion gibt immer den xml-Typ zurück. Und zur Verarbeitung dieses Objekts verwenden Sie xmltable.

So etwas wie das.

create or replace function return_params return xmltype is 
result xmltype; 
begin 

select xmlelement(params,xmlagg(xmlelement(param,xmlforest(name,value,data_type)))) into result from (
select 'param_name1' name, 'param_value1' value , 'varchar2' data_type from dual 
union all 
select 'param_name2' name, 'param_value2' value , 'varchar2' data_type from dual 
union all 
select 'param_name3' name, 'param_value3' value , 'varchar2' data_type from dual 
); return result; 
end; 

select * from xmltable('/PARAMS/PARAM' passing return_params 
       columns name varchar2(1000) path 'NAME' 
         ,value varchar2(1000) path 'VALUE' 
         ,data_type varchar2(1000) path 'DATA_TYPE' 
       ) 
+0

Sehr schöne Lösung. Ich werde ein paar Tage warten, und wenn nichts eleganteres vorgeschlagen wird, werde ich Ihre Antwort akzeptieren. – Thanthla

Verwandte Themen