SQLSyntaxErrorException: ORA-00911: caractère non valide

J'essaie d'INSÉRER des enregistrements à une DB Oracle à l'aide de PreparedStatement mais je ne reçois cette erreur. À ce stade, mes efforts pour les surmonter, il l'emporte de loin sur mes progrès, et donc une autre paire d'yeux peut aider. Où est le caractère non valide?

Beaucoup de ce que j'ai trouvé suggère qu'une fuite ";" à l'intérieur de votre Chaîne sql peut être le coupable, mais je n'ai pas eu une dans ma déclaration, dès le départ.

Ma connexion elle-même, qui œuvres parfaitement à plusieurs autres endroits dans le programme:

Properties props = new Properties();
props.setProperty( "user", username );
props.setProperty( "password", password );
props.setProperty( "defaultRowPrefetch", "10" );
props.setProperty( "defaultBatchValue", "10" );
props.setProperty( "processEscapes", "false" );

DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
Connection conn = DriverManager.getConnection(DB_URL_SVC, props);

La façon dont je tiens à le faire (sauf que je l'envelopper dans une méthode qui accepte trois Cordes), mais il jette un SQLSyntaxErrorException

String INSERT_BIKE = "INSERT INTO RACEBIKES ( BIKENAME , COUNTRY_OF_ORIGIN , COST ) VALUES ( ? , ? , ? )";
PreparedStatement preStatement = conn.prepareStatement( INSERT_BIKE );
preStatement.setString(1, "JHT");
preStatement.setString(2, "USA");
preStatement.setInt(3, 2500);
preStatement.executeUpdate();    //ORA-00911: invalid character error

Ce œuvres, mais défait le but de l'utilisation de PreparedStatement étant donné que les paramètres sont codés en dur:

String INSERT_BIKE = "INSERT INTO RACEBIKES ( BIKENAME , COUNTRY_OF_ORIGIN , COST ) VALUES ( 'JHT' , 'USA' , '2500' )";
PreparedStatement preStatement = conn.prepareStatement( INSERT_BIKE );
preStatement.executeUpdate();

Œuvres. Cependant, je comprends que la concaténation de variables avec des apostrophes et des guillemets n'est pas vraiment la meilleure façon pour que PreparedStatement devrait soulager d'avoir à traiter avec la partie de la syntaxe:

String value1 = "JHT";
String value2 = "USA";
int value3 = 2500;
String INSERT_BIKE = "INSERT INTO RACEBIKES ( BIKENAME , COUNTRY_OF_ORIGIN , COST ) VALUES ( '" + value1 + "', '" + value2 + "', '" + value3 + "' )";
PreparedStatement preStatement = conn.prepareStatement( INSERT_BIKE );
preStatement.executeUpdate();

Échoue avec un SQLSyntaxErrorException. Donc, même si le code devis syntaxe moi-même, je suis toujours incapable de placer ces variables dans le preStatement.setString(), ce qui permettrait au moins de laisser un peu de souplesse.

String INSERT_BIKE = "INSERT INTO RACEBIKES ( BIKENAME , COUNTRY_OF_ORIGIN , COST ) VALUES ( ? , ? , ? )";
PreparedStatement preStatement = conn.prepareStatement( INSERT_BIKE );
preStatement.setString(1, "' + value1 + '");
preStatement.setString(2, "' + value2 + '");
preStatement.setInt(3, "' + value3 + '");
preStatement.executeUpdate();    //ORA-00911: invalid character error

Échoue. En joignant les espaces réservés dans mon String avec les guillemets simples résultats dans SQLException.

String INSERT_BIKE = "INSERT INTO RACEBIKES ( BIKENAME , COUNTRY_OF_ORIGIN , COST ) VALUES ( '?' , '?' , '?' )";
PreparedStatement preStatement = conn.prepareStatement( INSERT_BIKE );
preStatement.setString(1, "JHT");
preStatement.setString(2, "USA");
preStatement.setInt(3, 2500);
preStatement.executeUpdate();    //invalid column index

Échoue. En joignant les deux String (mais pas le int) des espaces réservés dans mon String avec les guillemets simples résultats dans SQLException.

String INSERT_BIKE = "INSERT INTO RACEBIKES ( BIKENAME , COUNTRY_OF_ORIGIN , COST ) VALUES ( '?' , '?' , ? )";
PreparedStatement preStatement = conn.prepareStatement( INSERT_BIKE );
preStatement.setString(1, "JHT");
preStatement.setString(2, "USA");
preStatement.setInt(3, 2500);
preStatement.executeUpdate();    //invalid column index

Ce n'est pas un échec, mais ne pas écrire dans la base de données soit (même si je n'ai pas désactivé auto-commit).

String INSERT_BIKE = "INSERT INTO RACEBIKES ( BIKENAME , COUNTRY_OF_ORIGIN , COST ) VALUES ( ? , ? , ? )";
PreparedStatement preStatement = conn.prepareStatement( INSERT_BIKE );
preStatement.setString(1, "JHT");
preStatement.setString(2, "USA");
preStatement.setInt(3, 2500);
preStatement.executeBatch();

J'ai aussi essayé toutes les évasions par des barres obliques inverses, double barres obliques inverses, backticks, quitsies, sans startsies, erasies, double-timbres, et les tofus-make-it-vrai! Peut-être quelqu'un là-bas sait le vaudou qui va m'aider?!

Afin d'utiliser executeBatch(), vous devez appeler addBatch() (pour chaque ligne) avant. Je suppose qu'ensuite, il va échouer.
Ce qui me frappe, c'est que votre troisième paramètre est un int, mais dans vos exemples, vous utilisez des guillemets simples, trop. Qu'advient-il si vous quittez? Si cela ne fonctionne pas non plus, je suppose que votre COST colonne est VARCHAR, trop.
Ah oui, j'ai oublié d'inclure ce cas dans mon post original. À l'aide de executeBatch() a été plus d'un coup de feu dans l'obscurité que j'ai essayé parce que j'avais mis un batchValue dans mes propriétés de l'objet. Dans ce cas, l'utilisateur ne peut mettre à jour un enregistrement unique. Mais y compris addBatch() juste au-dessus de executeBatch() toujours des résultats dans BatchUpdateException: ORA-00911: caractère non valide.
Le COST colonne est une NUMBER mais en enlevant les guillemets simples jette ORA-00911.
Tu veux dire, l'exécution de "INSERT INTO RACEBIKES ( BIKENAME , COUNTRY_OF_ORIGIN , COST ) VALUES ( 'JHT' , 'USA' , 2500 )" résultats dans un ORA-00911, trop? Pourriez-vous veuillez modifier votre première (d'origine) extrait de: preStatement.setString(3, "2500"); et essayer de nouveau?

OriginalL'auteur es0329 | 2013-03-29