0

10 列のOracle Table名前があり、その主キーを構成します。ここで、 SQL ステートメントを使用してこのテーブルに挿入します。Consumercolumn# 2, 3 and 4Pandas DataframeInsert...On Duplicate Key Update

まず、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

誰かが私のコードの問題点を見つけて修正するのを手伝ってくれませんか? よろしくお願いします。

4

1 に答える 1

2

このINSERT ... ON DUPLICATE KEY UPDATE ...構文は Oracle には存在しません (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クエリの句に挿入するすべての列を列挙することもお勧めします。

于 2020-02-13T17:04:14.870 に答える