Как разрешить «ORA-00933» с помощью «Вставить ... при обновлении дубликата ключа» SQL Запрос в Pandas? - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть Oracle Table с именем Consumer с 10 столбцами, где column# 2, 3 and 4 представляет собой первичный ключ для него. Теперь я хочу вставить в эту таблицу через оператор Pandas Dataframe, используя оператор Insert...On Duplicate Key Update SQL.

Сначала я преобразую любые pandas NaN или NaT в Oracle None, а затем преобразую Dataframe строк в кортежи для вставки. Если во время вставки возникает нарушение первичного ключа, мне нужно обновить только последние 4 столбца таблицы.

Код, который я здесь использую, выглядит следующим образом:

df1 = df.astype(object).where(df.notnull(), None)
rows = [tuple(x) for x in df1.values]

query = """INSERT INTO CONSUMER VALUES (:1,:2,:3, :4, :5, :6, :7, :8, :9, :10) ON DUPLICATE KEY UPDATE 
                                  DT = VALUES(:7),
                                  AT = VALUES(:8),
                                  OB = VALUES(:9),
                                  UT = VALUES(:10)"""

dbcur.executemany(query, rows)
dbcon.commit()

Где DT, AT, OB и UT являются именами последних 4 столбцов в таблице. Но это дает мне следующую ошибку:

cx_Oracle.DatabaseError: ORA-00933: SQL command not properly ended

Может кто-нибудь помочь мне выяснить и исправить то, что не так с моим кодом? Большое спасибо заранее.

1 Ответ

2 голосов
/ 13 февраля 2020

Синтаксис INSERT ... ON DUPLICATE KEY UPDATE ... не существует в Oracle (он указывается от c до MySQL). Эквивалент Oracle равен синтаксис MERGE , который для вашего случая использования будет выглядеть следующим образом:

merge into consumer
using dual
on (col2 = :2 and col3 = :3 and col4 = :4)
when not matched then insert values (:1,:2,:3, :4, :5, :6, :7, :8, :9, :10)
when matched then update set dt = :7, at = :8, ob = :9, ut = :10

Примечание: вы не указали, какие имена первичного ключа столбцы есть, поэтому я предположил col2/3/4. Также было бы хорошо перечислить все столбцы для вставки в предложении not matched запроса.

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