【问题标题】:Oracle Bind Variable to_date parameter Errororacle绑定变量to_date参数错误
【发布时间】:2019-07-23 22:41:18
【问题描述】:

我正在编写使用 Python 脚本执行 SQL (Oracle) 语句的代码,如下所示:

Python:

with open(os.path.join(WORKING_PATH, "sql", "fetchCalendar.sql"), 'r') as 
    fetch_date = fetch.read()   
#(Some other code)
CD = timestamp_tostring(ACTUALDATE)
print("CD:", CD)
cnnSB.cursor.execute(fetch_date, CD)

fetchCalendar.sql

SELECT YEARNBR as yearnbr, QUARTERNBR as quarternbr, MONTHNBR as monthnbr, WEEKNBR as weeknbr
 FROM MFS_MFSCALENDAR
WHERE ACTUALDATE = TO_DATE(:CD, 'DD-MON-YY')

当我尝试使用以下值运行它时,会输出:

CD:18 年 8 月 30 日

Traceback(最近一次调用最后一次):文件“AHT_Init.py”, 第 919 行,在 init_load(data, end_of_week, cur, 3) 文件“AHT_Init.py”,第 644 行,在 init_load populate_rollup(modelid, test_data, train_data, rollup_cmd) 文件“AHT_Init.py”,第 684 行,在 populate_rollup cnnSB.cursor.execute(fetch_date, CD) cx_Oracle.DatabaseError: ORA-01036: 非法变量名/编号

(强调“ORA-01036:非法变量名/编号”)

当然,我尝试更改变量名称无济于事。我尝试使用 Oracle SQL Developer 运行 SQL 代码(在提示时传入 '01-JUN-18',包括单引号),并收到此错误:

ORA-01858:在数字所在的位置发现了一个非数字字符 预期的 01858. 00000 - “在需要数字的地方发现了一个非数字字符” *原因:要使用日期格式模型转换的输入数据是 不正确。输入数据不包含数字 格式模型所要求的。 *行动:修复输入数据或日期格式模型,以确保 元素在数量和类型上匹配。然后重试操作。

但是,当我用以下内容替换有问题的行时:

WHERE ACTUALDATE = TO_DATE('01-JUN-18', 'DD-MON-YY');

代码按预期工作。 任何人都可以告诉我问题可能是什么,以及如何解决它? 非常感谢!

编辑:我知道 fetchCalendar.sql 代码中缺少分号;这对于 Python 在这种情况下如何与 Oracle 交互是必要的。出于测试目的,我在 Oracle SQL Developer 上尝试时添加了一个分号,但在为 .sql 文件删除时应该不会导致问题。

【问题讨论】:

  • 如果你这样做cnnSB.cursor.execute(fetch_date, CD=CD)会发生什么?通常,如果您使用命名绑定变量,您也应该将它们按名称发送到execute() 函数。这个问题有详细信息:stackoverflow.com/questions/32868717/…
  • 什么是fetchCalendar.sql?我不懂Python,但是是否有必要传递一个字符串并将其转换回日期?

标签: python sql oracle to-date bind-variables


【解决方案1】:

找到答案: 简而言之,errortype错误。

我的代码将 datetime.date 传递给 SQL to_date 转换,它需要一个字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-06
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 2015-08-09
    • 1970-01-01
    • 2010-11-28
    相关资源
    最近更新 更多