IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JDBC Java Discussion :

Une question concernant l'utilisation de PreparedStatement et le message d'erreur ORA


Sujet :

JDBC Java

  1. #1
    Membre averti Avatar de dariyoosh
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 236
    Points : 334
    Points
    334
    Par défaut Une question concernant l'utilisation de PreparedStatement et le message d'erreur ORA
    Bonjour,

    Je suis débutant en JDBC et j'ai un problème si vous pourriez m'aider (merci c'est très très gentil )


    j'utilise:

    - Oracle Database 11g Enterprise (Release 11.1.0.6.0)
    - JDBC thin driver version: ( 11.1.0.7.0-Production)
    - JDK 1.6
    - Operating system: Linux (Ubuntu 8.10)

    voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    import java.sql.*;
     
    public class Main
    {
        public static void main(String[] args)
        {        
            String dbURL = "jdbc:oracle:thin:@localhost:1521:mydatabase";
            String username = "scott";
            String user_password = "tiger";
     
            try
            {
                Connection connection = DriverManager.getConnection(dbURL, username, user_password);
     
                String query_text = "SELECT * FROM mytable";
                Statement statement = connection.createStatement();
                ResultSet query_result = statement.executeQuery(query_text);
     
                connection.close();
            }
            catch (SQLException e)
            {
                for (Throwable t: e)
                    t.printStackTrace();
            }
        }
    }
    ça marche très bien, sans aucun problème. Par contre si j'utilise PreparedStatement au lieu de Statement, alors j'aurai le message d'erreur ORA-03115. C'est à dire quand je modifie le code de la façon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    String query_text =
            "SELECT first_name, ?, id, ?, job_title, salary  FROM mytable "+
            "WHERE id IN ('id14', ?, 'id17', 'id18')";
     
    PreparedStatement prepared_statement =  connection.preparedStatement(query_text);
     
    prepared_statement.setString(1, "last_name");
    prepared_statement.setString(2, "birthday");
    prepared_statement.setString(3, "id02");
     
    ResultSet query_result = prepared_statement.executeQuery(query_text);
    J'aurai le message suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    java.sql.SQLException: ORA-03115: unsupported network datatype or representation
     
    	at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
    	at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133)
    	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:206)
    	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:455)
    	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:413)
    	at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:1034)
    	at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:194)
    	at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:791)
    	at oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:866)
    	at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1186)
    	at oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1377)
    	at oracle.jdbc.driver.OracleStatementWrapper.executeQuery(OracleStatementWrapper.java:387)
    	at mysqlpackage.Main.main(Main.java:33)
    c'est à dire, juste après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ResultSet query_result = prepared_statement.executeQuery(query_text);
    c'est l'exception qui est lancée,

    Ma question: Pourquoi ça marche avec Statement mais pas avec PreparedStatement? J'ai même fait d'autres tests avec d'autres requêtes, INSERT, DELETE etc. , à chaque fois le programme fonctionne bien, mais dès que je remplace Statement par PreparedStatement de la façon décrite au-dessus, j'ai le message ORA-03115.

    Quelqu'un a une idée?


    Merci d'avance,

  2. #2
    Membre averti Avatar de dariyoosh
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 236
    Points : 334
    Points
    334
    Par défaut
    Bon,

    moi-même après un peu plus de Googling, j'ai trouvé la réponse. En fait j'avais commis deux erreurs:

    Première erreur: j'avais utilisé ? dans la requête aussi pour le nom des colonnes, alors que ça n'a pas de sens car c'est une requête qui va être pré-compilée, et il est clair que toutes les colonnes doivent être connues avant la compilation.

    Deuxième erreur: Au lieu d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ResultSet query_result =  prepared_statement.executeQuery(query_text);
    Il fallait écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ResultSet query_result =  prepared_statement.executeQuery();
    J'ai fait le test suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    tring query_text =
                  "SELECT first_name, last_name, id, birthday, job_title, salary "+
                  "FROM myenterprise "+
                  "WHERE id IN (?, ?, ?, ?) ";
     
                PreparedStatement prepared_statement = 
                        connection.prepareStatement(query_text);
     
                prepared_statement.setString(1, "id02");
                prepared_statement.setString(2, "id04");
                prepared_statement.setString(3, "id08");
                prepared_statement.setString(4, "id09");
     
                ResultSet query_result =  prepared_statement.executeQuery();

    Et cette fois ça a très bien marché.

    Voilà, mon problème est donc reglé

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 33
    Points : 40
    Points
    40
    Par défaut
    Citation Envoyé par dariyoosh Voir le message
    Voilà, mon problème est donc reglé
    Tu peux donc utiliser le tag résolu

  4. #4
    Membre averti Avatar de dariyoosh
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 236
    Points : 334
    Points
    334
    Par défaut
    Citation Envoyé par drhouse Voir le message
    Tu peux donc utiliser le tag résolu
    Ah oui, pardon, j'avais oublié

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Une question concernant le console de Tomcat
    Par dariyoosh dans le forum NetBeans
    Réponses: 1
    Dernier message: 12/04/2009, 16h39
  2. Réponses: 4
    Dernier message: 10/07/2008, 15h51
  3. [Visual Web] une question concernant le visual web pack
    Par developper2006 dans le forum NetBeans
    Réponses: 1
    Dernier message: 09/03/2007, 18h50
  4. Questions concernant l'utilisation des ComboBox
    Par philguio dans le forum Windows Forms
    Réponses: 2
    Dernier message: 09/01/2007, 11h26
  5. une question concernant à Timer dans C++.2005
    Par lzw1015bean dans le forum VC++ .NET
    Réponses: 1
    Dernier message: 01/08/2006, 12h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo