cx_ Oracle .DatabaseError: ORA-01036: недопустимое имя / номер переменной - PullRequest
1 голос
/ 16 апреля 2020

Я пытаюсь загрузить файл CSV в базу данных oracle и сталкиваюсь с этой ошибкой:

cx_ Oracle .DatabaseError: ORA-01036: недопустимое имя переменной / number

Не могли бы вы помочь разобраться в root причине и возможном решении этой проблемы?

def main():
    ConStr = 'UserName/PWD@END_POINT'
    con = cx_Oracle.connect(ConStr)
    cur = con.cursor()
    with open('Persons.csv','r') as file:
                    read_csv = csv.reader(file,delimiter= '|')
                    sql = "insert into Persons (PERSONID,LASTNAME,FIRSTNAME,ADDRESS,CITY) values (:1,:2,:3,:4,:5)"
                    for lines in read_csv :
                            print(lines)
                            cur.executemany(sql,lines)
    cur.close()
    con.commit()
    con.close();

Мой CSV-файл выглядит следующим образом :

PERSONID|LASTNAME|FIRSTNAME|ADDRESS|CITY
001|abc|def|ghi|jkl
002|opq|rst|uvw|xyz

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Из Oracle документации :

import cx_Oracle
import csv

. . .

# Predefine the memory areas to match the table definition
cursor.setinputsizes(None, 25)

# Adjust the batch size to meet your memory and performance requirements
batch_size = 10000

with open('testsp.csv', 'r') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    sql = "insert into test (id,name) values (:1, :2)"
    data = []
    for line in csv_reader:
        data.append((line[0], line[1]))
        if len(data) % batch_size == 0:
            cursor.executemany(sql, data)
            data = []
    if data:
        cursor.executemany(sql, data)
    con.commit()
0 голосов
/ 16 апреля 2020

Кортежи или сопоставления параметров следует искать в последовательности lines , которая является вторым аргументом метода executemany , тогда как строки заголовков, такие как PERSONID , LASTNAME .. et c. возвращайте в каждом шаге для этого аргумента.

Не проверял на Python 2, но попробуйте следующий код, который работает для Phyton 3:

import pandas as pd
import cx_Oracle

ConStr = 'UserName/PWD@END_POINT:PORT/SERVICE_NAME'

con=cx_Oracle.connect(ConStr)
cur=con.cursor()

fl=r'C:\\Documents\\csv\\Persons.csv'

sql = "insert into Persons (PERSONID,LASTNAME,FIRSTNAME,ADDRESS,CITY) values (:1,:2,:3,:4,:5)"

read_csv = pd.read_csv(fl,delimiter= '|')
df_list = read_csv.values.tolist()

for lines, r in read_csv.iterrows():
        cur.execute(sql,r)

cur.close()

con.commit()
con.close();

, где

for lines, r in read_csv.iterrows():
        cur.execute(sql,r)

является альтернативой методу, который вы пытаетесь запустить.

...