我在通过ODBC调用Oracle存储函数(不是过程)时遇到问题。
我的功能非常简单,它只是连接两个字符串。我可以通过以下方式致电:
rs = c.execute("SELECT add_str('yogi', 'bubu') FROM dual")
for row in c.fetchall():
print(row[0])
但是这种类型的调用数据库函数不适用于更改数据库的函数。所以我尝试了这个:
c.execute("{ ? = call add_str('ala', 'bubu') }");
但我得到了:
Error: HY000: The driver did not supply an error!
在ODBC跟踪文件中,它看起来像:
python.exe odbc a20-e68 ENTER SQLExecDirect
HSTMT 00A02CE0
UCHAR * 0x00AA6CE4 [ -3] "{ ? = call add_str('ala', 'bubu') }\ 0"
SDWORD -3
python.exe odbc a20-e68 EXIT SQLExecDirect with return code -1 (SQL_ERROR)
HSTMT 00A02CE0
UCHAR * 0x00AA6CE4 [ -3] "{ ? = call add_str('ala', 'bubu') }\ 0"
SDWORD -3
python.exe odbc a20-e68 ENTER SQLGetDiagRecW
SQLSMALLINT 3
SQLHANDLE 00A02CE0
SQLSMALLINT 1
SQLWCHAR * 0x0021F7BC (NYI)
SQLINTEGER * 0x0021F808
SQLWCHAR * 0x00A035F8 (NYI)
SQLSMALLINT 1023
SQLSMALLINT * 0x0021F818
python.exe odbc a20-e68 EXIT SQLGetDiagRecW with return code 100 (SQL_NO_DATA_FOUND)
SQLSMALLINT 3
SQLHANDLE 00A02CE0
SQLSMALLINT 1
SQLWCHAR * 0x0021F7BC (NYI)
SQLINTEGER * 0x0021F808
SQLWCHAR * 0x00A035F8 (NYI)
SQLSMALLINT 1023
SQLSMALLINT * 0x0021F818
JDBC/Jython
:
proc = db.prepareCall("{ ? = call add_str('j_bubu', 'j_yogi') }");
proc.registerOutParameter(1, Types.VARCHAR)
r = proc.execute();
print(proc.getString(1))
所以应该可以使用ODBC& amp;蟒蛇。我已经检查过,如果我使用JDBC-ODBC桥接,那么Jython可以通过ODBC调用数据库函数,就像本机JDBC驱动程序一样。
我的环境:
数据库:Oracle Database 11g企业版11.2.0.1.0版 - 64位生产
ODBC驱动程序:11.01.00.06
SQORA32.DLL FileVersion:11.1.0.6.0
我尝试了来自ActiveState Python 2.7和odbc
模块的pyodbc
模块。
我的问题:
有没有办法通过ODBC驱动程序调用Oracle数据库函数(不是过程)?以及如何检索其结果?
答案 0 :(得分:0)
http://www.gossamer-threads.com/lists/python/python/71449
... 我不认为ODBC支持存储过程返回值 直。仅作为游标的一部分。 ...
基本上,你无法直接调用该函数。但是,您可以使用OUT
参数创建一个过程。