Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
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 30/06/2005, 15h15   #1
Candidat au titre de Membre du Club
 
Inscription : mars 2005
Messages : 49
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 49
Points : 13
Points : 13
Par défaut Utilisation d'une variable dans le WHERE d'une requête

Bonjour,

Je suis en train de créer une procédure stockée sous Firebird 1.5.

Je récupère le nom d'une table que je stocke dans une variable (:NOM_TABLE). Je récupère également le nom de la clé en passant par les tables RDB$INDICES et RDB$INDEX_SEGMENTS.

Maintenant je voudrais utiliser ces variables dans une requête pour avoir la valeur de la clé de la table trouvée :

SELECT :NOM_CLE FROM :NOM_TABLE INTO :VALEUR_CLE

Cette requête ne semble pas fonctionner, il y a une erreur au niveau du FROM.

Avez-vous une solution pour utiliser une variable dans une requête ?

Merci
Tcheby est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2005, 11h24   #2
Expert Confirmé Sénior
 
Avatar de qi130
 
Homme Pierre
Ingénieur qualité méthodes
Inscription : mars 2003
Messages : 3 726
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Ingénieur qualité méthodes
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 3 726
Points : 4 739
Points : 4 739
La syntaxe du select est :
Code :
1
2
3
4
5
6
SELECT [TRANSACTION transaction]
[DISTINCT | ALL]
{* | <val> [, <val>]}
[INTO : var [, : var …]]
FROM <tableref> [, <tableref>]
[WHERE <search_condition>]


INTO avant le FROM
__________________
"Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
-----------------------
Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
Usus magister est optimus
qi130 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2005, 11h32   #3
Candidat au titre de Membre du Club
 
Inscription : mars 2005
Messages : 49
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 49
Points : 13
Points : 13
le but principal de ma question est donc :
est ce que <val> et <tableref> peuvent être des variables (du style :var) ?
Tcheby est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2005, 14h21   #4
Expert Confirmé Sénior
 
Avatar de qi130
 
Homme Pierre
Ingénieur qualité méthodes
Inscription : mars 2003
Messages : 3 726
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Ingénieur qualité méthodes
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 3 726
Points : 4 739
Points : 4 739
Of course !

Ce système permet de parser n'importe quoi, et dès lors que la requète finale est syntaxiquement et fonctionnellement correcte, il ne devrait pas y avoir de problème.

Le parse doit arriver au même résultat que si tu construisais dynamiquement ta requète genre (sous delphi)
Code :
MaQuery:='SELECT '+MaColonne+' FROM '+MaTable;
__________________
"Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
-----------------------
Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
Usus magister est optimus
qi130 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2005, 14h32   #5
Candidat au titre de Membre du Club
 
Inscription : mars 2005
Messages : 49
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 49
Points : 13
Points : 13
Je ne comprend pas bien ta réponse.

Quand je fais une requête du style
Code :
SELECT :NOM_INDEX FROM :NOM_TABLE;
Il me dit à compilation de ma procédure qu'il y a une erreur au niveau de :NOM_TABLE avec les ":". J'enlève donc les ":" mais après il ne connais pas la table NOM_TABLE.

J'ai également des problèmes au niveau du :NOM_INDEX. Je l'ai déclaré en temps que VARCHAR(30). Quand je debugge ma procedure, il remplace bien la valeur de la variable mais avec plein de blancs derrière. J'ai donc fait un TRIM(:NOM_INDEX) mais cela ne lui plait pas non plus.
Tcheby est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2005, 16h03   #6
Expert Confirmé Sénior
 
Avatar de qi130
 
Homme Pierre
Ingénieur qualité méthodes
Inscription : mars 2003
Messages : 3 726
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Ingénieur qualité méthodes
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 3 726
Points : 4 739
Points : 4 739
Tu développes avec quel outil ?
__________________
"Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
-----------------------
Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
Usus magister est optimus
qi130 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2005, 16h08   #7
Candidat au titre de Membre du Club
 
Inscription : mars 2005
Messages : 49
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 49
Points : 13
Points : 13
je développe ma procedure stockée sous EMS Interbase/Firebird Manager.
Tcheby est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2005, 20h49   #8
Nouveau Membre du Club
 
Inscription : juin 2005
Messages : 23
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 23
Points : 25
Points : 25
Ca fait longtemps que je n'ai pas toché à interbase, mais si je me souviens bien, voilà ce que l'on peut te répondre:

on ne peut pas utiliser de variable en lieu et place d'un nom de table ou d'un nom de colonne dans une requete SQL dynamique.

On peut seulement y remplacer la valeur d'une constante par le nom d'une variable.

Ainsi je peux écrire:

Code :
1
2
 
 SELECT nom, prenom FROM personnes WHERE age < :max_age
au lieu de

Code :
1
2
 
 SELECT nom, prenom FROM personnes WHERE age < 200
Mais je ne peux pas par contre écrire:

Code :
1
2
 
 SELECT :col_A, :col_B FROM :table_E WHERE age < 200
La solution proposée par qi130 est gérer le problème au moment de l'écriture de la requête, en concaténant les morceaux de requête adéquats:

Code :
1
2
 
" SELECT " + col_A + " , " + col_B + " FROM " + table_E + " WHERE age < 200 "
Mais cette solution n'est pas adaptée à l'écriture d'une procédure stockée qui exige de connaitre la requête au moment de la création de la procédure, et non au moment de son exécution.

Il faut donc trouver une autre solution pour ton problème :

- écrire toutes les requètes possible et sélectionner la bonne à l'exécution
- écrire une fonction utilsateur en C et concaténer le texte de la requete au moment de l'exécution de la fonction ( exécuter la requête par un appel SQL depuis le C ! )
- faire autrement.
phlip est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2005, 09h44   #9
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
On ne peut faire des les PS et trigger des requetes dynamiques (créés à la vollées).

En fait les requetes sont compilées ds la PS, ce qui augmente la vitesse d'exécution de celle ci.

Cependant dans fb1.5 il est maintenant possible de créer et d'interpréter une requete dynamique.

La commande est execute statement.

Cependant elle a de nombreuses limites en plus (des problemes connue du au requetes dynamique (moins performantes, plus difficile a optimiser et gérer (maintenance)).

On peut faire un
Code :
1
2
FOR execute statement MaChaine INTO :mavar1, :marvar2 do
....
On voit bien là la limite ce qui est dynamique se sont les noms des colonnes, le nom des tables mais il faudra qu'au final le résultat ait le même nombre de colonne que de variables INTO et de même type (ou transtypable).

Voilà donc celà peux dépanner. Mais pour les cas vraiment dynamique et complexe, soit il faut revoir la conception de la base soit le faire depuis un programme client.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2005, 08h37   #10
Candidat au titre de Membre du Club
 
Inscription : mars 2005
Messages : 49
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 49
Points : 13
Points : 13
Merci à vous , vous m'avez compris 8)

Je vais voir avec "execute statement" sinon je vais me rabattre vers un programme client.

Le "EXECUTE STATEMENT" fonctionne bien sauf que mon éditeur me met une erreur au niveau du "INTO" après. Ca passe quand même.
Tcheby est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h58.


 
 
 
 
Partenaires

Hébergement Web