Параметр to_date переменной привязки Oracle Ошибка - PullRequest
0 голосов
/ 02 марта 2019

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

1 Ответ

0 голосов
/ 18 июня 2019

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

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

...