Sie benötigen eine Funktion, um ein Ergebnis zurückzugeben. Ein anonymer Block wird nicht.
Sie müssen create a function in der Datenbank, zum Beispiel:
create or replace function calculation return number is
c number := 0.2;
mn number := 1.5;
res number;
begin
return c + mn/6.;
end;
/
Dann wird Ihr Python-Code ändern, um die Funktion aufzurufen, verwenden, callfunc()
db = cx_Oracle.connect(user, pass, dsn_tns)
cursor = db.cursor()
try:
result = cursor.callfunc('calculation', float)
print result
except cx_Oracle.DatabaseError as e:
err, = e.args
print "\n".join([str(err.code),err.message,err.context])
Es ist nicht möglich zu erstellen eine Funktion im laufenden Betrieb, aber Ihre Funktion ist einfach genug, dass Sie es in einer Select-Anweisung tun können und fetchall()
verwenden, wie in der verknüpften Dokumentation beschrieben um das Ergebnis an Python zurückzugeben. fetchall()
gibt eine Liste von Tupeln zurück. Wenn Sie nur nach einer einzelnen Zeile und Spalte suchen, können Sie sofort den Index 0.th von beiden auswählen.
>>> import cx_Oracle
>>> db = cx_Oracle.connect('****','****','****')
>>> cursor = db.cursor()
>>> SQL = """select 0.2 + 1.5/6. from dual"""
>>> try:
... cursor.execute(SQL)
... result = cursor.fetchall()[0][0]
... except cx_Oracle.DataBaseError, e:
... pass
...
<__builtin__.OracleCursor on <cx_Oracle.Connection to ****@****>>
>>> result
0.45000000000000001
>>>
Sie können auch die Variablen in Ihre execute()
Anruf mit Bind-Variablen übergeben und damit sie in Python instanziiert, falls erforderlich:
>>> c = 0.2
>>> mn = 1.5
>>> SQL = """select :c + :mn/6. from dual"""
>>> bind_vars = { 'c' : c, 'mn' : mn }
>>> cursor.execute(SQL, bind_vars)
<__builtin__.OracleCursor on <cx_Oracle.Connection to [email protected]>>
>>> result = cursor.fetchall()[0][0]
>>> result
0.45000000000000001
>>>
Obwohl es vielleicht einfacher sein, all dies in Python zu tun ... Ich nehme an, Ihre tatsächliche Situation ist komplizierter?
Ist es möglich, die Funktion vorübergehend „on the fly“ in einer Art und Weise zu erstellen drucken, dass die Datenbank vergessen db.close nach dem Aufruf von()? –
Bitte beachten Sie mein Update @ user1946052. – Ben
Hat die Tabelle "dual" irgendeine Bedeutung oder ist sie eine Art Platzhalter? –