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

DB2 Discussion :

select dans SQL dynamique avec table variable


Sujet :

DB2

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut select dans SQL dynamique avec table variable
    bonjour ,

    j'essaie sous db2 v8 de faire un sql dynamique dans lequel ma requete inclut le nom d'une table variable (le but étant de ne pas faire autant de programmes que de tables).

    Si j'avais à l'ecrire en ".clp" , ce serait aussi simple que db2 "select attribut from myschema.mytable" , sauf que c'est à éxécuter sur un client qui ne possède pas la commande "db2"

    J'ai essayé sans succès avec un langage préprocéssé .sqf ou .sqc : en statique , çà ne marche et en dynamique (avec prepare/execute) , on n'a visiblement pas la possibilité de faire de select (juste de l'insert ou update)

    Il me reste les procédures stockées ou fonctions ou autres , mais je ne suis pas très familier

    Avez vous une solution ?

    merci d'avance

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    J'ai donné ici un exemple de procéduer stockée.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci pour la réponse ,

    peux tu juste préciser comment dans la procédure stockée je vais remonter l'ensemble des lignes répondant aux critères select , en fait ce qui est parcouru par le curseur ?

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    Je donne trois exemples que je n'ai pas testés. Le premier avec renvoi d'un Result Set, le second et le troisième avec renvoi d'un table globale temporaire. Le troisième est tiré je crois d'un red book d'IBM :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE PROCEDURE MAPROC1(IN MaTable varchar(15))
    RESULT SETS 1
    LANGUAGE SQL
    BEGIN
    DECLARE stmt varchar(128);
    DECLARE CSR CURSOR WITH RETURN FOR sqlstm;
    SET stmt = 'SELECT ... FROM '  CONCAT  MaTable ; 
    PREPARE sqlstm FROM stmt;                             
    OPEN CSR; 
    END;
    Le client doit alors se charger de récupérer le result set (CSR).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE FUNCTION MAFONC ( MaTable varchar(15) )
    RETURNS TABLE (
      COL1 CHAR(10) ,
      COL2CHAR(20) ,
      COL3 CHAR(30) ,
      COLn DATE,
       ... )
    LANGUAGE SQL
      RETURN
        SELECT COL1, COL2, COL3, COLn, ...
        FROM MaTable WHERE ... ;
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    CREATE FUNCTION RANK(N INTEGER)
    RETURNS TABLE(
      POSITION INTEGER,
      EMPNO CHAR(6),
      FIRSTNME CHAR(20),
      LASTNAME CHAR(20),
      SALARY DECIMAL(13,2)
    )
      LANGUAGE SQL
      DISALLOW PARALLEL
      MODIFIES SQL DATA
      NOT FENCED
    BEGIN
      DECLARE LAST_SALARY DEC(13,2) DEFAULT 0;
      DECLARE I INTEGER DEFAULT 1;
      DECLARE STMT VARCHAR(255);
      DECLARE TABLE_ALREADY_EXISTS CONDITION FOR '42710';
      DECLARE CONTINUE HANDLER FOR TABLE_ALREADY_EXISTS
        DELETE FROM SESSION.RETURN_TBL;
     
      DECLARE GLOBAL TEMPORARY TABLE SESSION.RETURN_TBL (
        POSITION INTEGER NOT NULL,
        EMPNO CHAR(6) NOT NULL,
        FIRSTNME CHAR(20) NOT NULL,
        LASTNAME CHAR(20) NOT NULL,
        SALARY DECIMAL(13,2) NOT NULL);
     
      FOR_LOOP: FOR EACH_ROW AS C1 CURSOR FOR
        SELECT EMPNO, FIRSTNME, LASTNAME, SALARY
        FROM SAMPLEDB01.EMPLOYEE ORDER BY SALARY DESC DO
     
        IF (I > N) AND (EACH_ROW.SALARY < LAST_SALARY) THEN
          LEAVE FOR_LOOP;
        ELSE
          SET LAST_SALARY = EACH_ROW.SALARY;
        END IF;
     
        INSERT INTO SESSION.RETURN_TBL
        VALUES ( I, EACH_ROW.EMPNO, EACH_ROW.FIRSTNME,
                 EACH_ROW.LASTNAME, EACH_ROW.SALARY);
        SET I = I + 1;
      END FOR;
      RETURN SELECT POSITION, EMPNO, FIRSTNME, LASTNAME, SALARY
      FROM SESSION.RETURN_TBL;
    END;

  5. #5
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 56
    Points : 65
    Points
    65
    Par défaut
    Bonjour,

    J'ai essayé sans succès avec un langage préprocéssé .sqf ou .sqc : en statique , çà ne marche et en dynamique (avec prepare/execute) , on n'a visiblement pas la possibilité de faire de select (juste de l'insert ou update)
    On peut faire du SELECT dynamique en Embeded SQL (heureusement) :
    - en liste fixe (on connait le nombre et le type des colonnes retournées) : simple
    - en liste variable (on ne connait ni le nombre, ni le type des colonnes retournées) : plus complexe, oblige à jouer avec les pointeur et la SQLDA..

    Tu as eu quoi comme problème ?

Discussions similaires

  1. Réponses: 8
    Dernier message: 27/03/2015, 16h38
  2. [AC-2007] SQL paramétrée avec une variable déclarée dans la procédure
    Par gentoo dans le forum VBA Access
    Réponses: 3
    Dernier message: 10/06/2014, 17h52
  3. 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
  4. [MySQL] Selection dans liste dérouante avec sql
    Par worldhugo dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 28/03/2009, 16h03
  5. Réponses: 5
    Dernier message: 09/07/2008, 17h04

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