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:
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;
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
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;
mais j'ai l'erreur:
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:
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;
mais j'ai toujours la même erreur
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:
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;
J'ai besoin de votre aide pour pourvoir appeler cette procédure dans mon select