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

  1. #1
    Membre du Club
    Inscrit en
    Juin 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Juin 2003
    Messages : 52
    Points : 45
    Points
    45
    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 éminent

    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
    Points : 7 740
    Points
    7 740
    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;
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 52
    Points : 45
    Points
    45
    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 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
    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.
    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

  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
    Points : 3 199
    Points
    3 199
    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
    Membre du Club
    Inscrit en
    Juin 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Juin 2003
    Messages : 52
    Points : 45
    Points
    45
    Par défaut
    Miloux, oui ce sont bien les mêmes, j'ai bien sur commencé par vérifier cela. Les données que je donne d'ailleurs dans la requete plus haut sont celles obtenues avec un dbms_output.put_line justement

    LeoAnderson, oui je sais pour la date, mais la table a été faite comme ca et je ne peux pas la modifier.
    Sinon je dois compter car je ne vois pas d'autres solutions à mon problème.
    J'ai une table dont les colonnes correspondent à des dates (des jalons), et je dois savoir combien de ces colonnes sont renseignées parmi un panel de jalons prédéfinit. Ce panel correspondant au tableau que j'ai créé.

    En gros il faut que je compte le nombre de colonnes (parmi une liste) dont la données est non vide selon plusieurs critères.

    Peut être y a 'til une autre façon de faire plus simple.

  8. #8
    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
    Points : 3 199
    Points
    3 199
    Par défaut
    pourquoi voulez-vous compter ?
    pour avoir le nombre exact ? pour savoir s'il y en a "au moins un" ? ....

  9. #9
    Membre du Club
    Inscrit en
    Juin 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Juin 2003
    Messages : 52
    Points : 45
    Points
    45
    Par défaut
    Pour avoir le nombre exact.

  10. #10
    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

  11. #11
    Membre du Club
    Inscrit en
    Juin 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Juin 2003
    Messages : 52
    Points : 45
    Points
    45
    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.

  12. #12
    Membre du Club
    Inscrit en
    Juin 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Juin 2003
    Messages : 52
    Points : 45
    Points
    45
    Par défaut
    ok, j'ai bien avancé sur le problème que je rencontre et je sais maintenant où ca coince.

    ca vient ni d'un problème de quote ni de ma requete, juste un delete qui est executé plus tot et qui supprimait les lignes que je testais

    dsl pour le dérangement.

+ 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