ORA-00936: отсутствует выражение с Python и Oracle при вставке - PullRequest
0 голосов
/ 18 июня 2020

Я потратил много дней, пытаясь выяснить ошибку ORA-00936: пропущенное выражение при использовании executemany (). Если я вставляю по одной строке за раз, вставка работает. Я искал, читал и пробовал предложения, найденные на inte rnet, но ни одно из них, похоже, не работает. Мне нужна помощь. вот описание таблицы:

ColumnName,ColID,PK,IndexPos,Null,DataType,Default,DefaultOnNull,Histogram,NumDistinct,NumNulls,Density,EncryptionAlg,Salt,Trigger,Virtual
YEARMONTH,1,1,1,N,DATE,,False,None,1997,0,0.0005,,,,False
PHASE,4,,,Y,VARCHAR2 (7 Char),,False,Frequency,5,0,0.00013,,,,False
INDEXVALUE,3,,,Y,NUMBER (3,2),,False,None,728,0,0.00137,,,,False
CLIMATEINDEX,2,2,2,N,VARCHAR2 (4 Char),,False,Frequency,3,0,0.00013,,,,False

Данные считываются из файла csv с помощью программы чтения csv python и помещаются в список. Вот данные:

file_data = [['1854-01-01', 'PDO', '0.11', 'POS'], ['1854-02-01', 'PDO', '-0.24', 'NEG'], ['1854-03-01', 'PDO', '-0.4', 'NEG'], ['1854-04-01', 'PDO', '-0.44', 'NEG'], ['2020-04-01', 'ONI', '0.28', 'NEUTRAL'], ['2020-04-01', 'PDO', '-1.33', 'NEG'], ['2020-05-01', 'PDO', '-0.7', 'NEG']]

Это вставка sql:

in_query = ('insert into myschema.monthly_climate_index(YEARMONTH, CLIMATEINDEX, INDEXVALUE, PHASE) values (DATE :YEARMONTH, :CLIMATEINDEX, :INDEXVALUE, :PHASE)')

Это команда execute many:

cursor.executemany(in_query, file_data)

Результат : ORA-00936: отсутствует выражение СПАСИБО !!!

Ответы [ 2 ]

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

Это ваш запрос:

insert into myschema.monthly_climate_index
  (YEARMONTH, CLIMATEINDEX, INDEXVALUE, PHASE) values 
  (DATE :YEARMONTH, :CLIMATEINDEX, :INDEXVALUE, :PHASE)
   ---------------
   ^^^ this

Я не думаю, что вы можете использовать дату таким образом; Ключевое слово date выглядит так, как если бы вы хотели вставить литерал даты, например date '2020-06-18'. Если это так, все должно быть частью :YEARMONTH.

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

Попробуйте следующее:

Обновите свой SQL до следующего:

in_query = """ insert into myschema.monthly_climate_index(YEARMONTH, CLIMATEINDEX, INDEXVALUE, PHASE) values (:1, :2, :3, :4) """

И если это все еще не работает, попробуйте изменить свой список на массив таких кортежей

[('1854-01-01', 'PDO', '0.11', 'POS')]

Кроме того, с датами Oracle сложно работать. Итак, если проблема заключается в совместимости даты, попробуйте изменить строковые литералы даты на что-то вроде этого:

'01-JAN-1854'

вместо

'1854-01-01'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...