Précédent   Forum du club des développeurs et IT Pro > Bases de données > Oracle > Débuter
Débuter Forum d'entraide pour débuter avec Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 20/10/2012, 14h47   #1
zak75fr
Invité de passage
 
Inscription : septembre 2012
Messages : 1
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : septembre 2012
Messages : 1
Points : 0
Points : 0
Par défaut Problème avec PL/SQL

Bonjour à toutes et à tous !

Voilà j'ai le problème suivant, j'obtiens les messages d'erreur suivant :
Citation:
DECLARE
*
ERROR at line 1:
ORA-00979: not a GROUP BY expression
ORA-06512: at line 9
ORA-06512: at line 121
Lorsque je lance le script ksh suivant :

Code ksh :
1
2
3
4
5
6
7
8
9
10
#script SQL
FOR VARSQL IN 3 5 30 900
do
export VARSQL
echo $VARSQL
 
oms_ordres_batch_read.sql $DATEAMJ $VARSQL
 
 
done

pour les valeur 3 5 30 => erreur et pas pour 900

voici le script SQL :
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
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
SET serveroutput ON size 100000
SET verify off
SET LINES 300
SET feedback off
SET term off
clear screen
 
spool /home/oms4v0/DATA/oms_compteurs_result_tempo_&1._&2..dat
 
DECLARE
 
 TYPE type_tab_rif IS TABLE OF char(5) INDEX BY BINARY_INTEGER ;
 tab_rif type_tab_rif ;
 
 ------------------------------------------
 
 CURSOR c_compteurs ( lk_date VARCHAR2 , lk_rifcpte VARCHAR2 ) IS
 SELECT  -- on calcule le signe de la soustraction de 15 min à la difference entre l'heure de saisie et l'heure d'acquit
        count(*)  NBINS,
        SIGN( ((A.DCRE - I.DSAIINS) * 86400) - &2 ) SIGN15
 FROM
         OMSINSTRUCTION.INSDATA I ,
         OMSINSTRUCTION.INSHISSTATINS A
 WHERE
        I.CRSECOMNCNG LIKE 'LIFO%'
 AND
        I.DJBRSCHAR = lk_date
 AND
        I.RIFCPTE = lk_rifcpte
 AND
         I.RINS = A.RINS
 AND
        to_char(A.DCRE,'YYYYMMDDHH24MI') > lk_date||'0915'
 AND
        to_char(A.DCRE,'YYYYMMDDHH24MI') < lk_date||'1745'
 AND
         A.CCYVIE='DIFFU' AND A.CSTINS = 'ACQ_M'
 GROUP BY
        SIGN( ((A.DCRE - I.DSAIINS) * 86400) - 900 )
 union
 SELECT  -- on ajoute les ordres acquittés avant 9h15
        count(*)  NBINS,
        -1 SIGN15
 FROM
         OMSINSTRUCTION.INSDATA I ,
         OMSINSTRUCTION.INSHISSTATINS A
 WHERE
        I.CRSECOMNCNG LIKE 'LIFO%'
 AND
        I.DJBRSCHAR = lk_date
 AND
        I.RIFCPTE = lk_rifcpte
 AND
         I.RINS = A.RINS
 AND
        to_char(A.DCRE,'YYYYMMDDHH24MI') <= lk_date||'0915'
 AND
         A.CCYVIE='DIFFU' AND A.CSTINS = 'ACQ_M'
 GROUP BY
        -1 ;
 ------------------------------------------
 
 CURSOR c_compteurs_allif ( lk_date VARCHAR2) IS
 SELECT  -- on calcule le signe de la soustraction de 3 5 30 900 secondes  à la difference entre l'heure de saisie et l'heure d'acquit
 
        count(*)  NBINS,
        SIGN( ((A.DCRE - I.DSAIINS) * 86400) - &2 ) SIGN15
 FROM
         OMSINSTRUCTION.INSDATA I ,
         OMSINSTRUCTION.INSHISSTATINS A
 WHERE
        I.CRSECOMNCNG LIKE 'LIFO%'
 AND
        I.DJBRSCHAR = lk_date
 AND
         I.RINS = A.RINS
 AND
        to_char(A.DCRE,'YYYYMMDDHH24MI') > lk_date||'0915'
 AND
        to_char(A.DCRE,'YYYYMMDDHH24MI') < lk_date||'1745'
 AND
         A.CCYVIE='DIFFU' AND A.CSTINS = 'ACQ_M'
 GROUP BY
        SIGN( ((A.DCRE - I.DSAIINS) * 86400) - &2 )
 union
 SELECT  -- on ajoute les ordres acquittés avant 9h15
        count(*)  NBINS,
        -1 SIGN15
 FROM
         OMSINSTRUCTION.INSDATA I ,
         OMSINSTRUCTION.INSHISSTATINS A
 WHERE
        I.CRSECOMNCNG LIKE 'LIFO%'
 AND
        I.DJBRSCHAR = lk_date
 AND
         I.RINS = A.RINS
 AND
        to_char(A.DCRE,'YYYYMMDDHH24MI') <= lk_date||'0915'
 AND
         A.CCYVIE='DIFFU' AND A.CSTINS = 'ACQ_M'
 GROUP BY
        -1 ;
 ------------------------------------------
 
 
 compteur_total number ;
 compteur_inf number ;
 compteur_sup number ;
 
 fetch_count number ;
 fetch_signe number ;
 
