Bonsoir, j'ai crée une procédure stockée qui me permet de récupérer les différentes dates maximum pour chaque mois compris dans une période donnée.
la procédure fonctionne très bien et j'arrive à voir le résultat sous sql développer avec print . Cependant j'arrive pas à l’utiliser dans un select l'objectif étant cela
voici le code pl sql:
et voici le code pl sql permettant de l'appeler dans un select
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 CREATE OR REPLACE PROCEDURE dateMaxMult(nomEtabl IN VARCHAR2,date1 IN date,date2 IN date, dateMax OUT varchar2) IS Nomb Number; Annee Number; Mois Number; dateM date; Begin Nomb := Months_Between(Date2, Date1); Annee := Trunc( Nomb/12); Mois := Trunc(Nomb-Annee*12); IF (Mois>0) THEN FOR compteur IN 0..Mois LOOP IF (compteur=0) THEN SELECT MAX(date_generation) INTO dateM FROM ventes WHERE CODE_ETABL=nomEtabl AND date_generation BETWEEN date1 AND LAST_DAY(date1); dateMax:=''''||dateM||''''; ELSIF(compteur=Mois) THEN SELECT MAX(date_generation) INTO dateM FROM ventes WHERE CODE_ETABL=nomEtabl AND date_generation BETWEEN '01'||'/'||to_char(date2,'MM/YYYY') AND date2; dateMax:=dateMax||','''||dateM||''''; ELSE SELECT MAX(date_generation) INTO dateM FROM ventes WHERE CODE_ETABL=nomEtabl AND date_generation BETWEEN ADD_MONTHS( '01'||'/'||to_char(date1,'MM/YYYY'), compteur ) AND ADD_MONTHS( LAST_DAY(date1), compteur ); dateMax:=dateMax||','''||dateM||''''; END IF; END LOOP; ELSE SELECT MAX(date_generation) INTO dateMax FROM ventes WHERE CODE_ETABL=nomEtabl AND date_generation BETWEEN date1 AND date2; END IF; End;
mais j'ai l'erreur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 DECLARE periode VARCHAR2(100); code VARCHAR2(10) :='132'; date1 date :='01/08/2014'; date2 date :='31/12/2014'; begin select CODE_PRODUIT "CODE PRODUIT",DESIGNATION,to_char(round(sum(QTE_VENDUE)),'999G999G999G999', 'nls_numeric_characters='', ''') "Qte Vendue", to_char(round(sum(VALEUR_VENTE)),'999G999G999G999', 'nls_numeric_characters='', ''') "C.A.H.T", to_char(round(sum(VALEUR)),'999G999G999G999', 'nls_numeric_characters='', ''') "VALEUR REV" , to_char(round(sum(MARGE_HT)),'999G999G999G999', 'nls_numeric_characters='', ''') as MARGE, to_char(round((sum(VALEUR_VENTE)-sum(VALEUR))*100/nullif(sum(VALEUR_VENTE),0),2),'999G999G999G999D99', 'nls_numeric_characters='', ''') "TAUX", to_char(round(sum(QTE_STOCK_FINAL)) ,'999G999G999G999', 'nls_numeric_characters='', ''') "Qte Stock Final" from ventes where CODE_ETABL =(select CODE_ETABL from ETABLISSEMENT where DESCRIPTION='VGE') and DATE_GENERATION in (select * from dateMaxMult(code,date1,date2,periode)) group by CODE_PRODUIT,DESIGNATION order by CODE_PRODUIT asc; end;
Rapport d'erreur :
ORA-06550: Ligne 13, colonne 162 :
PL/SQL: ORA-00907: parenthèse de droite absente
ORA-06550: Ligne 7, colonne 1 :
PL/SQL: SQL Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
j'ai alors essayé d'appeler la procedure dans un simple select:
mais j'ai toujours la même erreur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 select CODE_PRODUIT "CODE PRODUIT",DESIGNATION,to_char(round(sum(QTE_VENDUE)),'999G999G999G999', 'nls_numeric_characters='', ''') "Qte Vendue", to_char(round(sum(VALEUR_VENTE)),'999G999G999G999', 'nls_numeric_characters='', ''') "C.A.H.T", to_char(round(sum(VALEUR)),'999G999G999G999', 'nls_numeric_characters='', ''') "VALEUR REV" , to_char(round(sum(MARGE_HT)),'999G999G999G999', 'nls_numeric_characters='', ''') as MARGE, to_char(round((sum(VALEUR_VENTE)-sum(VALEUR))*100/nullif(sum(VALEUR_VENTE),0),2),'999G999G999G999D99', 'nls_numeric_characters='', ''') "TAUX", to_char(round(sum(QTE_STOCK_FINAL)) ,'999G999G999G999', 'nls_numeric_characters='', ''') "Qte Stock Final" from ventes where CODE_ETABL =(select CODE_ETABL from ETABLISSEMENT where DESCRIPTION='VGE') and DATE_GENERATION in (select * from dateMaxMult('132','01/08/2014','31/12/2014',periode)) group by CODE_PRODUIT,DESIGNATION order by CODE_PRODUIT asc;
j'ai aussi essayé d'enlever les cotes autour des dates avec des retour à la ligne comme dans un select dans le code pls\sql mais c'est toujours le même résultat:
J'ai besoin de votre aide pour pourvoir appeler cette procédure dans mon select
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 CREATE OR REPLACE PROCEDURE dateMaxMult(nomEtabl IN VARCHAR2,date1 IN date,date2 IN date, dateMax OUT varchar2) IS Nomb Number; Annee Number; Mois Number; dateM date; Begin Nomb := Months_Between(Date2, Date1); Annee := Trunc( Nomb/12); Mois := Trunc(Nomb-Annee*12); IF (Mois>0) THEN FOR compteur IN 0..Mois LOOP IF (compteur=0) THEN SELECT MAX(date_generation) INTO dateM FROM ventes WHERE CODE_ETABL=nomEtabl AND date_generation BETWEEN date1 AND LAST_DAY(date1); dateMax:=dateM; ELSIF(compteur=Mois) THEN SELECT MAX(date_generation) INTO dateM FROM ventes WHERE CODE_ETABL=nomEtabl AND date_generation BETWEEN '01'||'/'||to_char(date2,'MM/YYYY') AND date2; dateMadx:=dateMax|| chr(10) ||dateM; ELSE SELECT MAX(date_generation) INTO dateM FROM ventes WHERE CODE_ETABL=nomEtabl AND date_generation BETWEEN ADD_MONTHS( '01'||'/'||to_char(date1,'MM/YYYY'), compteur ) AND ADD_MONTHS( LAST_DAY(date1), compteur ); dadateMax:=dateMax|| chr(10) ||dateM; END IF; END LOOP; ELSE SELECT MAX(date_generation) INTO dateMax FROM ventes WHERE CODE_ETABL=nomEtabl AND date_generation BETWEEN date1 AND date2; END IF; End;
Partager