Précédent   Forum des professionnels en informatique > Bases de données > DB2
DB2 Forum d'entraide technique sur la base de données DB2. Voir aussi -> Rubrique DB2
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 24/07/2007, 22h00   #1
Invité de passage
 
Inscription : juillet 2007
Messages : 2
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 2
Points : 0
Points : 0
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
enzodb2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2007, 00h42   #2
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
J'ai donné ici un exemple de procéduer stockée.
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2007, 07h19   #3
Invité de passage
 
Inscription : juillet 2007
Messages : 2
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 2
Points : 0
Points : 0
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 ?
enzodb2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2007, 16h07   #4
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
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 :
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 :
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 :
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;
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2007, 16h28   #5
Membre du Club
 
Inscription : février 2007
Messages : 56
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 56
Points : 56
Points : 56
Bonjour,

Citation:
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 ?
clalevee est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h45.


 
 
 
 
Partenaires

Hébergement Web