【发布时间】: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