Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
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 05/03/2007, 14h11   #1
Candidat au titre de Membre du Club
 
Inscription : janvier 2007
Messages : 23
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : janvier 2007
Messages : 23
Points : 10
Points : 10
Par défaut Problème de paramètre dans une procédure stockée

tout le monde,
Je bosse sous interbase 7.0 et je bloque sur une procédure stockée :
je lui passe en paramètre un VARCHAR(200) qui correspond à un bout de requête (Exemple : "NOREP BETWEEN 50 AND 99");
Je souhaiterai intégrer ce bout de code dans plusieurs requêtes :

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
CREATE PROCEDURE RecupDonnees(FINREQ VARCHAR(200), DATED DATE, DATEF DATE)
RETURNS(CAG,MARGENG,PDSG,NBFACG,MOYARTG,NBCLIG,
CAF1,CAF2,CAF3,CAF5,CAF6,CAF8,CAF9,
MARGEF1,MARGEF2,MARGEF3,MARGEF5,MARGEF6,MARGEF8,MARGEF9,
NBCLILCR,CALCR,CATELEVT,CANOUV,PDSNOUV,NBCLINOUV,
CAMAIL,PDSMAIL,NBCLIMAIL,CAPS,PDSPS,NBCLIPS)
AS
DECLARE VARIABLE CAF NUMERIC(15,4);
DECLARE VARIABLE MARGEF NUMERIC(15,4);
DECLARE VARIABLE FAM INTEGER;
BEGIN
 
FOR
SELECT FAMILLE,Sum(CA),Sum(MARGE_N)
FROM CONDENS_LIGNES
WHERE DATELIV BETWEEN :DATED AND :DATEF
AND STAT_LI=1 AND STAT_CO=1
AND :FINREQ
GROUP BY FAMILLE
INTO :FAM, :CAF, :MARGEF
DO
BEGIN
IF(:FAM=1)
THEN
	BEGIN
		CAF1=:CAF;
		MARGEF1=:MARGEF;
	END
IF(:FAM=2)
THEN
	BEGIN
		CAF2=:CAF;
		MARGEF2=:MARGEF;
	END
IF(:FAM=3)
THEN
	BEGIN
		CAF3=:CAF;
		MARGEF3=:MARGEF;
	END
IF(:FAM=5)
THEN
	BEGIN
		CAF5=:CAF;
		MARGEF5=:MARGEF;
	END
IF(:FAM=6)
THEN
	BEGIN
		CAF6=:CAF;
		MARGEF6=:MARGEF;
	END
IF(:FAM=8)
THEN
	BEGIN
		CAF8=:CAF;
		MARGEF8=:MARGEF;
	END
IF(:FAM=9)
THEN
	BEGIN
		CAF9=:CAF;
		MARGEF9=:MARGEF;
	END
END
 
 
SELECT Sum(CA),Sum(MARGE_N),Sum(PDS),Count(DISTINCT NOFAC)
FROM CONDENS_COM
WHERE DATELIV BETWEEN :DATED AND :DATEF
AND STAT=1
AND :FINREQ
INTO :CAG,:MARGENG,:PDSG,:NBFACG;
 
SELECT Count(DISTINCT NOCLI)
FROM CONDENS_COM
WHERE DATELIV BETWEEN :DATED AND :DATEF
AND STAT=1
AND NOCLI NOT BETWEEN 300000 AND 399999
AND :FINREQ
INTO NBCLIG;
 
CREATE VIEW ART (NBART,NOCLI)
AS
SELECT Count(DISTINCT NOARTI),NOCLI
FROM CONDENS_LIGNES
WHERE DATELIV BETWEEN :DATED AND :DATEF
AND STAT_LI=1 AND STAT_CO=1
AND :FINREQ
GROUP BY NOCLI;
 
SELECT AVG(NBART)
FROM ART
INTO :MOYARTG;
 
DROP VIEW ART;
 
SELECT SUM(CA),COUNT(DISTINCT NOCLI)
FROM CONDENS_COM
WHERE DATELIV BETWEEN :DATED AND :DATEF
AND STAT=1
AND TYPE_PAIEMENT LIKE 'TD%'
AND :FINREQ
INTO :CALCR, :NBCLILCR;
 
SELECT SUM(CA)
FROM CONDENS_COM
WHERE DATELIV BETWEEN :DATED AND :DATEF
AND STAT=1
AND (NOOPE IN (10,11,14,32,29,50,62,63,64,90,91,92)
AND :FINREQ
INTO :CATELEVT;
 
END
Evidemment, le :FINREQ dans mes requêtes me renvoie une erreur:
Code :
1
2
3
4
5
 Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 22, char 11.
GROUP.
J'ai essayé en déclarant une variable requete VARCHAR, puis concaténer tout ça dans requete et faire un for requete into :noms_variable, mais ça ne fonctionne pas.
Je sais que les curseurs sous interbase ne sont pas recommandés.
Alors, quelqu'un aurait il une solution? Et surtout, est-il possible de passer des bouts de requête en paramètre et de reconstituer la requête dans la procédure stockée?
Un grand merci à tous ceux qui pourront m'aider
ch0upette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2007, 11h57   #2
Candidat au titre de Membre du Club
 
Inscription : janvier 2007
Messages : 23
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : janvier 2007
Messages : 23
Points : 10
Points : 10
Après de nombreuses recherches, j'ai compris que je ne pouvais pas faire de SQL dynamique avec interbase.
Chose qui est possible avec Firebird.
Malheureusement, je n'ai pas la possibilité de migrer sous firbird, donc voivi la solution pour laquel j'ai opté :
créer dynamiquement ma procédure stockée.
Je travaille avec java, et je lance un execute("CREATE PROCEDURE .....
SELECT * FROM TABLES WHERE " + mon_bout_de_code + " .......");
Puis une fois ceci exécuter, je fais un select * from ma_procedure et je la supprime ensuite.
Ce n'est pas long et plus simple que de créer des procédures pour chaque cas.
Voilà, en espérant que ça puisse aider d'autres personnes !
ch0upette 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 14h49.


 
 
 
 
Partenaires

Hébergement Web