我需要在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
答案 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.py,BatchErrors.py和ArrayDMLRowCounts.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_Oracle的executemany()
上有更多信息和更多示例(包括一个PL / SQL)