cx_oracle datensätze aus procedure

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
z0mg
User
Beiträge: 4
Registriert: Dienstag 5. Dezember 2006, 21:07

Ich habe folgendes problem:
aus einer tabelle sollen x datensätze gelesen und ausgegeben werden.
also mehrere zeilen dieser tabelle.
das ganze in einer stored procedure.

ich schreibe erstmal die daten in einen cursor:

cursor data is select ...

dann hatte ich versucht über dbms_output.put_line den cursor schrittweise auszugeben:

FETCH data into ...
exit when data%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(...);

das funktioniert alles über sql plus(direkt an der konsole) wenn ich vorher "set serveroutput on" eingegeben hatte.
leider funktioniert der "set serveroutput on" befehl in der procedure nicht.

wenn ich nun in python cursor.execute('set serveroutput on') benutze gibt's einen fehler.

ohne den serveroutput kann aber mein python cursor wohl keine daten aufnehmen.
cursor.callproc('proc',[x])
fehler: InterfaceError: not a query

ich brauche also eine möglichkeit mehrere datensätze aus einer procedure in mein python programm zu holen.
z0mg
User
Beiträge: 4
Registriert: Dienstag 5. Dezember 2006, 21:07

hab's mir selbst beantwortet :wink:

man kreiere sich einen REFCURSOR:

CREATE OR REPLACE PACKAGE MY_PACK AS
TYPE MY_CUR IS REF CURSOR;
END MY_PACK;
/

und in der FUNCTION gibt man dann als RETURN wert MY_PACK.MY_CUR an

nach dem IS
dann noch eine result variable anlegen -> rescur MY_PACK.MY_CUR;

in der funktion benutzt man das select dann wie folgt:

OPEN rescur FOR select ...

zum schluss noch return(rescur);

im pythonscript sieht das dann so aus (nach dem anlegen eines cursors):

result=cursor.callfunc('func',cx_Oracle.CURSOR,(param1,param2,param3))

und das war's :D
Antworten