通过一次调用在 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 示例)
我需要在 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()
:
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 示例)