Я пишу код, который использует скрипт Python для выполнения оператора SQL (Oracle), как показано ниже:
ПИТОН:
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 августа 2018 г.
Трассировка (последний последний вызов): Файл «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.
cnnSB.cursor.execute(fetch_date, CD=CD)
? Обычно, если вы используете именованные переменные связывания, вы также должны отправлять их в функциюexecute()
по имени. Этот вопрос содержит подробности: stackoverflow.com/questions/32868717 / - person David Faber   schedule 02.03.2019