Вставка нескольких значений в PL / SQL в Python с помощью одного вызова - PullRequest
0 голосов
/ 06 июня 2019

Мне нужно вставить несколько значений в PL / SQL одним вызовом в Python, потому что у нас есть XML-файл 3Gb.

Вот мой код:


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

А это скриншот моего журнала ошибок

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Чтобы вставить несколько строк, посмотрите примеры 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 и т. Д.), Но вы также можете несколько раз вызвать блок PL / SQL с разными параметрами с помощью executemany().

Использование executemany() будет на лот быстрее, чем повторные вызовы на execute().

Существует больше информации и примеров (включая PL / SQL) о executemany() в Эффективное и масштабируемое выполнение пакетных операторов в Python cx_Oracle

0 голосов
/ 06 июня 2019

Я думаю, вы можете искать 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

...