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 :

Passage d'un paramètre vers une procédure stockée


Sujet :

JDBC Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    923
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 923
    Points : 760
    Points
    760
    Par défaut Passage d'un paramètre vers une procédure stockée
    Bonjour,

    Je suis en train de développer une application Java qui doit lancer une procédure estoqué avec un paramètre. Je mets ci-dessous ma procédure et la code Java qui je suis en train d'utiliser:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE DEFINER=`root`@`localhost` PROCEDURE `CLEANTABLE`(IN `TBL` TEXT)
    	LANGUAGE SQL
    	NOT DETERMINISTIC
    	CONTAINS SQL
    	SQL SECURITY DEFINER
    	COMMENT 'procedure pour effacer les donnés des tables avant l\'importation'
    BEGIN
    	DELETE FROM `TBL`;
    END
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    String tableName = "tblgaznat";
    try {
        String sqlTest = "{call cleantable(?)}";
        CallableStatement st = con.prepareCall(sqlTest);
        st.setString(1, tableName);
        System.out.println("tableName : " + tableName + "|| paramètre : " + st.getString(1));
        st.execute();
    }
    Mais quand je lance mon application, j'ai le System.out.println() et l'erreur suivants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableName : tblgaznat|| paramètre : null
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    java.sql.SQLSyntaxErrorException: Table 'antargazdb.tbl' doesn't exist
    	at org.mariadb.jdbc.internal.SQLExceptionMapper.get(SQLExceptionMapper.java:138)
    	at org.mariadb.jdbc.internal.SQLExceptionMapper.throwException(SQLExceptionMapper.java:106)
    	at org.mariadb.jdbc.MySQLStatement.executeQueryEpilog(MySQLStatement.java:264)
    	at org.mariadb.jdbc.MySQLStatement.execute(MySQLStatement.java:288)
    	at org.mariadb.jdbc.MySQLStatement.execute(MySQLStatement.java:338)
    	at org.mariadb.jdbc.MySQLCallableStatement.execute(MySQLCallableStatement.java:1234)
    	at RapportGenerator.loadGazNatToDatabse(RapportGenerator.java:253)
    	at RapportGenerator.main(RapportGenerator.java:74)
    Caused by: org.mariadb.jdbc.internal.common.QueryException: Table 'antargazdb.tbl' doesn't exist
    	at org.mariadb.jdbc.internal.mysql.MySQLProtocol.getResult(MySQLProtocol.java:942)
    	at org.mariadb.jdbc.internal.mysql.MySQLProtocol.executeQuery(MySQLProtocol.java:991)
    	at org.mariadb.jdbc.MySQLStatement.execute(MySQLStatement.java:281)
    	... 4 more
    Apparentement le paramètre n'est pas correctement passé à la procédure...

    Est-ce que quelqu'un pourrait m'aider svp?
    Je vous remercie d'avance pour l'aide...

  2. #2
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    La réponse est :
    Table 'antargazdb.tbl' doesn't exist

    ce qui veut dire que la table antargazdb n'existe pas

    ce qui veut dire que le code que tu as posté ne correspond pas :
    tu as mis : String tableName = "tblgaznat";
    et il te renvoie une erreur sur une autre table.

    vérifie l'existence des tables
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    923
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 923
    Points : 760
    Points
    760
    Par défaut
    Salut Népomucène,

    Merci de ta réponse. En effet antargazdb est le nom de la base de données. En regardant cet erreur j'ai décidé de faire le println pour voir le paramètre qu'était passé et j'ai trouvé le NULL qui j'ai mis avant...

    Si à la place de la procédure je fais une simple requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Statement stmt = con.createStatement();
    String sql = "DELETE FROM " + tableName;
    stmt.execute(sql);
    tout marche bien

  4. #4
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    Du coup, c'est la rédaction de ta procédure qui ne marche pas au niveau de
    Il cherche à vider une table qui s'appelle TBL
    je crois qu'il y a confusion entre le nom de la table et le nom du paramètre.

    Je ne sais pas si ce que tu cherches à faire est possible : vider une table en donnant le nom de table en paramètre
    En Sql Server par exemple, ce n'est pas faisable (ou alors on bidouille mais bon ...)
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    923
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 923
    Points : 760
    Points
    760
    Par défaut
    En fait j'ai aussi essayé sans les apostrophes

    Mais j'ai le même erreur. Peut-être t'as raison et je ne peux pas passer la table en paramètre, mais je trouve bizarre quand même...

    ça n'explique non plus pourquoi mon paramètre est retourné en tant que NULL dans le println() que j'ai mis pour faire le test...


    Mais bon, pendant que ça marche pas je vais peut-être rester avec la requête, merci en tout cas

  6. #6
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    là c'est normal que tu aies une erreur car cela veut dire texto "Merci de vider la table TBL"
    et comme ta table TBL n'existe pas ...

    ça n'explique non plus pourquoi mon paramètre est retourné en tant que NULL dans le println() que j'ai mis pour faire le test...
    Je ne connais pas bien les collablestatement car en fait on n'est pas obligé de s'en servir avec les bases que je connais (Sql Server et MySql)
    Cependant, d'après la faq c'est pour récupérer une valeur après exécution de la procédure

    je vais peut-être rester avec la requête
    en effet, c'est un exagéré de mobiliser une procédure juste pour cela ...
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  7. #7
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    C'est quelle base de données ? MySQL, SQL Serveur, ... ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    Dans le stackTrace il y a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    org.mariadb.jdbc.internal.common.QueryException
    donc ça doit être du mariadb
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    923
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 923
    Points : 760
    Points
    760
    Par défaut
    Salut OButterlin,

    J'ai oublié de préciser ça: MariaDB 10.

    Népomucène, je crois que la FAQ parle des paramètres OUT, j'ai un paramètre d'entrée...

  10. #10
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    je crois que la FAQ parle des paramètres OUT, j'ai un paramètre d'entrée
    Ben oui, et c'est pour cela que ça ne marche pas.
    getString c'est pour récupérer une valeur en retour, pas pour lire un paramètre en entrée
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  11. #11
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    As-tu essayé de créer la procédure par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CREATE PROCEDURE CLEANTABLE (TBL CHAR(128))
    ...
    Le 'TBL' devrait être interprété comme une constante caractères
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    923
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 923
    Points : 760
    Points
    760
    Par défaut
    J'avais essayé en tant que VARCHAR et TEXT.

    Mais c'est pas très grave, j'ai décidé de faire la requête directement, comme à dit Népomucène celle-là n'impacte pas trop à niveau des performances...
    Sinon j'ai réussi à lancer une autre procédure qui ne demande pas des paramètres...


    En tout cas merci beaucoup à tous les deux...

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

Discussions similaires

  1. Passage d un nom de table en paramètre d'une procédure stockée
    Par Cedric33 dans le forum Développement
    Réponses: 22
    Dernier message: 10/02/2009, 16h12
  2. Réponses: 2
    Dernier message: 21/12/2005, 17h33
  3. [SQL Server] Passage d'un paramètre dans une procédure
    Par navis84 dans le forum Bases de données
    Réponses: 3
    Dernier message: 14/01/2005, 13h19
  4. Passer le nom de colonne en paramètre d'une procédure stocké
    Par theartist dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 04/01/2005, 15h39
  5. Un fichier .bmp comme paramètre d'une Procédure stockée
    Par FONKOU dans le forum Bases de données
    Réponses: 2
    Dernier message: 28/10/2004, 17h56

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