2008-09-16 4 views
4

Ich verwende OLEDB-Provider für ADO.Net Verbindung zu einer Oracle-Datenbank. In meiner Schleife, mache ich einen Einsatz:ORA-00933: SQL-Befehl nicht ordnungsgemäß beendet

insert into ps_tl_compleave_tbl values('2626899', 0, TO_DATE('01/01/2002', 'MM/DD/YYYY'), 'LTKN', 'LTKN', '52', TO_DATE('01/01/2002', 'MM/DD/YYYY'), 16.000000, 24.000)insert into ps_tl_compleave_tbl values('4327142', 0, TO_DATE('03/23/2002', 'MM/DD/YYYY'), 'LTKN', 'LTKN', '51', TO_DATE('03/23/2002', 'MM/DD/YYYY'), 0.000000, 0.000) 

Der erste Einsatz gelingt es aber die zweite gibt einen Fehler:

ORA-00933: SQL command not properly ended 

Was mache ich falsch?

+0

Versuchen Sie, beide Einsätze gleichzeitig zu machen? –

Antwort

3

Für mich ist es Ihnen eine ; zwischen den beiden Aussagen sind vermisst:
insert into ps_tl_compleave_tbl values('2626899', 0, TO_DATE('01/01/2002', 'MM/DD/YYYY'), 'LTKN', 'LTKN', '52', TO_DATE('01/01/2002', 'MM/DD/YYYY'), 16.000000, 24.000)
;
insert into ps_tl_compleave_tbl values('4327142', 0, TO_DATE('03/23/2002', 'MM/DD/YYYY'), 'LTKN', 'LTKN', '51', TO_DATE('03/23/2002', 'MM/DD/YYYY'), 0.000000, 0.000)
;
Versuchen Sie, die ; hinzufügen und lassen Sie es uns wissen.

2

Semikolon nach dem ersten Einsatz?

+0

Hinzufügen eines Semikolons zum Ende der Anweisung gibt mir diesen Fehler: ORA-00911: ungültiges Zeichen –

2

Oracle SQL verwendet ein Semikolon; als sein Ende des Anweisungsmarkers.

müssen Sie hinzufügen; Nach der Mühe fügen Sie Statements ein.

NB: das geht auch davon aus, dass ADODB 2 Inserts in einem einzigen Aufruf erlaubt.

die Alternative könnte sein, beide Anrufe in einem Block zu wickeln, scheint

BEGIN 
     insert (...) into (...); 
     insert (...) into (...); 
END; 
0

Es ist eine lange Aufnahme, aber in der ersten Einfügung das SQL-Datumsformat ist gültig für beide uk/us, die zweite Einfügung ist ungültig, wenn die Oracle DB für UK Datumsformat eingerichtet ist, merke ich, dass Sie die Funktion TO_DATE aber verwendet haben Ich sehe nichts anderes ...

0

Wird das Semikolon von OLE_DB benötigt? Es wird nicht von den meisten APIs benötigt.

0

Der ADO.NET OLE DB-Anbieter ist für den allgemeinen Datenzugriff vorgesehen, bei dem Sie keinen bestimmten Anbieter für Ihre Datenbank haben. Verwenden Sie OracleConnection und andere gegenüber OleDbConnection für eine Oracle-Datenbankverbindung.

1

In meiner Schleife habe ich meinen StringBuilder nicht re-initialisiert ... also die mehrfache insert-Anweisung, die ich gepostet habe.

Danke für Ihre Hilfe trotzdem !!

0

Zusätzlich zu dem Semikolon Problem, empfehle ich dringend, in Bind Variablen zu untersuchen. Wenn sie nicht verwendet werden, kann dies zu Datenbankleistungsproblemen führen. Der Code neigt auch dazu, sauberer zu sein.

10

In .net, wenn wir versuchen, eine einzelne Oracle SQL-Anweisung mit einem Semikolon am Ende auszuführen. Das Ergebnis wird ein Oracle-Fehler sein: ora-00911: ungültiges Zeichen. OK, Sie herausfinden, dass eine SQL-Anweisung nicht das Semikolon muss, aber was ist die Ausführung 2 SQL-Anweisung in einer Zeichenfolge zum Beispiel:

Dim db As Database = DatabaseFactory.CreateDatabase("db") 
Dim cmd As System.Data.Common.DbCommand 
Dim sql As String = "" 

sql = "DELETE FROM iphone_applications WHERE appid = 1; DELETE FROM iphone_applications WHERE appid = 2; " 

cmd = db.GetSqlStringCommand(sql) 
db.ExecuteNonQuery(cmd) 

Der obige Code gibt Ihnen die gleichen Oracle-Fehler: ora-00911: ungültiges Zeichen.

Die Lösung für dieses Problem ist Ihre 2 Oracle SQL-Anweisungen mit einer BEGIN und END; Syntax wickeln, zum Beispiel:

sql = "BEGIN DELETE FROM iphone_applications WHERE appid = 1; DELETE FROM iphone_applications WHERE appid = 2; END;" 

Courtesy: http://www.lazyasscoder.com/Article.aspx?id=89&title=ora-00911%3A+invalid+character+when+executing+multiple+Oracle+SQL+statements

+2

Wenn Sie Code in einer Frage/Antwort eingeben, ist es besser lesbar, wenn Sie es als Code formatieren. Die Schaltfläche "{}" erledigt dies für Sie oder Sie können den Code einfach manuell einrücken. Sie können auch Back-Ticks verwenden, um Code innerhalb eines Satzes zu markieren. –

3

In Oracle das Semikolon ';' wird nur in sqlplus verwendet. Wenn Sie ODBC/JDBC, OLEDB usw. verwenden, fügen Sie kein Semikolon am Ende Ihrer Anweisung ein. Im obigen Fall führen Sie tatsächlich zwei verschiedene Anweisungen aus, sodass Sie das Problem am besten mit 2 Anweisungen lösen können, anstatt zu versuchen, eine einzelne Anweisung zu kombinieren, da Sie das Semikolon nicht verwenden können.

0

Das Problem kann sein, dass Sie eine Parametervariable haben, die Null in die Abfrage eingefügt wird. Das war mein Problem. Sobald ich dem Parameter den Standardwert einer leeren Zeichenfolge gegeben habe, hat es funktioniert.