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

SQL Oracle Discussion :

OPEN CURSOR FOR avec type clob


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 182
    Points : 113
    Points
    113
    Par défaut OPEN CURSOR FOR avec type clob
    Bonjour,

    Je suis confronté à un probleme en Pl/SQL :
    J'ai une tres grande chaine de caracteres qui contient une requete, j'ai donc utilisé le type CLOB.
    requete CLOB;
    requete:= 'select ........'

    Ensuite je renvoie le resultat dans un curseur
    OPEN p_cursor FOR requete;

    Or la signature est Open p_cursor For <VARCHAR>, j'obtiens donc le message d'erreur suivant 'expression is of wrong type'.

    Auriez vous une idée pour résoudre ce probleme ?

    Merci

  2. #2
    Membre confirmé Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Points : 565
    Points
    565
    Par défaut
    Citation Envoyé par voyageur Voir le message
    Bonjour,

    Je suis confronté à un probleme en Pl/SQL :
    J'ai une tres grande chaine de caracteres qui contient une requete, j'ai donc utilisé le type CLOB.
    requete CLOB;
    requete:= 'select ........'

    Ensuite je renvoie le resultat dans un curseur
    OPEN p_cursor FOR requete;

    Or la signature est Open p_cursor For <VARCHAR>, j'obtiens donc le message d'erreur suivant 'expression is of wrong type'.

    Auriez vous une idée pour résoudre ce probleme ?

    Merci
    euh ....... Je capte pas là ...
    Le type CLOB est un type de données pour les CHAMPS.
    Pourquoi l'utilises tu pour une requete ???
    Ta requete (meme longue) ne rentre pas dans une chaine ?

    et pourquoi ne fais tu pas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    DECLARE
    CURSOR p_cursor IS ( TA_REQUETE);
    BEGIN
    OPEN p_cursor
    .....
    END;
    C'est pas parce que ca marche que c'est bon!!
    Pensez au bouton "Résolu"
    Je ne réponds pas en privé aux questions

  3. #3
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 182
    Points : 113
    Points
    113
    Par défaut
    La requete ne rentre pas dans un varchar, elle contient plus de 10 000 caracteres, et je dois renvoyer le resultat dans un curseur comme ceci
    OPEN p_cursor FOR requete.

  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
    Citation Envoyé par voyageur Voir le message
    La requete ne rentre pas dans un varchar, elle contient plus de 10 000 caracteres, et je dois renvoyer le resultat dans un curseur comme ceci
    OPEN p_cursor FOR requete.
    varchar2 en PL/SQL a plus de 32000 caracteres.

  5. #5
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    10000 caractères... et créer une vue ça ne te tente pas pour simplifier tout ça ?

  6. #6
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 182
    Points : 113
    Points
    113
    Par défaut
    Le varchar2 arrive finalement à contenir la requete.
    L'erreur se situe maintenant dans ma requete.
    J'aimerai affichier cette requete avec dbms_output.put_line(requete) mais cette fonction ne peut prendre une chaine de plus de 255 caracteres.
    Comment pourrais je affichier le resultat a l'ecran ?

  7. #7
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Essaye un truc de ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    FOR i IN 1..ROUND(LENGTH(tarequete),0)
      DBMS_OUTPUT.PUT_LINE(SUBSTR(tarequete, i * 255 - 255 ,  i* 255));
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(SUBSTR(tarequete, ROUND(LENGTH(tarequete),0));

  8. #8
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 182
    Points : 113
    Points
    113
    Par défaut
    J'ai un peu modifié cette procédure mais j'obtiens ce message :
    buffer overflow, limit of 20000 bytes

  9. #9
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET SERVEROUTPUT ON SIZE 1000000

  10. #10
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 182
    Points : 113
    Points
    113
    Par défaut
    Finalement je reviens au probleme initial la taille de ma requete est d'environ 50 000 caracteres et non 10 000!!

  11. #11
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    je redonne donc ma réponse : crée des vues

  12. #12
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 182
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par orafrance Voir le message
    je redonne donc ma réponse : crée des vues
    Je ne pense pas que ca puisse marcher avec des vues car je passe des variables comme parametres à cette requete,et cette requete est construite par iteration, comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for i in 0..50 loop
          requete := requete || 'select champs1,champs 2'
                         ||  'from table'
                         ||  'where champs1=''' || variable || ''''
                         || 'UNION ALL';
    end loop;
    open cursor for requete

  13. #13
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par voyageur Voir le message
    Je ne pense pas que ca puisse marcher avec des vues car je passe des variables comme parametres à cette requete,et cette requete est construite par iteration, comme ceci :
    Stocke ces valeurs dans une table, ça simplifiera l'écriture...

  14. #14
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Citation Envoyé par voyageur Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for i in 0..50 loop
          requete := requete || 'select champs1,champs 2'
                         ||  'from table'
                         ||  'where champs1=''' || variable || ''''
                         || 'UNION ALL';
    end loop;
    open cursor for requete
    pourquoi pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    requete := requete || 'SELECT * FROM vue1 '
                         ||  'where champs1=''' || variable || ''''
    parce que j'imagine quand même que tu as des jointures dans tout ça et pas seulement une liste de UNION ALL avec un simple WHERE col=valeur

    Sinon, comme le dit Jerome_Mtl, c'est probablement plus judicieux d'utiliser une table de paramètre et simplifier l'écriture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FOR result IN (SELECT  champs1,champs 2 FROM table WHERE champ1 = (SELECT valeur FROM tab_param WHERE param_name = 'monparametre') LOOP
    ...
    END LOOP;

  15. #15
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 182
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par orafrance Voir le message
    pourquoi pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    requete := requete || 'SELECT * FROM vue1 '
                         ||  'where champs1=''' || variable || ''''
    parce que j'imagine quand même que tu as des jointures dans tout ça et pas seulement une liste de UNION ALL avec un simple WHERE col=valeur

    Sinon, comme le dit Jerome_Mtl, c'est probablement plus judicieux d'utiliser une table de paramètre et simplifier l'écriture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FOR result IN (SELECT  champs1,champs 2 FROM table WHERE champ1 = (SELECT valeur FROM tab_param WHERE param_name = 'monparametre') LOOP
    ...
    END LOOP;
    Oui la requete est plus complexe que ca, je l'ai juste simplifiée pour montrer le principe.
    Ok pour la simplification avec une table de paramétrage mais ca ne resout pas mon probleme : Open curosr for <requete> avec requete chaine d'environ 50 000 caracteres.

  16. #16
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par voyageur Voir le message
    J'ai une tres grande chaine de caracteres qui contient une requete, j'ai donc utilisé le type CLOB.
    requete CLOB;
    requete:= 'select ........'

    Ensuite je renvoie le resultat dans un curseur
    OPEN p_cursor FOR requete;

    Or la signature est Open p_cursor For <VARCHAR>, j'obtiens donc le message d'erreur suivant 'expression is of wrong type'.
    Chez moi ça marche nickel ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Connected to:
    Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
     
    SQL> var c clob
    SQL> exec :c:='select * from dual'
     
    PL/SQL procedure successfully completed.
     
    SQL> var r refcursor
    SQL> exec open :r for :c
     
    PL/SQL procedure successfully completed.
    Prochaine fois, précise ta version

  17. #17
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 182
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par laurentschneider Voir le message
    Chez moi ça marche nickel ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Connected to:
    Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
     
    SQL> var c clob
    SQL> exec :c:='select * from dual'
     
    PL/SQL procedure successfully completed.
     
    SQL> var r refcursor
    SQL> exec open :r for :c
     
    PL/SQL procedure successfully completed.
    Prochaine fois, précise ta version
    Je travaille sur la version 9i.
    Chez moi ca donne ca : PLS-00382: expression is of wrong type

  18. #18
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    la réponse est donc, CLOB ne fonctionne qu'à partir de la 11g

  19. #19
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 182
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par laurentschneider Voir le message
    la réponse est donc, CLOB ne fonctionne qu'à partir de la 11g
    Je comprend pourquoi cette erreur.
    y'a t'il un autre moyen ?

  20. #20
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par voyageur Voir le message
    y'a t'il un autre moyen ?
    oui

    tu employes le type varchar2a (table de varchar2(32767)) et DBMS_SQL.OPEN_CURSOR

Discussions similaires

  1. ORA-00900 pour un "open cursor for"
    Par jadey dans le forum PL/SQL
    Réponses: 2
    Dernier message: 23/10/2009, 18h08
  2. Cursor For avec requête prédéfinie
    Par ilalaina dans le forum PL/SQL
    Réponses: 4
    Dernier message: 12/05/2009, 15h01
  3. PLS-00201 sur un OPEN cursor FOR
    Par tibal dans le forum PL/SQL
    Réponses: 4
    Dernier message: 24/11/2008, 21h38
  4. Réponses: 9
    Dernier message: 20/06/2007, 17h34
  5. [ASE] Les locks avec un cursor for update
    Par PiyuXYZ dans le forum Sybase
    Réponses: 1
    Dernier message: 11/02/2006, 13h17

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