【问题标题】:How to retrieve result of Oracle database function via ODBC?如何通过 ODBC 检索 Oracle 数据库函数的结果?
【发布时间】:2012-07-17 12:27:47
【问题描述】:

我在通过 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 和 Python 做类似的事情。我已经检查过,如果我使用 JDBC-ODBC 桥接器,那么 Jython 可以像原生 JDBC 驱动程序一样通过 ODBC 调用数据库函数。

我的环境:

数据库:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

ODBC 驱动程序:11.01.00.06

SQORA32.DLL 文件版本:11.1.0.6.0

我尝试了 ActiveState Python 2.7 中的 odbc 模块和 pyodbc 模块。

我的问题:

有没有办法通过他们的 ODBC 驱动程序调用 Oracle 数据库函数(不是过程)?以及如何检索其结果?

【问题讨论】:

  • 您是否尝试过 SQL*Plus/SQL Navigator 等中的 select 语句,以确保它确实有效。可能是函数中的错误。
  • 如果我使用 registerOutParameter() 从 JDBC 调用它,则该功能有效,因此问题出在 ODBC 驱动程序或包装 ODBC 函数的 Python 代码中。
  • 使用 JDBC-ODBC 桥进行测试我发现这可能不是 ODBC 驱动程序的问题,而是包装 ODBC 函数的 Python 代码。

标签: python oracle odbc


【解决方案1】:

谷歌打开了这个页面:

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

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

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

【讨论】:

  • 在我的 JDBC/Jython 测试程序中,我将驱动程序从本机更改为 JDBC-ODBC 桥,它可以正常工作!所以问题可能不在于 ODBC 驱动程序,而在于包装 ODBC 库的 Python 代码。
猜你喜欢
  • 2012-10-07
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-08
相关资源
最近更新 更多