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

SQL Firebird Discussion :

procédure stockée : argument de type liste / tableau


Sujet :

SQL Firebird

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 61
    Points : 35
    Points
    35
    Par défaut procédure stockée : argument de type liste / tableau
    Bonjour,

    voici ma procédure stockée :
    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
     
    CREATE PROCEDURE PS_DATA (
        A1_INPUT INTEGER)
    RETURNS (
        D1 INTEGER,
        D2 VARCHAR(100),
        A1 INTEGER)
    BEGIN
      FOR
        SELECT D1, D2, A1 FROM DATA
        WHERE A1 =:A1_INPUT
        INTO :D1, :D2, :A1_INPUT
      DO
      BEGIN
        SUSPEND;
      END
    END
    Elle fonctionne.

    Maintenant comment faire pour que :AI_input ne soit plus une valeur unique, mais une liste de valeur.
    Je pensais changer mon en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE A1 IN (:AI_input)
    mais il faut que AI_input soit une liste d'élement de type integer, ou un tableau.

    Une idée, un conseil ? merci d'avance

    Benoît[/quote]

  2. #2
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Il n'y a hélas pas de solution simple :

    Soit vous etes sous FB1.5 dans ce cas vous pouvez exécuter une requete dynamique (moins performant qu'une requete préparée).

    Soit vous savez que vous n'aurez jamais plus de n possibilitées
    dans ce cas vous pouvez définir n paramètres d'entrée de type integer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    AI_INPUT1 integer,
    AI_INPUT2 integer,
    AI_INPUT3 integer,
    AI_INPUT4 integer
    ...
    puis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE A1 IN (:AI_input1, :AI_input2, :AI_input3, :AI_input4)
    Soit vous vous débrouillez pour passer cette liste d'integer par un autre moyen (un select avec des paramètres).

    Si cette liste n'est pas retrouvable via un select alors vous pouvez créer une table spéciale qui vous servira pour enregistrer ces listes. Vous utilisez un générateur pour optenir un identifiant et utilisez cet identifiant pour tous les A1 de cette liste (c'est pour éviter de mélanger les listes entre différents utilisateurs)

    Avant d'appeler la PS vous inserez donc vos A1 en utilisant le même ID.

    Puis en entrée vous avez ID_PARAMETRE qui vous permet de retrouver la liste des A1 que vous avez préalablement inséré dans la table spéciale.

    ensuite il ne vous reste plus qu'a faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Where A1 IN (Select A1 from TABLE_PARAMETRE_SPECIALE where ID=:ID_PARAMETRE)
    Puis à supprimer la liste des A1 de la table spéciale si elle n'est plus utile.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 61
    Points : 35
    Points
    35
    Par défaut
    Soit vous etes sous FB1.5 dans ce cas vous pouvez exécuter une requete dynamique (moins performant qu'une requete préparée).

    .
    je suis bien sous FB1.5. Qu'entendez vous par requete dynamique ?

    [/quote]

  4. #4
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    C'est une des nouveautés de FB1.5. Mais c'est la solution la plus risquée des 3.

    Celà consiste à construire l'ordre SELECT dans une variable de type chaine et à la faire interpréter par FB (EXECUTE STATEMENT <string>;)


    Celà veux dire que votre PS ne sera pas optimisé, et si vous vous trompez lors de la création de votre chaine vous planterez votre PS.

    Il vous faudra en plus que vous contruisiez une chaine en paramètre d'entrée de type VARCHAR() avant d'appeler votre PS. Cette chaine devra être constituée des valeurs sous forme texte.
    "1, 2, 12, 100" par exemple ce qui n'est pas forcément le plus simple.
    De plus celà veux dire que cette liste est forcément limitée (à la longueur max que vous aurez défini pour le varchar())

    puis dans votre PS

    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
    CREATE PROCEDURE PS_DATA ( 
        A1_INPUT VARCHAR(100)) 
    RETURNS ( 
        D1 INTEGER, 
        D2 VARCHAR(100), 
        A1 INTEGER) 
    AS
    BEGIN 
     
     FOR EXECUTE STATEMENT 'SELECT D1, D2, A1 FROM DATA WHERE A1 IN (' || A1_INPUT || ')'
        INTO :D1, :D2, :A1 
      DO 
      BEGIN 
        SUSPEND; 
      END 
    END

  5. #5
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 61
    Points : 35
    Points
    35
    Par défaut
    Super, merci.

    Je vais tenter cette option. Ma chaîne A1_INPUT étant créée par un script php, elle sera 'blindée' avant l'appel de la PS.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 61
    Points : 35
    Points
    35
    Par défaut
    Il semble que cette fonction soit spécifique à FB1.5. Où puis je trouver la documentation de ce SGBD ?
    Pour le moment je ne possède que la doc de Interbase 6...

    Merci

    Benoît

  7. #7
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Oui c'est une des nouveautées de FB1.5
    La doc de IB6 restant valable pour FB1.5 elle reste la doc de référence.
    Pour les nouveautées il suffit de regarder dans le répertoire DOC sous FB1.5 .

  8. #8
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 61
    Points : 35
    Points
    35
    Par défaut

    J'aurais du y penser ... Merci

    Benoît

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/07/2013, 01h39
  2. Réponses: 2
    Dernier message: 21/02/2013, 16h41
  3. Lancer une procédure stockée pour toute une liste
    Par riomois85 dans le forum Développement
    Réponses: 2
    Dernier message: 16/05/2012, 17h51
  4. C#/SQL Procédures stockées - Compatibilité des types de champs
    Par Dark.Angel dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 23/02/2011, 17h34
  5. INSERT avec procédure stockée / Clef de type AutoInc
    Par bgdelphi dans le forum Bases de données
    Réponses: 5
    Dernier message: 18/10/2003, 18h30

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