我正在编写使用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:30-AUG-18
回溯(最近一次通话最近):文件“ AHT_Init.py”, 919行,在 init_load(data,end_of_week,cur,3)文件“ AHT_Init.py”,init_load的第644行 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文件时应该不会引起问题。
答案 0 :(得分:0)
找到答案: 简而言之,错误类型错误。
我的代码正在将datetime.date传递给需要字符串的SQL to_date强制转换。