gpt4 book ai didi

python - SQL 查询中的命名参数 - cx_Oracle - ORA-01460 : unimplemented or unreasonable conversion requested

转载 作者:行者123 更新时间:2023-11-30 23:37:13 25 4
gpt4 key购买 nike

按照 Python DB-API 在 RAW SQL 查询中实现命名参数后,我遇到了问题。

之前,我的代码如下(在我的开发服务器和客户端的测试服务器上都运行良好)

cursor.execute("SELECT DISTINCT(TAG_STATUS) FROM TAG_HIST WHERE TAG_NBR = '%s' " %(TAG_NBR))

我将其更改为以下内容

cursor.execute("SELECT DISTINCT(TAG_STATUS) FROM TAG_HIST WHERE TAG_NBR = :TAG_NBR " ,{'TAG_NBR':TAG_NBR})

这个更改后的版本(带有命名参数)在我的开发服务器上运行良好

  • Windows XP Oracle XE
  • SQL*Plus: Release 11.2.0.2.0
  • cx_Oracle-5.1.2-11g.win32-py2.7

但是,当部署在我的客户的测试服务器上时,它不会...所有查询的执行都会失败。

我的客户服务器的特点如下

  • Windows Server 2003
  • Oracle 数据库 10g 企业版版本 10.2.0.1.0 - 64bi
  • cx_Oracle-5.1.2-10g.win32-py2.7

我得到的错误如下

Traceback (most recent call last):
File "C:/Program Files/App_Logic/..\apps\views.py", line 400, in regularize_TAG
T_cursor.execute("SELECT DISTINCT(TAG_STATUS) FROM TAG_HIST WHERE TAG_NBR = :TAG_NBR " ,{'TAG_NBR':TAG_NBR})
DatabaseError: ORA-01460: unimplemented or unreasonable conversion requested

如果有人能帮助我解决这个问题,我们将不胜感激。

仅当 cx_Oracle 代码在 Web 应用程序(托管在 Apache 上)内运行时,此问题才会出现。

如果我在 python 命令行中使用命名参数运行相同的代码,那么查询运行得很好。

最佳答案

这是如何解决这个问题的。

我尝试将 unicode 转换为 str,结果是肯定的。

这个例子有效

T_cursor.execute("SELECT DISTINCT(TAG_STATUS) FROM TAG_HIST WHERE TAG_NBR = :TAG_NBR", {'TAG_NBR': str(TAG_NBR)})

因此,实际上,unicode 通过编码到潜在的非 unicode 数据库字符集而受到破坏。

为了解决这个问题,这里有另一个选择

import os
os.environ.update([('NLS_LANG', '.UTF8'),('ORA_NCHAR_LITERAL_REPLACE', 'TRUE'),])
import cx_Oracle

以上保证我们确实处于UTF8模式。

第二个环境变量一并不是绝对必要的。而且据我所知,没有其他方法可以设置这些变量(除了在运行应用程序本身之前),因为 NLS_LANG 是由 OCI 库从环境中读取。

关于python - SQL 查询中的命名参数 - cx_Oracle - ORA-01460 : unimplemented or unreasonable conversion requested,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15797894/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com