Das Erstellen einer Funktion in Oracle wollte ursprünglich eine Indextabelle zurückgeben, scheiterte jedoch. Da ich dachte, dass auch Text Informationen übertragen kann, kam mir plötzlich die Inspiration, den Rückgabewert im Textformat festzulegen.
Da die Menge der zurückgegebenen Daten möglicherweise groß ist und die Länge des Typs varchar2 knapp ist, wird der Rückgabewerttyp auf clob festgelegt.
Ich verwende die Testtabelle emp von Scott User. Dies ist die Funktionsdefinition:
create or replace function test_query_func(dept varchar2) return clob is type test_record is record (rec_empno emp.empno%type, rec_ename emp.ename%type, rec_job emp.job%type, rec_sal emp.sal%type); type test_query_arr is table of test_record index by binary_integer; cursor cur is select empno, ename, job, sal from emp where deptno = dept; test_query test_query_arr; i integer := 0; ss varchar2(200) := ''; res clob := '['; begin for c in cur loop i := i + 1; test_query(i) := c; end loop; for q in 1..test_query.count loop ss := '(''' || test_query(q).rec_empno || ''', ''' || test_query(q).rec_ename || ''', ''' || test_query(q).rec_job || ''', ''' || test_query(q).rec_sal || ''')'; if q < test_query.count then ss := ss || ','; end if; res := res || ss; end loop; res := res || ']'; return res; end;
Sie können den Rückgabewert dieser Funktion in pl/sql Developer testen:
begin dbms_output.put_line(test_query_func('30')); end;
Ausgabeergebnis:
[('7499', 'ALLEN', 'SALESMAN', '1600'),('7521', 'WARD', 'SALESMAN', '1250'),('7654', 'MARTIN', ' SALESMAN', '1250'),('7698', 'BLAKE', 'MANAGER', '2850'),('7844', 'TURNER', 'SALESMAN', '1500'),('7900', ' JAMES“, „CLERK“, „950“)]
wurde tatsächlich als ein Stil definiert, der Tupel-Unterelemente in einer Liste in Python enthält.
Das Folgende ist der Code in Python. Für die Verwendung von Python zum Herstellen einer Verbindung mit Oracle ist die cx_Oracle-Bibliothek erforderlich:
import cx_Oracle as ora; con = ora.connect('scott/scott@oradb'); cur = con.cursor(); cur.execute('select test_query_func(30) from dual'); res = cur.fetchall()[0][0].read(); cur.close(); con.close(); data = eval(res); import pandas as pd; df = pd.DataFrame(data, columns = ['empno', 'ename', 'job', 'sal']); print(df)
Auf diese Weise wird der von der Funktion in Oracle zurückgegebene lange Zeichenfolgenwert in ein DataFrame-Objekt umgewandelt:
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er für das Studium aller hilfreich sein wird. Ich hoffe auch, dass jeder Script House unterstützt.