【问题标题】:pyodbc MERGE INTO error: HY000: The driver did not supply an errorpyodbc MERGE INTO 错误:HY000:驱动程序未提供错误
【发布时间】:2021-06-12 18:22:10
【问题描述】:

我正在尝试使用 python 3.9.2(64bit) 和 pyodbc 4.0.30(64bit) 在 oracledb 11.2.0.4.0(64bit) 中执行许多 (~1000) MERGE INTO 语句。但是,所有语句都返回异常:

HY000:驱动程序未提供错误

我已经尝试了我能想到的一切来解决这个问题,但没有运气。我尝试将代码、编码/解码和 ODBC 驱动程序从 oracle home 12.1(64bit) 更改为 oracle home 19.1(64bit)。我也尝试使用 pyodbc 4.0.22,在这种情况下,错误刚刚变为:

返回带有错误集的结果

这并不比第一个错误更有帮助。我假设的问题不可能是 MERGE INTO 语句本身,因为当我尝试直接在数据库 shell 中运行它们时,它会毫无问题地完成。

下面是我的代码。我想我还应该提到在执行之前从标准输入读取命令和参数,并且 oracledb 使用的是 utf8 字符集。

cmds = sys.stdin.readlines()
comms = json.loads(cmds[0])
conn = pyodbc.connect(connstring)
conn.setencoding(encoding="utf-8")

cursor = conn.cursor()
cursor.execute("""ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD"T"HH24:MI:SS.....'""")

for comm in comms:
  params = [(None) if str(x)=='None' or str(x)=='NULL' else (x) for x in comm["params"]]
  try:
    cursor.execute(comm["sql"],params)
  except Exception as e:
    print(e)

conn.commit()
conn.close()

编辑:另一件值得一提的事情——这个问题是在 python2.7 到 3.9.2 更新之后开始的。不过,代码本身根本不需要在这个特定位置进行任何更改。

【问题讨论】:

    标签: python oracle odbc pyodbc python-3.9


    【解决方案1】:

    过去我也遇到过 HY000 错误。它几乎总是归结为 SQL 查询中的语法错误。仔细检查所有双引号和单引号,并确保查询在与数据库的 SQL 会话中独立运行时正常运行。

    【讨论】:

    • 感谢您的回复。我尝试在 SQL 会话中执行一些查询,它们成功完成。我也直接从错误日志中复制了查询和参数,所以问题似乎不是语法错误。所有查询都非常相似。它们总是以相同数量的参数插入到同一个表中,但是当使用 pyodbc 执行时,每个查询都会抛出一个错误。
    • 这可能与您的问题有关吗?:stackoverflow.com/questions/18398237/…
    • 不幸的是,似乎并非如此。如果我在 SQL 会话中更改日期格式,然后运行从 pyodbc 引发错误的查询,它将成功完成。如果我将 ALTER SESSION 查询放在 Python 中的 try catch 块中,它甚至不会抛出。这只是 MERGE INTO 状态。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 2015-03-28
    • 2013-07-07
    相关资源
    最近更新 更多