2016-08-30 3 views
1

ich eine CSV-Datei mit 5 Spalten lesen und Push-to-Oracle-TabelleLegen Sie in Oracle-Tabelle aus CSV-Python mit

CSV file Structure

Ich weiß, es gibt viele Ressourcen auf diese .. Aber selbst dann bin ich nicht in der Lage, eine Lösung für mein Problem

-Code zu finden, die CSV zu python zu lesen:

import csv 
reader = csv.reader(open("sample.csv","r")) 
lines=[] 
for line in reader: 
     lines.append(line) 
    print lines 

Ausgang:

[['Firstname', 'LastName', 'email', 'Course_name', 'status'], ['Kristina', 'Bohn', '[email protected]', 'Guide to Capnography in the Management of the Critically Ill Patient (CE)', 'Registered'], ['Peggy', 'Lutz', '[email protected]', 'Guide to Monitoring EtCO2 During Opioid Delivery (CE)', 'In Progress']]

-Code um die Liste zu Oracle-Tabelle zu schieben:

import cx_Oracle 
con = cx_Oracle.connect('username/[email protected]*****vd/Servicename') 
ver=con.version.split(".") 
print(ver) 
cur=con.cursor() 
cur.execute("INSERT INTO TEST_CSODUPLOAD ('FIRSTNAME','LASTNAME','EMAIL','COURSE_NAME','STATUS') VALUES(:1,:2,:3,:4,:5)",lines) 
con.commit() 
cur.close() 

Ich erhalte die Fehlermeldung:

Database: ORA-01484: Arrays können nur auf PL/SQL-Anweisungen gebunden

Bitte helfen Sie mir die Frage Vielen Dank im Voraus zu lösen

Antwort

0

Dieser Fehler m eans, was es sagte here

This is not a bug. You are issuing a SQL query, not a PL/SQL statement and this sort of thing is not supported by Oracle. In this particular case you can simply pass the string. If you have multiple strings you will need to use a subquery instead. Look at the table() and cast() operators for inspiration!

Sie können auch eine SQL-Datei Dump in und ausführen.

+0

Guter Punkt geändert. In diesem Fall gibt das OP keine Abfrage aus! :-) –

+0

Wow die Lösung von cursor.executemany ist genial !! Ich sollte meinen Code ändern !! @AnthonyTuininga Wie groß könnte mir das Array? Weil ich mit zu vielen Einsätzen arbeite. Respektieren sie das nächste Mal ein currval? Vielen Dank – lauralacarra

+0

Das Array kann so groß sein, wie Sie möchten - natürlich innerhalb der Grenzen des Speichers und der Datenbank selbst! Ich bin mir nicht sicher, was du genau mit nextval und currval meinst. Sie können diese in Ihrer insert-Anweisung verwenden, und sie verhalten sich wie überall. –

1

Das Problem ist, dass Sie versuchen, ein Array an eine einzelne INSERT-Anweisung zu übergeben. Sie haben zwei Möglichkeiten:

1) eine Schleife verwenden, jede Reihe separat einzufügen:

for line in lines: 
    cursor.execute("insert into ...", line) 

2) Verwenden cursor.executemany() statt eine Matrix zu tun

cursor.executemany("insert into ...", lines) 

Das Insert Die zweite Option ist effizienter, aber Sie müssen sicherstellen, dass der Datentyp für jede Zeile konsistent ist. Wenn Sie eine Nummer in einer Zeile und eine Zeichenfolge in der nächsten Zeile haben, wird ein Fehler ausgelöst.

1

Vielen Dank für Ihre Antworten :) das Problem behoben wurde, sobald ich von

cur.execute("INSERT INTO TEST_CSODUPLOAD ('FIRSTNAME','LASTNAME','EMAIL','COURSE_NAME','STATUS') VALUES(:1,:2,:3,:4,:5)",lines) 

zu

cur.executemany("insert into TEST_CSODUPLOAD(Firstname,LastName,email,Course_name,status) values (:1, :2, :3, :4,:5)", lines) 
+0

Freut mich zu hören. Warum hast du eine neue Antwort erstellt, anstatt einfach die zu akzeptieren, die ich gegeben habe? –

Verwandte Themen