IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Sybase Discussion :

Transformer une requête sql dynamique


Sujet :

Sybase

  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 534
    Points : 562
    Points
    562
    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 : 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
     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 : 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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
     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

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Points : 1 216
    Points
    1 216
    Par défaut
    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 : 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
    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.

  3. #3
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 534
    Points : 562
    Points
    562
    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

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  5. #5
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 534
    Points : 562
    Points
    562
    Par défaut Sql en procedure stockee
    Apres modifee la requete avec ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    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 : 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
     
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 10/12/2015, 14h51
  2. Requête SQL dynamique avec nom de table dans une variable
    Par jonjack dans le forum SQL Procédural
    Réponses: 9
    Dernier message: 15/09/2011, 14h37
  3. Récupérer une transformation en requête SQL
    Par knolz dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 27/05/2010, 15h28
  4. [Transformer] Cube à partir d'une requête SQL
    Par Nadine dans le forum Cognos
    Réponses: 2
    Dernier message: 29/10/2008, 09h19
  5. Réponses: 1
    Dernier message: 04/06/2007, 10h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo