プロシージャがsys_refcursorを返すときに作成されるカーソルを拡張しようとしています。解決方法How to extend OracleCursor class from cx_Oracleはconnection.cursor()では機能しますが、sys_refcursorでは機能しません。cx_oracleの拡張方法sys_refcursor Curorクラス
import cx_Oracle as cxo
class MyCursor(cxo.Cursor):
def helloWorld(self):
print "helloWorld"
class MyConnection(cxo.Connection):
def cursor(self):
return MyCursor(self)
if __name__ == '__main__':
conStr = 'ants/<password>'
db = MyConnection(conStr)
c = db.cursor()
c.execute("""
create or replace procedure cx_test_cursor(
val4 out sys_refcursor
) is
begin
open val4 for
select 1 a from dual union all
select 2 from dual;
end;
""")
result = c.callproc('ants.cx_test_cursor', [c.var(cxo.CURSOR)])
c.execute('drop procedure cx_test_cursor')
print result
result[0].helloWorld()
結果
[<cx_Oracle.Cursor on <__main__.MyConnection to user [email protected]>>]
Traceback (most recent call last):
File "cx_test2.py", line 32, in <module>
result[0].helloWorld()
AttributeError: 'cx_Oracle.Cursor' object has no attribute 'helloWorld'
このカーソルを拡張する方法任意のアイデア?
From https://github.com/oracle/python-cx_Oracle/issues/111#issuecomment-344175470:「helloWorld()ではなくhellowWorld()」のtypoveroがあります。 –
入力ミスを修正しました。 –