如何通过ODBC检索Oracle数据库函数的结果



我在通过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&蟒蛇我已经检查过,如果我使用JDBC-ODBC桥,那么Jython可以像本地JDBC驱动程序一样通过ODBC调用数据库函数。

我的环境:

数据库:Oracle Database 11g Enterprise Edition 11.2.0.1.0-64位生产版

ODBC驱动程序:11.01.00.06

SQORA32.DLL文件版本:11.1.0.6.0

我尝试了ActiveStatePython2.7中的odbc模块和pyodbc模块。

我的问题:

有没有任何方法可以通过ODBC驱动程序调用Oracle数据库函数(而不是过程)?如何检索结果?

谷歌打开了这个页面:

http://www.gossamer-threads.com/lists/python/python/71449

我认为ODBC不支持返回值的存储过程直接地仅作为光标的一部分。…

基本上,您不能直接调用函数。但是,您可以创建一个带有OUT参数的过程。

相关内容

最新更新