ORA-01722: неверный номер - Python с cx_Oracle - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть скрипт ниже, вставляемый в базу данных Oracle.Если я вручную помещаю все переданные значения в оператор INSERT и запускаю жестко закодированный оператор в Python, то INSERT работает, но по какой-то причине, когда я использую следующий способ, он всегда завершается неудачей с ORA-01722: invalid number.

. Я подумалэто было оригинальное значение даты и времени, поэтому я попробовал TO_DATE(TO_CHAR(:9, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS'), это не имело никакого значения.

Потратил целую вечность, пробуя разные предложения от SO и Интернета, но пока не повезло.

data = ['NULL', 'NULL', 'NULL', 'NULL', '2', 'Test Text', 'NULL', 'NULL', '2017-06-02 16:00:00', '20180910122315440220.csv']

conn = cx_Oracle.connect(env.DB_USER, env.DB_PASSWORD,cx_Oracle.makedsn(env.DB_HOST, env.DB_PORT, env.DB_NAME));

# Disable auto commit.
conn.autocommit = False

cursor = conn.cursor()

sql = """INSERT INTO TESTDB (TESTDB_ID, TESTDB_ACYR_CODE, TESTDB_SEM_CODE, TESTDB_MODULEID, TESTDB_STU_PIDM, TESTDB_COMPONENT_ID, TESTDB_COMPONENT_NAME, TESTDB_GRADE_MARK, TESTDB_GRADER_PIDM, TESTDB_GRADE_MODIFIED_DATE, TESTDB_CREATION_DATE, TESTDB_FILENAME, TESTDB_ACTIVITY_DATE, TESTDB_USER_ID) VALUES(TESTDB_SEQ.NEXTVAL, :1, :2, :3, :4, :5, :6, :7, :8, TO_DATE(:9, 'YYYY-MM-DD HH24:MI:SS'), SYSDATE, :10, SYSDATE, USER)"""

cursor.prepare(sql)

cursor.execute(sql, data)

conn.commit()

cursor.close()

# Enable auto commit.
conn.autocommit = True
conn.close()

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Ошибка не связана с DATE. Вы использовали TO_DATE для преобразования его в дату, что должно работать нормально.

Проблема связана с NUMBER столбцами, например: TESTDB_ID, и вы пытаетесь вставить в них строку 'NULL'. Обратите внимание, что по умолчанию Python не преобразует строку NULL в кавычки в Oracle NULL. Для этого вы должны использовать Python None type.

Итак, ваши данные должны быть

data = [None, None, None, None, '2', 'Test Text', None, None, '2017-06-02 16:00:00', '20180910122315440220.csv']

и оператор вставки, содержащийся в переменной sql (с to_date), должен работать нормально.

0 голосов
/ 10 сентября 2018

Вам необходимо сравнить значения в вашем массиве data с проекцией вашей таблицы TESTDB. Убедитесь, что типы данных записей словаря соответствуют типам данных их целевых столбцов.

Однако я собираюсь предположить, что один или несколько столбцов, которым назначено 'NULL', является числовым, и в результате ваш код вставляет строку из 'NULL' вместо нуля значение. Попробуйте заменить 'NULL' назначения пустыми строками или, возможно, Pythonic None, и посмотрите, решает ли это проблему.

...