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

Inserting multiple values in PL/SQL in Python with a single call

我需要在 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

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

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

要使用多个数据值调用 PL/SQL,请查看 cx_Oracle 示例 bind_insert.py, batch_errors.py, and array_dml_rowcounts.py from the cx_Oracle samples directory,这些示例都通过一次 executemany() 调用插入多行。

示例显示了 DML 语句(INSERT 等),但您也可以使用 executemany():

使用不同的参数多次调用 PL/SQL 块
data = [
    (10, 'Parent 10'),
    (20, 'Parent 20'),
    (30, 'Parent 30'),
    (40, 'Parent 40'),
    (50, 'Parent 50')
]
cursor.executemany("begin mypkg.create_parent(:1, :2); end;", data)

使用 executemany() 和 SQL 比重复调用 execute()很多。使用 PL/SQL 也更快,除非你有 OUT 绑定。

Batch Statement Execution and Bulk Loading

中有关于 executemany() 的更多信息和更多示例(包括一个 PL/SQL 示例)