在SQL查询命名参数 - cx_Oracle - ORA-01460:未实现或不合理的转换要求

2019-09-26 04:41发布

我已经实现在原始的SQL查询命名参数按Python的DB-API后遇到了问题。

早些时候,我的代码如下(这工作得很好,我的两个DEV服务器和我的客户的测试服务器上)

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: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命令行中运行使用命名参数相同的代码,然后在查询运行得很好。

Answer 1:

下面是这是怎么解决的。

我试图强制类型转换的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库读取。



文章来源: Named Parameters in SQL Queries - cx_Oracle - ORA-01460: unimplemented or unreasonable conversion requested