Précédent   Forum des professionnels en informatique > Bases de données > Sybase
Sybase Forum sur la base de données Sybase. Avant de poster -> F.A.Q Sybase, Tutoriels Sybase
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 22/07/2007, 12h11   #1
Membre éprouvé
 
Inscription : juillet 2006
Messages : 533
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 533
Points : 486
Points : 486
Par défaut Transformer une requête sql dynamique

Bonjour,

J'ai une requête SQL Sybase dynamique générée par un programme en Java:

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
 SELECT
     T1.M_INDEX,
     T1.M_ACHAT,
     T1.M_VENTE,
     T2.M_LABEL_X,
     T2.M_LABEL_Y
FROM
     TABLE_X T1, TABLE_Y T2
WHERE
     T1.M_INDEX = T2.M_INDEX
      AND T1.M_INDEX IN
      (
           SELECT T3.M_INDEX
           FROM
                TABLE_Y T3
           WHERE
                T3.M_DATE = ?
                AND T3.M_NOM = ?
                AND T3.M_LABEL_X IN
                ( ?, ?, ?, ? )                                  ---- nombre d'éléments
                                                                  ---- variables chaque
                                                                  ---- appel
                AND T3.M_LABEL_Y IN
                ( ?, ?, ?, ? )                                  ---- la même liste 
                                                                  ---- d'éléments
      )
ORDER BY T1.M_INDEX
Je souhaite transformer en procédure stockée comme ceci:

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
 CREATE PROCEDURE
 
PRC_LIST(  @Nom                     varchar(20),
                @Date                    datetime,
                @ListParametres       varchar(1000)
             )
 
AS
BEGIN
SELECT
     T1.M_INDEX,
     T1.M_ACHAT,
     T1.M_VENTE,
     T2.M_LABEL_X,
     T2.M_LABEL_Y
FROM
     TABLE_X T1, TABLE_Y T2
WHERE
     T1.M_INDEX = T2.M_INDEX
      AND T1.M_INDEX IN
      (
           SELECT T3.M_INDEX
           FROM
                TABLE_Y T3
           WHERE
                T3.M_DATE = @Date
                AND T3.M_NOM = @Nom
                AND T3.M_LABEL_X IN
                ( @ListParametres )
                AND T3.M_LABEL_Y IN
                ( @ListParametres )
      )
ORDER BY T1.M_INDEX
END
Pourriez-vous me dire comment faire pour que je puisse appeler cette procedure comme ceci:

Code :
1
2
 PRC_LIST ( "DEVISES", "2007-07-07", " 'USD', 'EUR', 'GBP', 'JPY' ")
PRC_LIST ( "DEVISES", "2007-07-07", " 'EUR', 'GBP', 'AUD' ")
Merci.





Exemple un appel généré:
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
 SELECT
     T1.M_INDEX,
     T1.M_ACHAT,
     T1.M_VENTE,
     T2.M_LABEL_X,
     T2.M_LABEL_Y
FROM
     TABLE_X T1, TABLE_Y T2
WHERE
     T1.M_INDEX = T2.M_INDEX
      AND T1.M_INDEX IN
      (
           SELECT T3.M_INDEX
           FROM
                TABLE_Y T3
           WHERE
                T3.M_DATE = "2007-07-07"
                AND T3.M_NOM = "DEVISE"
                AND T3.M_LABEL_X IN
                ( "USD", "EUR", "GBP", "CAD" )
                AND T3.M_LABEL_Y IN
                ( "USD", "EUR", "GBP", "CAD" )
      )
ORDER BY T1.M_INDEX
ttttnht est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/07/2007, 13h50   #2
Membre Expert
 
Inscription : juin 2007
Messages : 1 056
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 1 056
Points : 1 078
Points : 1 078
tu y étais presque ; pour faire du sql dyn, il te faut utiliser la commande EXECUTE ('chaine'), chaine correspondant à ta requête dans laquelle tu peux concatener tous les params que tu veux.

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
CREATE PROCEDURE
 
PRC_LIST( @Nom varchar(20),
@Date datetime,
@Nom varchar(xx),
@ListParametres varchar(1000)
)
 
AS
BEGIN
 
