Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/08/2008, 18h05   #1
Membre à l'essai
 
Inscription : juin 2003
Messages : 52
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : juin 2003
Messages : 52
Points : 22
Points : 22
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 :
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.
Fleep est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2008, 18h16   #2
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 523
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 523
Points : 3 975
Points : 3 975
C'est la journée débuggage...

Et avec ça, ça te donne quoi ?


Code :
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à !
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2008, 21h06   #3
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
Code :
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 :
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
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2008, 11h14   #4
Membre à l'essai
 
Inscription : juin 2003
Messages : 52
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : juin 2003
Messages : 52
Points : 22
Points : 22
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 :
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.
Fleep est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2008, 13h22   #5
Membre éprouvé
 
Avatar de miloux32
 
Inscription : juillet 2003
Messages : 538
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 538
Points : 473
Points : 473
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
miloux32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2008, 13h30   #6
Expert Confirmé
 
Avatar de LeoAnderson
 
Inscription : septembre 2004
Messages : 2 942
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 2 942
Points : 2 972
Points : 2 972
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 ?
LeoAnderson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2008, 13h42   #7
Membre à l'essai
 
Inscription : juin 2003
Messages : 52
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : juin 2003
Messages : 52
Points : 22
Points : 22
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.
Fleep est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2008, 13h50   #8
Expert Confirmé
 
Avatar de LeoAnderson
 
Inscription : septembre 2004
Messages : 2 942
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 2 942
Points : 2 972
Points : 2 972
pourquoi voulez-vous compter ?
pour avoir le nombre exact ? pour savoir s'il y en a "au moins un" ? ....
LeoAnderson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2008, 13h53   #9
Membre à l'essai
 
Inscription : juin 2003
Messages : 52
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : juin 2003
Messages : 52
Points : 22
Points : 22
Pour avoir le nombre exact.
Fleep est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2008, 15h06   #10
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 523
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 523
Points : 3 975
Points : 3 975
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 :
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
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2008, 15h41   #11
Membre à l'essai
 
Inscription : juin 2003
Messages : 52
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : juin 2003
Messages : 52
Points : 22
Points : 22
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.
Fleep est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2008, 18h04   #12
Membre à l'essai
 
Inscription : juin 2003
Messages : 52
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : juin 2003
Messages : 52
Points : 22
Points : 22
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.
Fleep est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h38.


 
 
 
 
Partenaires

Hébergement Web