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 :

java.sql.SQLException: setString ne peut traiter que les chaînes de moins de 32 766 c


Sujet :

JDBC Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6
    Points : 6
    Points
    6
    Par défaut java.sql.SQLException: setString ne peut traiter que les chaînes de moins de 32 766 c
    Bonjour,

    J'utilise une base de données Oracle 10g, avec le dernier driver jdbc (ojdbc14).
    Dans ma base de données j'ai crée un procedure stockée.

    J'ai crée un programme en java qui se connecte a la base de données puis envoie les variables a ma procédure stockée à l'aide de la classe CallableStatement, dans mon cas 3 variables :
    Voici donc le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    		  String procedure= "{? = call fct(?,?,?)}";
     
    		    CallableStatement call = connexion.prepareCall();
     
    		    call.registerOutParameter(1, java.sql.Types.VARCHAR);
    		    call.setString(2, _chaine1);
    		    call.setString(3, _chaine2);
    		    call.setString(4, _chaine3);
     
    	            boolean retour = call.execute();
    Mon programme fonctionne correctement, cependant lorsque une des variables est trop volumineuse le programme sort l'exception

    java.sql.SQLException: setString ne peut traiter que les chaînes de moins de 32 766 caractères

    En effet je veux envoyer un fichier à ma procedure stockée, cependant il est apparament impossible d'envoie ce fichier grâce a la méthode setString().

    J'ai donc tenté d'envoyer le fichier sous forme de BLOB à ma procédure stockée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    		  String procedure= "{? = call fct(?,?,?)}";
     
    		    CallableStatement call = connexion.prepareCall();
     
    		    call.registerOutParameter(1, java.sql.Types.VARCHAR);
    		    call.setString(2, _chaine1);
    		    call.setString(3, _chaine2);
                        call.setBinaryStream(4, _fichier, _taillefichier);
     
    	            boolean retour = call.execute();
    Cependant je bute sur l'exception :

    java.sql.SQLException: La taille des données est supérieure à la taille max. pour ce type: 1748080

    Mon fichier fesant bien 1748080 octets.

    Donc la question est comment peut on envoyer des fichiers à une procédure stockée ??

    Merci pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    l'utilisation d'un blob est nécessaire (note que les varchar en oracle sont limités à max 4000 charactères, donc t'aurais de toutes façons été coincé.

    Quand à la limitation de taille au niveau du blob, ca tiens, je pense à ce qui est déclaré dans ton callable coté serveur plutôt qu'à jdbc. Normalement, setBinaryStream coupe le stream en petit bloc, envoyés l'un à la suite de l'autre.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Bonjour tchize_

    Merci pour ta réponse, voici l'entête de la procédure stockée


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    create or replace FUNCTION  FCT
    (
    ADR IN VARCHAR2,
    SUJET IN VARCHAR2,
    PJOINTE IN BLOB,
    ) RETURN VARCHAR2
    Normalement ça devrais fonctionner, je ne vois pas d'ou viens le problème ?

    De plus j'ai essayé d'insérer un Blob dans une table que j'ai crée, en utilisant la même méthode setBinaryStream() de la classe PreparedStatement et cela fonctionne très bien.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Pour Info, sur le site

    http://youngcow.net/doc/oracle10g/ja...355/oralob.htm il est ecrit que

    If you pass a BLOB to a PL/SQL procedure, then the BLOB must be no bigger than 32K - 7.

    Donc le problème viens de la, on ne peut envoyer un BLOB d'une taille supérieure à 32k octets vers une procedure stockée.

    La seule solution que j'ai trouvé et qui fonctionne trés bien, , est d'utiliser une table, dans laquelle :

    - on inserer le blob
    - on recupere dans le corps de la procédure stockée
    - puis on supprime le blob de la table

    J'espère que ça pourra aider ceux qui sont tombé sur la même problématique que moi

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    une méthode plus tordue serait d'ailleur un trigger sur la table. Tu insèr un row qui correspond au paramètres de ta procédure stockée et tu déplace le code de la procédure strockée vers le trigger (qui au passage supprimera le row nouvellement inséré)

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 25/01/2006, 18h25
  2. Réponses: 5
    Dernier message: 12/12/2005, 13h13
  3. Réponses: 3
    Dernier message: 24/11/2005, 12h24
  4. java.sql.SQLException: read-only
    Par mehdi.kiwi dans le forum Oracle
    Réponses: 6
    Dernier message: 17/05/2005, 16h46
  5. [JDBC] java.sql.SQLException: Closed Statement
    Par cmoulin dans le forum JDBC
    Réponses: 4
    Dernier message: 03/09/2004, 17h22

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