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 :

problème de création dynamique de la requete sql d'un REF_CURSOR


Sujet :

PL/SQL Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 15
    Points : 11
    Points
    11
    Par défaut problème de création dynamique de la requete sql d'un REF_CURSOR
    Bonjour,

    je rencontre un problème de formatage de ma variable sqlSelect dans une procédure stockée que j'ai créée sur une base oracle 8.1.7.4.

    Voici le 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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    CREATE OR REPLACE PROCEDURE MSF.GA_CC_EXTRACTION_MOVEX (
        param1 varchar2,
        param2 varchar2,
        param3 varchar2
    )
    IS 
        -- ErrorHandler    
        v_err_num    NUMBER;
        v_err_msg    VARCHAR2(512);
     
        -- curseur dynamique
        type ref_cursor is REF CURSOR;
        cursor1 ref_cursor;
        -- definition de la structure de l'enregistrement = structure de la table GA_CC_TEMP_SIMULATION_DETAIL   
        record1 MSF.GA_CC_TEMP_SIMULATION_DETAIL%ROWTYPE;    
     
        -- la requête SQl construite dynamiquement en fonction des paramètres
        sqlSelect varchar2(5000);
        -- clauses WHERE initialisée en fonction des paramètres
        sqlWhereMITBAL varchar2(500);
        sqlWhereMITTRA varchar2(500);
        sqlWhereMITPLO varchar2(500);
        sqlWhereMITMAS varchar2(500);
     
        --test    
        str_len number; 
        loop_count number default 0;      
     
      BEGIN
     
        -- construction dynamique de la clause WHERE en fonction des paramètres
    sqlSelect := 'select mitwhl.mwfaci,mitbal.mbwhlo,mitbal.mbitno,mitmas.mmitds,mitmas.mmstat,mitbal.mbabcd,mitbal.mbresp,count(mitbal.mbstqt),mitbal.mbleat,(case when mbwhlo=''2SD'' then 1 else 1 end) * (sum(case when mittra.mtttyp=51 then 1 else 0 end) * 1 + sum(case when mittra.mtttyp=41 then 1 else 0 end) * 1 + sum(case when mittra.mtttyp=31 then 1 else 0 end) * 1 + sum(case when mittra.mtttyp=11 then 1 else 0 end) * 1),0,case when mitbal.mbwhlo=''2DM'' then ''UORE'' when mitbal.mbwhlo = ''2SD'' then ''UORE'' when mitbal.mbwhlo = ''2HC'' then ''OUT'' when mitbal.mbwhlo = ''2JC'' then ''OUT'' when mitbal.mbwhlo = ''2ST'' then ''UORM'' else case when mitmas.MMRESP = ''UOEC'' then ''UOEC'' when mitmas.MMRESP = ''UORM'' then ''UORM'' when mitmas.MMRESP = ''UOJC'' then ''UOJC'' when mitmas.MMRESP = ''UORE'' then ''UORE'' else case when mitmas.MMITCL = ''MILIT'' then ''UORM'' else case when mitmas.MMBUAR = ''FRE'' then ''UOEC'' when mitmas.MMBUAR = ''IFR'' then ''UOEC'' when mitmas.MMBUAR = ''HYD'' then ''UOEC'' when mitmas.MMBUAR = ''IHY'' then ''UOEC'' when mitmas.MMBUAR = ''IRO'' then ''UOEC'' when mitmas.MMBUAR = ''ROU'' then ''UOEC'' when mitmas.MMBUAR = ''BSC'' then ''UOEC'' when mitmas.MMBUAR = ''IBS'' then ''UOEC'' when mitmas.MMBUAR = ''IFA'' then ''UOEC'' when mitmas.MMBUAR = ''IVR'' then ''UOEC'' when mitmas.MMBUAR = ''VER'' then ''UOEC'' when mitmas.MMBUAR = ''FAI'' then ''UOEC'' when mitmas.MMBUAR = ''ITR'' then ''UOJC'' when mitmas.MMBUAR = ''STR'' then ''UOJC'' when mitmas.MMBUAR = ''TAV'' then ''UOJC'' when mitmas.MMBUAR = ''TCE'' then ''UOJC'' when mitmas.MMBUAR = ''TPR'' then ''UOJC'' when mitmas.MMBUAR = ''ETR'' then ''UOJC'' when mitmas.MMBUAR = ''IPO'' then ''UORM'' when mitmas.MMBUAR = ''POM'' then ''UORM'' else ''????'' end end end end, DECODE(mbleat, 0, 0, count(mittra.mtitno)/mbleat), 0, DECODE(mbleat, 0, 0, 360/mbleat), ValAtt_Tous, 0, QteAtt_Tous, idsuno, idsunm, mmprgp 
    from mvxjdta.mitbal, mvxjdta.mitmas, mvxjdta.mittra , mvxjdta.mitwhl, mvxjdta.cidmas, MSF.GA_CC_w_VALEUR_ENCOURS 
    where mitbal.mbcono = 800
    and mitbal.mbwhlo IN (''2SD'', ''2SP'')
    and mitbal.mbitno = ''GA59231''
    and mitbal.mbcono = mitmas.mmcono
    and mitbal.mbitno = mitmas.mmitno
    and mitmas.mmstat <> 90
    and mitbal.mbcono = mittra.mtcono
    and mitbal.mbwhlo = mittra.mtwhlo
    and mitbal.mbitno = mittra.mtitno
    and ((mtttyp = 51 and mtrftx IN (''2SP=>2SD'', ''2SP=>2DM'', ''2SD=>2SP'')) or (mtttyp = 41 and mttrtp = ''SVM'') or (mtttyp = 31 and mttrtp = ''VFI'') or (mtttyp = 11 and mttrtp = ''OFS''))
    and mttrdt > to_number(to_char(sysdate - 360 + (mbleat * 1), ''yyyymmdd''))
    and mitbal.mbcono = mitwhl.mwcono
    and mitbal.mbwhlo = mitwhl.mwwhlo
    and mitmas.mmcono = cidmas.idcono
    and mitmas.mmsuno = cidmas.idsuno
    and 1=1
    and mitbal.mbwhlo = GA_CC_w_VALEUR_ENCOURS.Depot (+)
    and mitbal.mbitno = GA_CC_w_VALEUR_ENCOURS.Reference (+)
    group by mwfaci, mbwhlo, mbitno, mmitds, mmstat, mbabcd, mbresp, mbleat, mmresp, mmitcl, mmbuar, idsuno, idsunm, mmprgp, ValAtt_Tous, QteAtt_Tous';
     
        -- affichage de la requete dans DBMS Output
        str_len := length(sqlSelect);
        dbms_output.put_line(str_len); 
        while loop_count < str_len   
        loop      
            dbms_output.put_line(substr(sqlSelect, loop_count +1, 254 ));      
            loop_count := loop_count +254; 
        end loop;
     
        -- ouverture du curseur dynamique
        open cursor1 for sqlSelect;
        loop 
            fetch cursor1 into record1;
            exit when cursor1%NOTFOUND;
            dbms_output.put_line(record1.ARTICLE);      
        end loop;
     
     
    EXCEPTION
      WHEN NO_DATA_FOUND THEN 
          BEGIN 
            v_err_num := SQLCODE;
            v_err_msg := SQLERRM;
            DBMS_OUTPUT.PUT_LINE ('Erreur d''exécution1 : |'||v_err_num||'|'||v_err_msg);
          END;
      WHEN OTHERS THEN
          BEGIN 
            v_err_num := SQLCODE;
            v_err_msg := SQLERRM;
            DBMS_OUTPUT.PUT_LINE ('Erreur d''exécution2 : |'||v_err_num||'|'||v_err_msg);
          END;
    END;
    /
    J'obtiens une exception lorsque j'essaye d'ouvrir le cursor1 avec l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Erreur d'exécution2 : |-1007|ORA-01007: variable not in select list
    Si j'exécute ma requete directement dans sql*plus, elle fonctionne.
    Par contre, il faut que je la remette en forme. La chaîne que j'affiche dans le DBMS Output n'est pas correctement formatée. J'ai des sauts de ligne en plein milieu d'une instruction. Et visiblement le problème ne provient pas de la boucle qui permet l'affichage de chaine > à 255 caractères.

    Est-ce que quelqu'un a déjà rencontré ce problème ?

    Merci d'avance.

  2. #2
    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
    Vous avez déclaré une variable cible du fetch de type
    MSF.GA_CC_TEMP_SIMULATION_DETAIL%ROWTYPE
    mais votre select cherche les donnés ailleurs

    from mvxjdta.mitbal, mvxjdta.mitmas, mvxjdta.mittra , mvxjdta.mitwhl, mvxjdta.cidmas, MSF.GA_CC_w_VALEUR_ENCOURS
    where

  3. #3
    Membre à l'essai
    Inscrit en
    Novembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    merci pour ta réponse mnitu.
    C'est volontaire, je me débrouille pour que mon select me retourne ce que je veux avoir dans ma table MSF.GA_CC_TEMP_SIMULATION_DETAIL.

    Par contre, j'ai trouvé mon problème.
    Ce n'est pas lié au formatage de la requête SQL, les colonnes retournées par mon select ne corresponde pas aux colonnes de ma table qui définie le %ROWTYPE.

    Merci.

  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 herr_jd Voir le message
    merci pour ta réponse mnitu.
    C'est volontaire, je me débrouille pour que mon select me retourne ce que je veux avoir dans ma table MSF.GA_CC_TEMP_SIMULATION_DETAIL.

    Par contre, j'ai trouvé mon problème.
    Ce n'est pas lié au formatage de la requête SQL, les colonnes retournées par mon select ne corresponde pas aux colonnes de ma table qui définie le %ROWTYPE.
    Merci.

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

Discussions similaires

  1. Problème de création de table en mode sql dans phppgadmin
    Par Peewee766 dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 24/09/2015, 13h48
  2. probléme dans l'excécution d'une requete sql
    Par saraenim dans le forum Windows Forms
    Réponses: 1
    Dernier message: 17/10/2008, 14h55
  3. problème avec création dynamique de popup
    Par Melianos dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 31/07/2008, 13h21
  4. Probléme avec une varialbe dans une requete SQL
    Par wylls dans le forum Langage SQL
    Réponses: 25
    Dernier message: 18/12/2006, 15h45
  5. [Rave Report] problème de création dynamique
    Par Nivux dans le forum Rave
    Réponses: 2
    Dernier message: 24/05/2003, 00h07

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