execute ('SELECT
T1.M_INDEX,
T1.M_ACHAT,
T1.M_VENTE,
T2.M_LABEL_X,
T2.M_LABEL_Y
FROM
TABLE_X T1, TABLE_Y T2
WHERE
T1.M_INDEX = T2.M_INDEX
AND T1.M_INDEX IN
(
SELECT T3.M_INDEX
FROM
TABLE_Y T3
WHERE
T3.M_DATE = '+convert(varchar(10),@Date,103)+'
AND T3.M_NOM = '+@Nom+'
AND T3.M_LABEL_X IN
( '+@ListParametres+' )
AND T3.M_LABEL_Y IN
( '+@ListParametres+' )
)
ORDER BY T1.M_INDEX
END')
__________________
Emmanuel T.
kagemaru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/07/2007, 11h43   #3
Membre éprouvé
 
Inscription : juillet 2006
Messages : 533
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 533
Points : 486
Points : 486
Par défaut Transformer requete SQL en procedure stockee

Merci de ton aide.

J'ai essaye de creer cette procedure mais j'ai ceci:

Procedure (PRC_LIST) Incorrect syntax near the key word 'convert'.

As-tu une idee?

Merci
ttttnht est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/07/2007, 12h25   #4
Rédacteur/Modérateur
 
Inscription : janvier 2006
Messages : 1 301
Détails du profil
Informations personnelles :
Âge : 52

Informations forums :
Inscription : janvier 2006
Messages : 1 301
Points : 1 505
Points : 1 505
Envoyer un message via AIM à mpeppler
C'est une petite coquille - le convert() fait partie de la requête à soumettre - seule la variable @Date doit être traitée séparément avec la concatenation:

Code :
1
2
3
4
 
WHERE
T3.M_DATE = convert(varchar(10),'+@Date+',103)
AND T3.M_NOM = '+@Nom+'
Michael
__________________
Michael Peppler
Membre de TeamSybase - www.teamsybase.com

"A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson
mpeppler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/07/2007, 15h00   #5
Membre éprouvé
 
Inscription : juillet 2006
Messages : 533
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 533
Points : 486
Points : 486
Par défaut Sql en procedure stockee

Apres modifee la requete avec ceci:

Code :
1
2
3
 WHERE
T3.M_DATE = convert(varchar(10),'+@Date+',103)
AND T3.M_NOM = '+@Nom+'
J'ai toujours une erreur quand j'execute cette procedure (create)
You specified an incorrect datatype for the variable containing the
'execute immediate' command string.

je ne sais pas pourquoi ?
ttttnht est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2007, 07h54   #6
Rédacteur/Modérateur
 
Inscription : janvier 2006
Messages : 1 301
Détails du profil
Informations personnelles :
Âge : 52

Informations forums :
Inscription : janvier 2006
Messages : 1 301
Points : 1 505
Points : 1 505
Envoyer un message via AIM à mpeppler
Note à soi-même: lire les messages complètement avant de répondre...

Le problème est le suivant: la proc reçoit un paramètre DATETIME en entrée, et on essaie de le passer tel quel dans le execute immediate, ce qui ne marche pas (execute immediate demande un varchar).

Donc, pour reprendre le code de kagemaru:

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
 
CREATE PROCEDURE   PRC_LIST( 
   @Nom varchar(20), 
   @Date datetime, 
   @Nom varchar(xx), 
  @ListParametres varchar(1000) )   
AS 
declare @cmd varchar(2000)
 
-- On crée la commande avec un select, ce qui permet de faire
-- la conversion du DATETIME en varchar
SELECT @cmd = 'SELECT T1.M_INDEX, T1.M_ACHAT, T1.M_VENTE, T2.M_LABEL_X, T2.M_LABEL_Y 
FROM TABLE_X T1, TABLE_Y T2 
WHERE T1.M_INDEX = T2.M_INDEX 
AND T1.M_INDEX IN ( SELECT T3.M_INDEX FROM TABLE_Y T3 
     WHERE T3.M_DATE = '+convert(varchar(10),@Date,103)+' 
     AND T3.M_NOM = '+@Nom+' 
     AND T3.M_LABEL_X IN ( '+@ListParametres+' ) 
     AND T3.M_LABEL_Y IN ( '+@ListParametres+' ) )
ORDER BY T1.M_INDEX'
 
-- Et maintenant on l'exécute.
exec (@cmd)
 
go
Voilà - cette version devrait marcher mieux!

Michael
__________________
Michael Peppler
Membre de TeamSybase - www.teamsybase.com

"A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson
mpeppler 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 23h01.


 
 
 
 
Partenaires

Hébergement Web