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 :

debugger un code pl/sql sous report


Sujet :

PL/SQL Oracle

  1. #1
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 469
    Par défaut debugger un code pl/sql sous report
    Bonjour,

    j'ai du code Pl/sql dans un état.
    Quand je lance l'exécution , il me signale une erreur sur le code PL/SQL d'une colonne de formule.

    Je voudrais savoir comment déboguer ce bloc PL/SQL pour repérer précisément l'erreur ?

    Merci de vos aides
    ça me sera utile.

  2. #2
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    Bonjour,

    Tu peux utiliser la procédure SRW.MESSAGE pour afficher des messages dans le log d'exécution de ton report.

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 469
    Par défaut
    Ah d'accord.

    Merci de m'avoir répondu.

    Mais est-ce que en faisant comme ça , je saurais d'où provient l'erreur ?

    Et aussi comment je trouve le log d'exceution ?

  4. #4
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    L'affichage des messages s'arrêtera lorsqu'une erreur sera rencontré. Du coup, le dernier message affiché te permettra de localiser l'instruction qui plante.

    De mémoire, il me semble que le message d'erreur Oracle est déjà dans le log. Sinon, tu mets un bloc EXCEPTION dans lequel tu affiche le message d'erreur (SQLERRM) et tu propages l'exception pour faire planter le report.

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 469
    Par défaut
    Ah d'accord je vois.
    donc la procédure srw.message me suffira bien.

    mais en le plaçant dans le bloc pl/sql ou l'erreur survient

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    loop 
    ----
      srw.message(1,s);
     
    ----
        end loop;
      return(s);
    Je n'ai aucun message affiché quand j'exceute le rapport, juste il m'affiche l'erreur habituelle qu'il m'affichait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Rep-1401 : Une erreur fatale PL/SQL s'est produite.
    ORA-06502 : PL/SQL : erreur numérique ou erreur sur une valeur.
    Où le plaçait alors ?
    Doit-on positionner quelquel chose aprés ?

    Merci et cordialement.

  6. #6
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    Pourrais-tu poster le code de ta colonne de formule ?
    Le message d'erreur correspond :
    - soit à une erreur de conversion de VARCHAR en NUMBER
    - soit à une chaine de caractères trop grande par rapport à la définition de la variable dans laquelle on veut la stocker.

  7. #7
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 469
    Par défaut
    Oui tout à fait .
    je te poste ici le code de la colonne de formule.
    En fait ça fait appel aussi à des fonctions dedans.

    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
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    function VALECARAFormula return Char is
    cursor d is select cc.codecate, cc.codcarub,cc.titimpde,cc.ordimpde,cc.nb_impde,
                       c.typcarub
                from   CATEGORIE_CARACT_RUBRIQUE cc,V_CARACT_RUBRIQUE c
                where  cc.codcarub = c.codcarub
                and    cc.codecate = c.codecate
                and    cc.codecate = :codecate
                and    nvl(ordimpde,0)<>0
                and (   cc.titimpde is not null 
                     or cc.ordimpde is not null
                     or cc.nb_impde is not null) 
                order  by ordimpde;
    x varchar2(2000);
    s varchar2(2000);
    x_desicara varchar2(100);
    rr risque_caract%rowtype;
    x_codecara varchar2(5);
    begin
     
     
      x := null;
      s := null;
      for rd in d loop
      	x_codecara := substr(rd.codcarub,2);
       if substr(rd.codcarub,1,1)='$' then	  --EFI 070305
        begin
          select valecara, valecode,
                 valenume, valedate, valebool, valetext
          into   rr.valecara,rr.valecode,
                 rr.valenume,rr.valedate,rr.valebool,rr.valetext
          from   v_all_risque_caract
          where  codeinte = :codeinte
          and    numepoli = :numepoli
          and    coderisq = :coderisq
          and    codecara = x_codecara
          and   ( ( nvl(:p_numeaven ,0) between nvl(avenmodi,0) and numeaven-1) or
                  ( nvl(:p_numeaven ,0) < nvl(avenmodi,0) and nvl(:p_numeaven ,0) = numeaven) 
                  /* or ( nvl(:p_numeaven ,0) > nvl(avenmodi,0) and nvl(:p_numeaven ,0) = numeaven)*/               
          or nvl(avenmodi, 0) in (select numeaven from avenant
        													where  codeinte = :codeinte 
        													and numepoli=:numepoli
             											and (numavere = :numeaven or numavera = :numeaven)));
          exception
            when no_data_found then 
              rr.valecara := null;rr.valecode := null;
              rr.valenume := null;rr.valedate := null;
              rr.valebool := null;rr.valetext := null;
        end;
        x_desicara := null;
        x_desicara := libelle_caracteristique (x_codecara,
              rr.valenume, rr.valedate, rr.valecode, rr.valebool, rr.valetext);
        select decode(rd.typcarub,'V',lpad(ltrim(nvl(x_desicara,'-')),rd.nb_impde)
                                 ,'E',lpad(ltrim(nvl(x_desicara,'-')),rd.nb_impde)
                                     ,rpad(nvl(x_desicara,'-'),rd.nb_impde))
        into   x
        from   dual;
     
        if s is null then 
        	 s := x;
        else
        	 s := s||'|'||x;
        end if;
      end if;
    --EFI 070305 D
       if substr(rd.codcarub,1,1)='§' then
          rr.valecara := null;
          rr.valecode := null; 
          rr.valedate := null;
          rr.valebool := null;
          rr.valetext := null;
          rr.valenume := null;	
          select  sum(valerubr) valenume
          into  rr.valenume
        	from hist_detail_garantie_accordee r
        	where  r.codeinte = :codeinte
          and    r.numepoli = :numepoli
          and    r.coderisq = :coderisq
          and    r.codecate = rd.codecate
          and    r.codrubta = x_codecara
          and   (nvl(:numeaven,0) between nvl(r.avenmodi,0) and r.numeaven -1 or
                 nvl(:numeaven,0) = nvl(r.avenmodi,0));   	
          x_desicara := null;
          x_desicara := libelle_rubrique_prod (x_codecara,
              rr.valenume, rr.valedate, rr.valecode, rr.valebool, rr.valetext);
          select decode(rd.typcarub,'V',lpad(ltrim(nvl(x_desicara,'-')),rd.nb_impde)
                                 ,'E',lpad(ltrim(nvl(x_desicara,'-')),rd.nb_impde)
                                     ,rpad(nvl(x_desicara,'-'),rd.nb_impde))
          into   x
          from   dual;
          if s is null then 
        	   s := x;
          else
        	   s := s||'|'||x;
          end if;
     
       End if;
     
     
      end loop;
      return(s);
     
     
     
    end;

    Voilà donc.

    je sais pas s'il ya besoin des autres fonctions appelées

    Cordialement.

  8. #8
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    Si le message n'apparait pas en le positionnant juste après le LOOP, je pense que le problème est dans la requête qui doit contenir des conversion implicites de VARCHAR en NUMBER.
    Mets un message juste aprèle le BEGIN pour lui faire afficher la valeur de :codecate. Ca permettra de valider que le message apparait bien et te permettra d'exécuter la requête.

  9. #9
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 469
    Par défaut
    Bonjour.
    en fait j'arrive à afficher la valeur de la variable x_codecara quand l'exception se passe(ora-06502)
    mais j'arrive tjrs pas à l'ocaliser la cause de l'erreur.

    je pense il me faudrait un outil de débuggage pour suivre pas à pas l'exceution du rapport.

    cordialement.

  10. #10
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    Si le message juste avant le "FOR rd IN d loop" apparaît bien, mais pas celui juste après, c'est que l'erreur se produit lors de l'exécution de la requête. Celle-ci doit très probablement faire une conversion de VARCHAR en NUMBER.

    Avez-vous essayé de prendre la requête du curseur et de l'exécuter sous SQL*Plus ?
    Si cela fonctionne, les paramètres NLS sont-ils identiques ?

  11. #11
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 469
    Par défaut
    Bonjour
    Oui en effet la requête du curseur fonctionne bien car il m'affiche la valeur de 'x_codecara' qui est issu de cette curseur (après le FOR).
    D'ailleurs quand l'exception se produit pour une valeur bien précise de x_codecara( je l'affiche quand ora-06502 se produit).

    En quoi les paramètres NLS peuvent ils conduire à cette erreur ?
    En fait je fais pas de conversion de date.

    Et sur Toad quand j'exécute toutes les conversions ,fonctions et requêtes en se basant sur la valeur qui a produit l'erreur, j'obtiens pas d'erreur du tout ( ce qui est bizarre) tandis que REport la détecte .

    cordialement.

  12. #12
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 469
    Par défaut
    J'ai vu l'erreur, il s'agissait d'une déclaration de variable assez petite.

    Merci.

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

Discussions similaires

  1. compiler un code C contenant du SQL sous Fedora
    Par riadh8 dans le forum Linux
    Réponses: 1
    Dernier message: 16/04/2009, 17h03
  2. Code SQL sous VBA
    Par Chris 81 dans le forum VBA Access
    Réponses: 2
    Dernier message: 01/06/2008, 20h27
  3. SQL dynamique sous report
    Par ogaudinu dans le forum Reports
    Réponses: 5
    Dernier message: 02/11/2005, 15h47
  4. Code retour SQL server sous centura
    Par MorbidAngel dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 21/09/2005, 14h07

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