Ошибка параметра Oracle Bind Variable to_date

Я пишу код, который использует скрипт 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.


person NicholasTW    schedule 01.03.2019    source источник
comment
Что произойдет, если вы сделаете cnnSB.cursor.execute(fetch_date, CD=CD)? Обычно, если вы используете именованные переменные связывания, вы также должны отправлять их в функцию execute() по имени. Этот вопрос содержит подробности: stackoverflow.com/questions/32868717 /   -  person David Faber    schedule 02.03.2019
comment
Что такое fetchCalendar.sql? Я не знаю Python, но нужно ли передавать строку и преобразовывать ее обратно в дату?   -  person William Robertson    schedule 02.03.2019


Ответы (1)


Нашел ответ: Короче, ошибка неправильного типа.

Мой код передавал datetime.date в приведение SQL to_date, которое ожидало строку.

person NicholasTW    schedule 18.06.2019