Cx_Oracle相当于重复键更新

时间:2018-04-16 06:19:29

标签: python oracle merge

现在我有一个名为"数据"的元组列表。

[
('171115090000',
Timestamp('2017-11-15 09:00:00'),
'PAIR1',
156.0)
]

我想将此列表插入Oracle DB,我的代码是

cur.executemany(
            '''INSERT INTO A 
            ("SID","DATE","ATT","VALUE") 
            VALUES(:1,:2,:3,:4)''',Data)

效果很好。但是,如果我想在此数据库中添加/替换新记录,我必须创建一个表B来放置这些记录,然后合并A和B.

在没有创建新表的情况下,我可以完成我的工作吗?

我知道我可以从A中选择所有记录,将它们转换为DataFrame并在Python中合并DataFrames,这是一个很好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

  

重复密钥更新是否有类似内容

在Oracle中,它被称为MERGE;看看下面的例子:

开头的表格内容:

SQL> select * From dept;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

MERGE声明:

SQL> merge into dept d
  2    using (select deptno, dname, loc
  3           from (select 10 deptno, 'ACC' dname, 'NY' loc from dual --> already exists, should be updated
  4                 union all
  5                 select 99       , 'NEW DEPT' , 'LONDON' from dual --> doesn't exists, should be inserted
  6                )
  7          ) x
  8  on (d.deptno = x.deptno)
  9  when matched then update set
 10                      d.dname = x.dname,
 11                      d.loc   = x.loc
 12  when not matched then insert (d.deptno, d.dname, d.loc)
 13                        values (x.deptno, x.dname, x.loc);

2 rows merged.

结果:如您所见,现有DEPTNO = 10的值已更新,而新的DEPTNO = 99已插入表格中。

SQL> select * From dept;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACC            NY
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        99 NEW DEPT       LONDON

SQL>

我不会说Python,所以我无法撰写您可能会使用的代码,但我希望您能够自己设置代码。