一次调用即可在Python中的PL / SQL中插入多个值

时间:2019-06-06 14:42:28

标签: python oracle sql-insert bulk

我需要在Python中通过一次调用在PL / SQL中插入多个值,因为我们有一个3Gb xml文件。

这是我的代码:


y = 0
for x in range(0,len(rows)):
    x = x + 1
    if x == y + 500 :
      cur.prepare("BULK INSERT INTO cm_raw (fecha,distname,clase,parametro,valor) VALUES (:1,:2,:3,:4,:5)")
      datos = [(str(date.today().strftime("%d/%m/%Y")),rows[y:x])]
      print (datos)
      cur.executemany(None,rows)
      con.commit()
      con.close
      y = x

And this is a screenshot of my error log

2 个答案:

答案 0 :(得分:0)

我认为您可能正在寻找INSERT ALL而不是BULK INSERT。如修复程序所述,BULK INSERT在Oracle中不可用。 Oracle文档https://docs.oracle.com/database/121/SQLRF/statements_9015.htm#SQLRF01604

中提到了INSERT ALL

关于您收到的Python value of type tuple not supported错误,请尝试查看此github线程。我不熟悉Python,但我认为它可以为您指明正确的方向:https://github.com/oracle/python-cx_Oracle/issues/171

答案 1 :(得分:0)

要插入多行,请查看cx_Oracle示例BindInsert.pyBatchErrors.pyArrayDMLRowCounts.py,它们都通过一个executemany()调用插入了多行。

rows = [ (1, "First" ),
         (2, "Second" ),
         (3, "Third" ),
         (4, "Fourth" ),
         (5, "Fifth" ),
         (6, "Sixth" ),
         (7, "Seventh" ) ]

cursor = connection.cursor()
cursor.executemany("insert into mytab(id, data) values (:1, :2)", rows)

示例显示了DML语句(INSERT等),但是您也可以使用executemany()使用不同的参数多次调用PL / SQL块。

与重复调用executemany()相比,使用execute()的速度要快

Efficient and Scalable Batch Statement Execution in Python cx_Oracleexecutemany()上有更多信息和更多示例(包括一个PL / SQL)