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 09/12/2004, 09h37   #1
Membre du Club
 
Inscription : mai 2003
Messages : 140
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 140
Points : 66
Points : 66
Par défaut [FB1.5]Procédure stockée ?

Bonjour,

Voici ma procédure
Code :
1
2
3
4
5
6
7
8
9
10
11
12
CREATE PROCEDURE MA_PROCEDURE (
    NOMCHP VARCHAR(25)
    ID INTEGER)
RETURNS (
    RETOUR VARCHAR(50))
AS
begin
    SELECT :NOMCHP FROM MA_VUE
    WHERE ID = :ID
    INTO :RETOUR;
  suspend;
end
Mon problème c'est que RETOUR ne prend pas la le résultat de la requete mais la valeur de mon paramètre :NOMCHP !
Il y a t-il une solution ?

Merci.
__________________
Les deux mots les plus brefs et les plus anciens, oui et non, sont ceux qui exigent le plus de réflexion. "Pythagore"
Sitting Bull est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2004, 10h29   #2
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
C'est normal sur le même principe vous avez ceci :
Code :
SELECT 1 FROM Matable INTO :RETOUR;
Retour vous vous en doutez contiendra toujours 1.

Mais j'imagine que ce que vous cherchez à faire est une requete dynamique. Avec en paramétre d'entrée le nom de la colonne a selectionner.

Ce n'est hélas pas possible sous Interbase 6.
Ce que vous pouvez faire :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE PROCEDURE MA_PROCEDURE ( 
    NOMCHP VARCHAR(25), 
    ID INTEGER) 
RETURNS ( 
    RETOUR VARCHAR(50)) 
AS 
begin 
  IF (upper(NOMCHP)='NOM') then
    SELECT NOM FROM MA_VUE 
    WHERE ID = :ID 
    INTO :RETOUR; 
  else
  IF (upper(NOMCHP)='PRENOM') then
    SELECT PRENOM FROM MA_VUE 
    WHERE ID = :ID 
    INTO :RETOUR; 
...
  suspend; 
end
Ce qui devient vite lourd quant on veut pouvoir selectionner beaucoup de colonne différentes.

Sous Firebird on peux exécuter une requete créée dynamiquement.

On construit la requete dans un varchar par exemple et on utilise execute statement, mais c'est une méthode qui n'est pas recommandée quand on peut faire autrement.. (Moins performant, plus difficile à maintenir, il n'y a plus de controle d'indépendance, la validation de la syntaxe se fait au moment de l'execution donc il y a plus de risque que ca plante, Il ya aussi un probleme avec les privilèges d'execution (c'est ceux de l'utilisateur qui sont pris en compte et non ceux de la procédure)).

Code :
execute statement ' SELECT ' || NOMCHP || ' from MA_VUE where ID = ' || ID INTO :RETOUR;
Donc priviligiez la première solution même si elle est plus longue à écrire.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2004, 10h35   #3
Membre du Club
 
Inscription : mai 2003
Messages : 140
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 140
Points : 66
Points : 66
Merci pour la reponse. Cependant il m'est imossible d'utiliser la methode que vous préconisez, car, il y à une multitude de champs possibles. Dans tous les cas merci.
__________________
Les deux mots les plus brefs et les plus anciens, oui et non, sont ceux qui exigent le plus de réflexion. "Pythagore"
Sitting Bull 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 06h11.


 
 
 
 
Partenaires

Hébergement Web