È necessario un per restituire un risultato. Un blocco anonimo non lo farà.
È necessario create a function nel database, per esempio:
create or replace function calculation return number is
c number := 0.2;
mn number := 1.5;
res number;
begin
return c + mn/6.;
end;
/
quindi modificare il codice Python per chiamare la funzione, utilizzando, 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])
Non è possibile creare una funzione al volo ma la tua funzione è abbastanza semplice da poter essere eseguita in una istruzione select e utilizzare fetchall()
come descritto nella documentazione collegata per restituire il risultato a Python. fetchall()
restituisce un elenco di tuple, quindi se si è solo dopo una riga e una colonna è possibile selezionare immediatamente l'indice 0 th di entrambi.
>>> 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
>>>
È inoltre possibile passare le variabili nelle vostre execute()
chiamata variabili utilizzando bind e quindi li un'istanza in Python, se necessario:
>>> 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
>>>
Anche se potrebbe essere più semplice di fare tutto questo in Python ... Suppongo che la tua situazione attuale sia più complicata?
E 'possibile creare la funzione temporaneamente "al volo" in modo che la base di dati dimenticare dopo aver chiamato db.Close()? –
Si prega di consultare il mio aggiornamento @ user1946052. – Ben
La tabella "duale" ha qualche significato o è una sorta di segnaposto? –