BEGIN
 
 tab_rif(1) := '00005';
 tab_rif(2) := '00001';
 tab_rif(3) := '00029';
 tab_rif(4) := '00009';
 tab_rif(5) := '00031';
 tab_rif(6) := '00030';
 tab_rif(7) := '00010';
 tab_rif(8) := '00032';
 
 FOR compteur IN tab_rif.first .. tab_rif.last
 LOOP
        compteur_total := 0 ;
        compteur_inf := 0 ;
        compteur_sup := 0 ;
 
        OPEN c_compteurs ( &1 , tab_rif(compteur) ) ;
 
        FETCH c_compteurs INTO fetch_count , fetch_signe ;
 
        WHILE c_compteurs%FOUND
        LOOP
                IF ( fetch_signe > 0 ) THEN
                        compteur_sup := compteur_sup + fetch_count ;
                        compteur_total := compteur_total + fetch_count ;
                ELSE
                        compteur_inf := compteur_inf + fetch_count ;
                        compteur_total := compteur_total + fetch_count ;
                END IF ;
 
         FETCH c_compteurs INTO fetch_count , fetch_signe ;
 
        END LOOP;
        CLOSE c_compteurs ;
 
        -- tous les compteurs sont dans le fichier spool, precedé du RIF, il ne restera qu'a trier
        DBMS_OUTPUT.PUT_LINE( tab_rif(compteur)||' le nombre d''acquittements total est '||compteur_total );           
        DBMS_OUTPUT.PUT_LINE( tab_rif(compteur)||' le nombre d''acquittements > a &2. Secondes ---> '||compteur_sup ); 
        DBMS_OUTPUT.PUT_LINE( tab_rif(compteur)||' le nombre d''acquittements < a &2. Secondes ---> '||compteur_inf ); 
 
 END LOOP;
 
 
 
 compteur_total := 0 ;
 compteur_inf := 0 ;
 compteur_sup := 0 ;
 
 OPEN c_compteurs_allif ( &1 ) ;
 
 FETCH c_compteurs_allif INTO fetch_count , fetch_signe ;
 
 WHILE c_compteurs_allif%FOUND
 LOOP
         IF ( fetch_signe > 0 ) THEN
                compteur_sup := compteur_sup + fetch_count ;
                compteur_total := compteur_total + fetch_count ;
         ELSE
                compteur_inf := compteur_inf + fetch_count ;
                compteur_total := compteur_total + fetch_count ;
         END IF ;
 
        FETCH c_compteurs_allif INTO fetch_count , fetch_signe ;
 
 END LOOP;
 CLOSE c_compteurs_allif ;
 
 DBMS_OUTPUT.PUT_LINE( 'ALLIF le nombre d''acquittements total est '||compteur_total );
 DBMS_OUTPUT.PUT_LINE( 'ALLIF le nombre d''acquittements > a &2. Secondes ---> '||compteur_sup );
 DBMS_OUTPUT.PUT_LINE( 'ALLIF le nombre d''acquittements < a &2. Secondes ---> '||compteur_inf );
 
END;
/
 
spool off
quit
Pourriez-vous m'éclairer de vos lumieres car je ne vois pas ou est le pb, de plus je débute sur PL/SQL

Je vous remercie par avance

Cordialement Zak75fr
zak75fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2012, 09h23   #2
Andrei_L
Membre régulier
 
Homme Andrei Litvinov
Administrateur de base de données
Inscription : avril 2012
Messages : 22
Détails du profil
Informations personnelles :
Nom : Homme Andrei Litvinov
Localisation : Russie

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2012
Messages : 22
Points : 70
Points : 70
Bonjour,

1. Pour déboguer un script PL/SQL, vous pourriez ajouter des messages DBMS_OUTPUT entre des opérateurs. Par exemple:
Code :
1
2
 
dbms_output('compteur=' || compteur);
Exécutez le script dans sqlplus après. Quand il vous interroge 'Entrez une valeur pour 2', entrez votre VARSQL valeur (il remplacera '&2') .

2. La erreur 'ORA-00979: not a GROUP BY expression' est une erreur syntaxique de SQL, non de PL/SQL. Tous le code SQL de votre
script est dans des curseurs. Vous pourriez copier le corps d'un curseur (après 'IS' jusqu'au point-virgule), remplacer les variables locales
par des valeurs de test et l'exécuter dans sqlplus.

3. Les curseurs utilisent de 'UNION'. Vous pourriez diviser chaque curseur en pièces par ce mot-clé et les exécuter un après autre.
Andrei_L est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2012, 09h34   #3
skuatamad
Expert Confirmé
 
Inscription : août 2008
Messages : 1 690
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 690
Points : 2 812
Points : 2 812
ORA-00979: not a GROUP BY expression, c'est pas une erreur très compliquée à résoudre.
Citation:
pour les valeur 3 5 30 => erreur et pas pour 900
Code :
1
2
3
4
5
6
7
CURSOR c_compteurs ( lk_date VARCHAR2 , lk_rifcpte VARCHAR2 ) IS
 SELECT  -- on calcule le signe de la soustraction de 15 min à la difference entre l'heure de saisie et l'heure d'acquit
        count(*)  NBINS,
        SIGN( ((A.DCRE - I.DSAIINS) * 86400) - &2 ) SIGN15
.........
GROUP BY
        SIGN( ((A.DCRE - I.DSAIINS) * 86400) - 900 )
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 14h33.


 
 
 
 
Partenaires

Hébergement Web