Ich bin auf der Suche nach einer Tabelle mit Ergebnissen aus einer Oracle-Funktion. Die Verwendung eines Cursors wäre am einfachsten, aber die Anwendung, in der ich arbeiten muss, akzeptiert keinen Cursor als Rückgabewert. Die Alternative besteht darin, einen Typ zu erstellen (der wahrscheinlich in ein Paket verpackt ist), um dieser Funktion zu folgen. Es scheint jedoch etwas überflüssig zu sein, mehrere Typen zu erstellen (ich habe 4+ Funktionen zum Schreiben), nur um Tabellenergebnisse zurückgeben zu können. Gibt es eine Alternative, die ich vermisse?Wie kann eine Tabelle von einer Oracle-Funktion ohne benutzerdefinierten Typ oder Cursor zurückgegeben werden?
Antwort
UPDATE: Siehe den ersten Kommentar für TABELLE Lösung ohne Größe.
Return ein VARRAY oder verwenden Sie eine PIpelined Funktion von ihnen abzufragen.
Für VARRAY Blick in this Artikel für ein Detail. Codebeispiel von dort:
CREATE OR REPLACE TYPE EMPARRAY is VARRAY(20) OF VARCHAR2(30) / CREATE OR REPLACE FUNCTION getEmpArray RETURN EMPARRAY AS l_data EmpArray := EmpArray(); CURSOR c_emp IS SELECT ename FROM EMP; BEGIN FOR emp_rec IN c_emp LOOP l_data.extend; l_data(l_data.count) := emp_rec.ename; END LOOP; RETURN l_data;
ENDE;
Für PiPELINED Funktionen Kasse here. Code-Beispiel:
create or replace function Lookups_Fn return lookups_tab pipelined is v_row lookup_row; begin for j in 1..10 loop v_row := case j when 1 then lookup_row (1, 'one') --... when 7 then lookup_row (7, 'seven') else lookup_row (j, 'other') end; pipe row (v_row); end loop; return; end Lookups_Fn; / select * from table (Lookups_Fn);
Warum ein VARRAY verwenden und auf maximal z. 20 Ergebnisse? Verwenden Sie TABLE: ERSTELLEN ODER ERSETZEN TYPE EMPARRAY ist TABLE OF VARCHAR2 (30). –
WEIL, er sagte, er versuchte zu vermeiden, TYPES zu verwenden. Lesen Sie die OP –
@Mark Pipeline AVOID Tipes, ist es nicht? – FerranB
Sie könnten immer XML aus Ihrer Funktion zurück, wenn das den Anwendungsentwickler paßt.
XML kann in Oracle auf verschiedene Arten generiert werden, je nachdem, was Sie installiert haben und welche Version Sie verwenden.
XMLTYPE ist in bestimmten Kontexten sehr nützlich und kann mithilfe der integrierten Funktionen XMLElement, XMLAttributes, XMLAgg usw. aus SQL generiert werden. Wenn der Client XMLTYPE nicht unterstützt, kann er einfach in CLOB-Werte umgewandelt werden.
vielleicht einfachste, wenn auch nicht die beste (IMO) Option ist das dbms_xmlgen Paket zu verwenden:
SQL> set serveroutput on size 1000;
SQL> exec dbms_output.put_line(dbms_xmlgen.getXML('select * from dual'));
Ausgang:
<?xml version="1.0"?>
<ROWSET>
<ROW>
<DUMMY>X</DUMMY>
</ROW>
</ROWSET>
, dass Sie Ihre "Tabelle" Ergebnisse in einer einzigen gibt CLOB-Wert
Überflüssig? Ich denke, dass die GROUP BY-Klausel überflüssig ist, wenn ich eine Aggregatfunktion in der Auswahlliste habe, aber hey, es ist was es ist. –
Welche Art von Anwendung, die eine Datenbank verwendet, akzeptiert keine Cursors ??? – kurosch