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

PL/SQL Oracle Discussion :

Contourner la limitation Oracle à 32K pour la taille des paramètres de sortie de fonctions ou procédures


Sujet :

PL/SQL Oracle

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 188
    Points
    188
    Par défaut Contourner la limitation Oracle à 32K pour la taille des paramètres de sortie de fonctions ou procédures
    Bonjour

    A priori, la meilleure façon de lancer une procédure Oracle et d'en récupérer un résultat est de faire un CALL de la procédure et un bind de variable en paramètre de type OUT.

    Le problème est qu'Oracle limite la taille des paramètres à 32K, même si on le définit de type CLOB par exemple.

    Je me résouds, faute de mieux, à passer par le buffer (DBMS_OUT.PUT_LINE dans la proc et GET_LINES ensuite) mais si qqun a une meilleure solution, je suis preneur car je n'ai rien trouvé sur internet (à part utiliser plusieurs paramètres OUT et les concaténer dans PHP, mais bof bof)

    Merci bien
    Loko

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 188
    Points
    188
    Par défaut
    En passant par le buffer, les performances sont franchement mauvaises.

    Quelqu'un a t-il déjà utilisé une autre façon de faire ?

    Merci

  3. #3
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Je doute qu'on puisse trouver une solution en PHP, puisque le problème est visiblement au niveau de la procédure et non de son exécution.
    On va donc transférer le problème à nos amis de la rubrique Oracle
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  4. #4
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Le type de donnée CLOB n'est pas limité à 32K en PL/SQL. Cela est vrai pour l'ancien type LONG mais pas pour le Clob. Le problème est peut être lié au driver qui s'interpose entre PHP et Oracle.
    J'ai récemment développé une procédure PL/SQL qui renvoi un type Clob, utilisé via un programme Java et je suis arrivé à aller au delà de 32K lors de mes tests (c'était un de mes préoccupations en fait).
    Dans le pire des cases au lieu de passer par DBMS_OUTPUT mieux vaut insérer le clob dans une table temporaire el le lire suite à l'appel de la procédure PL/SQL via PHP.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 188
    Points
    188
    Par défaut
    Bonjour

    Pourtant, si j'utilise une variable locale CLOB, que je lui donne une valeur > 32K, puis que je veux à la fin donner sa valeur à mon paramètre clob OUT de procédure j'ai une erreur Oracle.
    Même chose si j'écris directement dans le paramètre OUT avec .append() ou .write().

    Meme avec un test direct dans Toad, sans passer par PHP.

    Pourrais je savoir comment vous avez développé votre procédure svp ? Ecriture directement dans le parametre OUT ? Si oui, avec quelle(s) fonctions ?

  6. #6
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    il n'y a rien de spécial dans la procédure. Prenons comme exemple cette procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE OR REPLACE Procedure t_clob (
     res      Out clob
    ) Is
    Begin
      dbms_lob.createtemporary(res, true);
      --
      res := Lpad('x',32760,'x');
      res := res||Lpad('y',32760,'y');
      dbms_output.put_line(dbms_lob.getlength(res));
    End;
    L'exécution de cette procédure en sqlplus donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SQL> set serveroutput on
    SQL> var res clob
    SQL> exec t_clob(:res)
    65520
     
    Procédure PL/SQL terminée avec succès.
     
    SQL> select dbms_lob.getlength(:res) from dual;
     
    DBMS_LOB.GETLENGTH(:RES)
    ------------------------
                       65520

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 188
    Points
    188
    Par défaut
    Effectivement, cela fonctionne de cette façon là.

    Merci bcp !

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 04/01/2012, 09h54
  2. script pour la taille des filesystem
    Par moi26 dans le forum Administration
    Réponses: 1
    Dernier message: 09/04/2009, 17h17
  3. [DOM] Amélioration d'un fonction pour la taille des polices
    Par boutmos dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 20/08/2008, 11h34
  4. [Oracle] Estimation de la taille des données
    Par miloux32 dans le forum Oracle
    Réponses: 6
    Dernier message: 14/11/2006, 13h32
  5. Réponses: 2
    Dernier message: 23/08/2006, 20h38

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