Question

J'utilise un fournisseur OLEDB pour ADO.Net se connectant à une base de données Oracle. Dans ma boucle, je fais un insert:

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)

La première insertion réussit mais la seconde génère une erreur:

ORA-00933: SQL command not properly ended

Qu'est-ce que je fais de travers?

Était-ce utile?

La solution

Il me semble qu'il vous manque un ; entre les deux instructions:
insérer dans les valeurs ps_tl_compleave_tbl ('2626899', 0, TO_DATE ('01 / 01/2002 ',' MM / JJ / AAAA '),' LTKN ',' LTKN ',' 52 ', TO_DATE ('01 / 01/2002 ',' MM / JJ / AAAA '), 16.000000, 24.000)
;
insérer dans les valeurs ps_tl_compleave_tbl ('4327142', 0, TO_DATE ('03/12/2002', 'MM / JJ / AAAA'), 'LTKN', 'LTKN', '51', TO_DATE ('03 / 23/2002 ',' MM / JJ / AAAA '), 0.000000, 0.000)
;
Essayez d’ajouter le ; et laissez-nous savoir.

Autres conseils

En .net, lorsque nous essayons d’exécuter une seule instruction SQL Oracle avec un point-virgule à la fin. Le résultat sera une erreur oracle: ora-00911: caractère non valide. OK, vous pensez qu'une instruction SQL n'a pas besoin du point-virgule, mais qu'en est-il de l'exécution de 2 instructions SQL dans une chaîne, par exemple:

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)

Le code ci-dessus vous donnera la même erreur Oracle: ora-00911: caractère non valide.

La solution à ce problème consiste à envelopper vos 2 instructions SQL Oracle avec une syntaxe BEGIN et END; , par exemple:

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

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

Dans Oracle, le point-virgule ';' n'est utilisé que dans sqlplus. Lorsque vous utilisez ODBC / JDBC, OLEDB, etc., vous ne mettez pas de point-virgule à la fin de votre déclaration. Dans le cas ci-dessus, vous exécutez actuellement 2 instructions différentes. Le meilleur moyen de gérer le problème consiste à utiliser 2 instructions au lieu d'essayer de les combiner en une seule instruction, car vous ne pouvez pas utiliser le point-virgule.

point-virgule après le premier insert?

Oracle SQL utilise un point-virgule; comme marqueur de fin de déclaration.

vous devrez ajouter le; après la peine d'insérer des déclarations.

NB: cela suppose également que ADODB autorisera 2 insertions en un seul appel.

L’alternative peut être d’envelopper les deux appels dans un bloc,

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

Dans ma boucle, je ne réinitialisais pas mon StringBuilder ... d'où la déclaration d'insertion multiple que j'ai postée.

Merci pour votre aide quand même !!

C’est long, mais lors de la première insertion, le format de date SQL est valide à la fois pour uk / us, la deuxième insertion n’est pas valide si la base de données Oracle est configurée pour le format de date UK. Je réalise que vous avez utilisé la fonction TO_DATE ne vois rien d'autre ...

Le point-virgule est-il nécessaire chez OLE_DB? Ce n'est pas nécessaire de la plupart des API?

Le fournisseur ADO.NET OLE DB sert à l’accès aux données génériques lorsque vous n’avez pas de fournisseur spécifique pour votre base de données. Utilisez OracleConnection et autres de préférence à OleDbConnection pour une connexion à une base de données Oracle.

En plus du problème du point-virgule, je vous recommande vivement de vous pencher sur les variables de liaison. Ne pas les utiliser peut entraîner des problèmes de performances de la base de données. Le code a également tendance à être plus propre.

Le problème peut être que vous avez une variable de paramètre qui est null insérée dans la requête. C'était ça mon problème. Une fois que j'ai donné au paramètre une valeur par défaut de chaîne vide, cela a fonctionné.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top