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 SELECT COUNT imbriqué dans une Procédure


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juin 2003
    Messages : 52
    Par défaut Problème SELECT COUNT imbriqué dans une Procédure
    Bonjour,

    Je rencontre un problème lorsque j'essaie de faire un COUNT au milieu d'une procédure stockée.

    (je vous passe une partie de la proc stoc qui est assez longue, mais toutes les variables sont correctement déclarées.)

    Voici cette requête :
    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
    ...
    nval              INTEGER;
    ...
    lst_jalons := typ_tab (...);  -- contient 3 elements
    lst_type_jalons := typ_tab (...); -- contient 2 elements
     
    FOR i IN 1 .. 3
    LOOP
       FOR j IN 1 .. 2
       LOOP
          SELECT COUNT(1) INTO nval
          FROM t_aff_planif ap, t_ind_affaires ia
          WHERE lst_jalons(i) IS NOT NULL
          AND ap.aff_type_planif = ''''||lst_type_jalons(j)||''''
          AND ia.ind_id = cur.ind_id
          AND ia.ctre_id = pctre_id
          AND ia.ind_an = ''''||nannee||''''
          AND ia.ind_mois = ''''||nmois||''''
          AND ap.aff_id = ia.aff_id;
     
          njalnum := njalnum + nval;
       END LOOP;
    END LOOP;
    Si j'affiche juste derrière le contenu de mes variables avec 'dbms_output.put_line' le contenu est correct.
    Mais 'nval' reste définitivement égal à 0, alors que manuellement et isolée, la même requete me retourne bien un nombre.

    J'ai également essayé plusieurs écriture pour faire ce 'SELECT' avec notamment la méthode EXECUTE IMMEDIATE.
    Mais même résultat.

    Merci de votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    C'est la journée débuggage...

    Et avec ça, ça te donne quoi ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
          SELECT COUNT(1) INTO nval
          FROM t_aff_planif ap, t_ind_affaires ia
          WHERE lst_jalons(i) IS NOT NULL
          AND ap.aff_type_planif = lst_type_jalons(j)
          AND ia.ind_id = cur.ind_id
          AND ia.ctre_id = pctre_id
          AND ia.ind_an = nannee
          AND ia.ind_mois = nmois
          AND ap.aff_id = ia.aff_id;
    Pourquoi tu mets des '''' || ? C'est pas du SQL dynamique là !

  3. #3
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE lst_jalons(i) IS NOT NULL
    Tu peux mettre un IF et ne pas lancer la requête, ce sera mieux.

    Ensuite si njalnum est NULL au départ au lieu de 0, alors NULL + 1 => NULL et ainsi de suite.

    Ne sachant pas où tu as coupé du code, j'ai mis le IF avant la seconde boucle.
    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
    nval      INTEGER;
    njalnum		NUMBER := 0;
    lst_jalons := typ_tab (...);  -- contient 3 elements
    lst_type_jalons := typ_tab (...); -- contient 2 elements
     
    FOR i IN 1 .. 3
    LOOP
    		IF lst_jalons(i) IS NOT NULL
    		THEN
    		   FOR j IN 1 .. 2
    		   LOOP
    		      SELECT COUNT(1) INTO nval
    		      FROM t_aff_planif ap, t_ind_affaires ia
    		      WHERE ap.aff_type_planif = lst_type_jalons(j)
    		      AND ia.ind_id = cur.ind_id
    		      AND ia.ctre_id = pctre_id
    		      AND ia.ind_an = nannee
    		      AND ia.ind_mois = nmois
    		      AND ap.aff_id = ia.aff_id;
     
    		      njalnum := njalnum + nval;
    		   END LOOP;
    		END IF;
    END LOOP;

  4. #4
    Membre averti
    Inscrit en
    Juin 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juin 2003
    Messages : 52
    Par défaut
    Bonjour à vous,

    Déjà, merci pour vos réponses

    Jerome_Mtl, je mets des '''' et || car ces champs sont des varchars donc il me semble normal d'insérer des quotes. Surtout que les variables que j'appelle ne les inclus pas.
    J'ai tout de même essayé sans au cas où je me trompais, mais résultat identique.

    McM, le cas du IF ne fonctionne pas dans ce cas. En effet mon tableau n'est jamais vide, il contient une liste de nom de colonnes, et c le contenu des données de ces colonnes qui ne doit pas être vide.
    Ainsi dans ma requete, 'WHERE lst_jalons(i) IS NOT NULL' est essentiel car ici ce n'est pas le contenu du tableau lst_jalons que je test mais la donnée de la colonne contenu dans celui-ci.
    Enfin pour l'initialisation de njalnum, je l'ai effectivement omis dans le code que je vous ai fourni, mais je l'ai bien initialisé à 0 dans mon code, ainsi que nval.

    POur plus de clarté, je vous montre la requete déroulée 'à la main' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT COUNT (1)
    FROM t_aff_planif ap, t_ind_affaires ia
    WHERE AFF_DT_MEG IS NOT NULL
    AND ap.aff_type_planif = 'R'
    AND ia.ind_id = 203
    AND ia.ctre_id = 34
    AND ia.ind_an = '2007'
    AND ia.ind_mois = '5'
    AND ap.aff_id = ia.aff_id;
    Merci de votre aide, je continue à chercher la raison du nval qui reste à 0.

    A la fin de ma Proc, je remonte les Exceptions, voici celle qui m'est remonté dans mon cas : ORA-01007: la variable n'est pas dans la liste SELECT.

    Descriptions de l'erreur : this can occur if the number passed for the position parameter is less than one or greater than the number of variables in the SELECT clause.

    Je comprends encore moins ce résultat étant donné que j'ai un seul champ (count) pour une variable.

  5. #5
    Membre chevronné 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
    Par défaut
    déjà peux tu faire une sortie ( un dbms_output.put_line) de tes paramètres dans la boucle, avant le select ?

    Histoire de vérifier que les valeurs que tu mets manuellement sont bien les mêmes.

  6. #6
    Membre Expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Par défaut
    1. Le schéma n'est pas clean (colonnes mois et années en varchar au lieu d'une seule colonne de type date)
    2. pourquoi voulez-vous compter ?

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Fleep Voir le message
    Jerome_Mtl, je mets des '''' et || car ces champs sont des varchars donc il me semble normal d'insérer des quotes. Surtout que les variables que j'appelle ne les inclus pas.
    J'ai tout de même essayé sans au cas où je me trompais, mais résultat identique.
    Si tu compares deux variables de même type, l'utilisations des quotes change complètement la requête...
    Et je le prouve :

    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
    SQL*Plus: Release 9.2.0.8.0 - Production on Mon Aug 4 09:02:56 2008
    Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
    Connected to:
    Oracle9i Enterprise Edition Release 9.2.0.8.0 - Production
    With the Partitioning, OLAP and Oracle Data Mining options
    JServer Release 9.2.0.8.0 - Production
    
    08:57:35> create table test2 (col1 varchar2(10)) ;
    
    Table created.
    
    08:57:49> desc test2
     Name                                                                    Null?    Type
     ----------------------------------------------------------------------- -------- -------------------------------------------------
     COL1                                                                             VARCHAR2(10)
    
    08:58:04>  insert into test2 values ('a');
    
    1 row created.
    
    08:58:12> commit;
    
    Commit complete.
    
    08:58:15> select * from test2 ;
    
    COL1
    ----------
    a
    
    1 row selected.
    
    09:01:47> declare
    09:01:47   2  toto varchar2(10);
    09:01:47   3  nombre number;
    09:01:47   4  begin
    09:01:47   5  dbms_output.enable;
    09:01:47   6  toto := 'a';
    09:01:47   7  select count(*) into nombre from test2 where  col1 = ''''|| toto || '''';
    09:01:47   8  dbms_output.put_line ('avec quote = ' || nombre );
    09:01:47   9  
    09:01:47  10  select count(*) into nombre from test2 where  col1 =  toto ;
    09:01:47  11  dbms_output.put_line ('sans quote = ' || nombre );
    09:01:47  12  end;
    09:01:48  13  /
    
    avec quote = 0
    sans quote = 1
    
    09:01:49> exit

  8. #8
    Membre averti
    Inscrit en
    Juin 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juin 2003
    Messages : 52
    Par défaut
    Effectivement c'est un test intéressant.

    Ici, j'ai 3 variables de type varchar2: nannee, nmois et lst_type_jalons(j) (qui est un tableau de varchar2 en faite).

    Donc si je comprends bien comme je compare un varchar2 à un autre varchar2 et que ces valeurs sont déjà "quotés" inutile d'en rajouter.

    Néanmoins, j'ai également testé sans les quotes car sur ce point je n'étais pas sur de moi. Mais j'obtiens le même résultat c'est à dire nval=0.

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

Discussions similaires

  1. boucle imbriquée dans une procédure st?
    Par Pymento dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 28/01/2013, 13h41
  2. Réponses: 1
    Dernier message: 20/07/2006, 17h03
  3. Problème d'alter table dans une procédure stockée
    Par Oluha dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 16/03/2005, 09h19
  4. Problème avec un LIKE dans une procédure stockée
    Par Oluha dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/12/2004, 14h38
  5. Problème select MAX(annee) dans une requête
    Par grisounette dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 28/10/2004, 17h36

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