Я пишу код, который использует скрипт 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
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: недопустимое имя / номер переменной»)
Естественно, я пытался изменить имена переменных безрезультатно.Я попытался запустить код SQL с помощью Oracle SQL Developer (передавая '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.