結果を返す関数が必要です。匿名ブロックはそうではありません。
たとえば、データベースに関数を作成する必要があります。
create or replace function calculation return number is
c number := 0.2;
mn number := 1.5;
res number;
begin
return c + mn / 6.;
end;
/
次に、関数を呼び出すように Python コードを変更します。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])
その場で関数を作成することはできませんが、関数は単純なので、select ステートメントで作成fetchall()
し、リンクされたドキュメントで説明されているように使用して、結果を Python に返すことができます。タプルのリストを返すので、単一の行と列のみを求めている場合は、両方の 0番目のインデックスをfetchall()
すぐに選択できます。
>>> 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
>>>
また、バインド変数を使用して変数を呼び出しに渡し、execute()
必要に応じて Python でインスタンス化することもできます。
>>> 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 history@monitor>>
>>> result = cursor.fetchall()[0][0]
>>> result
0.45000000000000001
>>>
Pythonでこれをすべて行う方が簡単かもしれませんが...実際の状況はもっと複雑だと思いますか?