在 to_date 函数中使用 cx_oracle 变量时无法正确绑定

Posted

技术标签:

【中文标题】在 to_date 函数中使用 cx_oracle 变量时无法正确绑定【英文标题】:Cannot get cx_oracle variable to bind properly when using it in to_date function 【发布时间】:2019-01-06 06:55:15 【问题描述】:

我正在尝试替换此调用:

cursor = connection.cursor()
try:
    sql = "select m.lat, m.longt, v.tmax from vcsn_view v, vcsn_metadata m where set_vcsn('local_day=to_date(20180304)-1') is null and v.agent_no = m.agent_no(+) order by 1,2"
    cursor.execute(sql)
    for lat, longt, tmax in cursor:
        print("Values:", lat, longt, tmax)
except cx_Oracle.DatabaseError, e:
    printf ('Failed to select\n')
    printException(e)
    exit(1)

使用将查询中的日期作为变量的调用,即:

cursor = connection.cursor()
try:
    sql = "select m.lat, m.longt, v.tmax from vcsn_view v, vcsn_metadata m where set_vcsn('local_day=to_date(:1)-1') is null and v.agent_no = m.agent_no(+) order by 1,2"
    cursor.execute(sql, (20180304,))
    for lat, longt, tmax in cursor:
        print("Values:", lat, longt, tmax)
except cx_Oracle.DatabaseError, e:
    printf ('Failed to select\n')
    printException(e)
    exit(1)

但我无法让它工作。我得到错误: 选择失败 错误代码 = 1036 错误消息 = ORA-01036: 非法变量名称/编号

【问题讨论】:

【参考方案1】:

在您的 SQL 中,您有 :1 内引号,因此它不起作用。我不确定 set_vcsn() 是否需要一个字符串。假设确实如此,则需要执行以下操作:cursor = connection.cursor()

try:
    sql = "select m.lat, m.longt, v.tmax from vcsn_view v, vcsn_metadata m where set_vcsn('local_day=to_date(' || :1 || ')-1') is null and v.agent_no = m.agent_no(+) order by 1,2"
    cursor.execute(sql, (20180304,))
    for lat, longt, tmax in cursor:
        print("Values:", lat, longt, tmax)
except cx_Oracle.DatabaseError, e:
    printf ('Failed to select\n')
    printException(e)
    exit(1)

如果 set_vcsn() 不需要字符串,那么如果您需要进一步的帮助,提供更多信息会很有帮助。但一般来说,字符串内的值不会搜索绑定变量!

【讨论】:

成功了!我有一个暗示,这个问题与需要字符串的 set_vcsn(..) 函数有关,但我找不到任何地方如何转义绑定变量。

以上是关于在 to_date 函数中使用 cx_oracle 变量时无法正确绑定的主要内容,如果未能解决你的问题,请参考以下文章

CX_Oracle - 将数据从 Oracle 导入 Pandas 数据框

cx_Oracle.DatabaseError: ORA-01843: 不是一个有效的月份

在 cx_Oracle 上执行许多 CLOB 元素

使用 cx_Oracle 制作字典列表

在TO_DATE函数中使用变量

oracle中的to_date函数