SQL en format libre avec variables
-
- Messages : 11
- Enregistré le : mar. 16 juin 2009, 17:16:10
- Localisation : Saint-Brieuc
- Contact :
SQL en format libre avec variables
Bonjour,
Je souhaite dans un programme RPG (format libre) rechercher tous les champs d'une table (variable) afin de concaténer une zone avec tous les champs de la table et la valeur de chaque champ.
ex : &CHAMP1=xx1&CHAMP2=xx2&CHAMP3=xx3 etc ...
Pour trouver tous les champs d'une table, il existe la requête :
SELECT COLUMN_NAME FROM SYSCOLUMNS WHERE TABLE_NAME = 'NOM_TABLE ' AND TABLE_SCHEMA='NOM_BIB'
Par contre comment faire pour mettre sous forme de variable le nom de la table ainsi que le COLUMN_NAME ?
Je souhaiterais une aide sur la syntaxe et l'utilisation du "using"
Merci
Je souhaite dans un programme RPG (format libre) rechercher tous les champs d'une table (variable) afin de concaténer une zone avec tous les champs de la table et la valeur de chaque champ.
ex : &CHAMP1=xx1&CHAMP2=xx2&CHAMP3=xx3 etc ...
Pour trouver tous les champs d'une table, il existe la requête :
SELECT COLUMN_NAME FROM SYSCOLUMNS WHERE TABLE_NAME = 'NOM_TABLE ' AND TABLE_SCHEMA='NOM_BIB'
Par contre comment faire pour mettre sous forme de variable le nom de la table ainsi que le COLUMN_NAME ?
Je souhaiterais une aide sur la syntaxe et l'utilisation du "using"
Merci
-
- Messages : 34
- Enregistré le : mer. 28 mars 2007, 21:57:59
- Localisation : Rennes(35)
- Contact :
(sans texte)
Bonjour,
Le nom de la table et la bibliothèque peuvent être stockés dans des variables du programme RPG et utilisés de la manières suivante :
SELECT COLUMN_NAME FROM SYSCOLUMNS WHERE TABLE_NAME = :NomTable AND TABLE_SCHEMA= :NomBib
Cordialement,
Le nom de la table et la bibliothèque peuvent être stockés dans des variables du programme RPG et utilisés de la manières suivante :
SELECT COLUMN_NAME FROM SYSCOLUMNS WHERE TABLE_NAME = :NomTable AND TABLE_SCHEMA= :NomBib
Cordialement,
-
- Messages : 11
- Enregistré le : mar. 16 juin 2009, 17:16:10
- Localisation : Saint-Brieuc
- Contact :
Suite ...
Merci ;
Mais comment récupérer le nombre d'enregistrements COUNT(*) ainsi que la valeur de COLUMN_NAME dans deux variables ?
Tout ceci dans une syntaxe format libre.
Mais comment récupérer le nombre d'enregistrements COUNT(*) ainsi que la valeur de COLUMN_NAME dans deux variables ?
Tout ceci dans une syntaxe format libre.
-
- Site Admin
- Messages : 813
- Enregistré le : mer. 14 févr. 2007, 18:00:03
- Localisation : Nantes
- Contact :
récupérer les valeurs SQL dans des champs
Je pense qu'il vous manque l'essentiel : la syntaxe du SQL embarqué !!!
Pour récupérer une valeur unitaire :
pour récupérer des valeurs multiples
bonne continuation.
Pour récupérer une valeur unitaire :
Code : Tout sélectionner
SELECT COUNT(*) INTO :nombre from SYSCOLUMNS where ...
Code : Tout sélectionner
/free
EXEC SQL
DECLARE result CURSOR FOR SELECT COLUMN_NAME FROM SYSCOLUMNS where ... ;
puis
EXEC SQL
OPEN result;
..
DOU SQLSTATE <> '00000';
EXEC SQL
FETCH result INTO :colonne;
...
ENDDO;
enfin
EXEC SQL
CLOSE result ;
Christian Massé (Volubis.fr)
-
- Messages : 11
- Enregistré le : mar. 16 juin 2009, 17:16:10
- Localisation : Saint-Brieuc
- Contact :
(sans texte)
Merci Christian ;
J'ai pour autant une erreur de compilation dans la constitution de la seconde requête SQL.
La première me sert à rechercher toutes les zones d'une table donnée.
Je boucle sur chaque zone pour récupérer la valeur de chaque champ pour une clé (WHERE) donnée.
Seconde requête
J'ai pour autant une erreur de compilation dans la constitution de la seconde requête SQL.
La première me sert à rechercher toutes les zones d'une table donnée.
Je boucle sur chaque zone pour récupérer la valeur de chaque champ pour une clé (WHERE) donnée.
Code : Tout sélectionner
//=============================================*
// E01_SQLZ Recherche des zones du fichier
//=============================================*
BEGSR E01_SQLZ;
EXEC SQL
DECLARE result CURSOR FOR SELECT COLUMN_NAME FROM SYSCOLUMNS
WHERE TABLE_NAME = :W_Fichier
AND TABLE_SCHEMA= :W_Bibliotheque ;
EXEC SQL
OPEN result;
DOU SQLSTATE <> '00000';
EXEC SQL
FETCH result INTO :W_Colonne;
Exsr E01_SQLV;
EndDo;
ENDSR;
Code : Tout sélectionner
//=============================================*
// E01_SQLV Recherche des valeurs du fichier
//=============================================*
BEGSR E01_SQLV;
EXEC SQL
DECLARE result2 CURSOR FOR SELECT :W_Colonne
FROM :W_Fichier
WHERE :W_Cle;
EXEC SQL
OPEN result2;
If SQLSTATE <> '00000';
EXEC SQL
FETCH result2 INTO :W_Valeur;
W_Url= %trimr(W_Url) + '&'
+ %trimr(W_Colonne) + '='
+ %trimr(W_Valeur);
EndIf
ENDSR;
-
- Messages : 11
- Enregistré le : mar. 16 juin 2009, 17:16:10
- Localisation : Saint-Brieuc
- Contact :
(sans texte)
Avec ce code ça compile :
Première requête
Seconde requête
Première requête
Code : Tout sélectionner
BEGSR E01_SQLZ;
w_requete = 'SELECT COLUMN_NAME FROM SYSCOLUMNS' +
' WHERE TABLE_NAME = ' + W_Fichier +
' AND TABLE_SCHEMA = ' + W_Bibliotheque;
EXEC SQL
PREPARE P1 FROM : w_Requete;
EXEC SQL
DECLARE C1 CURSOR FOR P1;
EXEC SQL
OPEN C1;
DOU SQLSTATE <> '00000';
EXEC SQL
FETCH C1 INTO :W_Colonne;
Exsr E01_SQLV;
EndDo;
ENDSR;
Code : Tout sélectionner
BEGSR E01_SQLV;
w_requetebis = 'SELECT ' + W_Colonne + ' FROM ' + W_Fichier
+ ' WHERE ' + W_Cle;
EXEC SQL
PREPARE P2 FROM : w_Requetebis;
EXEC SQL
DECLARE C2 CURSOR FOR P2;
EXEC SQL
OPEN C2;
If SQLSTATE <> '00000';
EXEC SQL
FETCH C2 INTO :W_Valeur;
WUrl= %trimr(WUrl) + '&'
+ %trimr(W_Colonne) + '='
+ %trimr(W_Valeur);
EndIf;
ENDSR;
-
- Site Admin
- Messages : 813
- Enregistré le : mer. 14 févr. 2007, 18:00:03
- Localisation : Nantes
- Contact :
SQL statique et SQL dynamique
Effectivement dans du SQL dit "statique" (le code SQL est en "dur" dans le pgm), seules les valeurs peuvent être des variables, en aucun cas le nom de la colonne ou de la table.
le seul moyen est alors le SQL "dynamique" avec des instructions préparées.
bonne pioche !
le seul moyen est alors le SQL "dynamique" avec des instructions préparées.
bonne pioche !
Christian Massé (Volubis.fr)
-
- Messages : 4
- Enregistré le : jeu. 26 mars 2009, 11:39:17
- Localisation : Région parisienne
- Contact :
(sans texte)
Pour info, Fabrice aurait pu utiliser la SQLDA avec DESCRIBE ou PREPARE mais c'est plus compliqué à gérer, donc plus lourd à utiliser que le SQL dynamique.
-
- Messages : 11
- Enregistré le : mar. 16 juin 2009, 17:16:10
- Localisation : Saint-Brieuc
- Contact :
...suite
Pour autant, j'ai un soucis avec SQLSTATE qui est commun aux deux requêtes SQL.
Peut on dissocier la variable SQLSTATE par rapport aux deux requêtes imbriquées ?
Peut on dissocier la variable SQLSTATE par rapport aux deux requêtes imbriquées ?