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

Requêtes PostgreSQL Discussion :

Passer le nom d'un Champ comme paramètre d'une proc. stockée


Sujet :

Requêtes PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Chef d’entreprise
    Inscrit en
    Mars 2002
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Chef d’entreprise

    Informations forums :
    Inscription : Mars 2002
    Messages : 212
    Par défaut Passer le nom d'un Champ comme paramètre d'une proc. stockée
    Bonjour
    Je veux créer une procédure stocké à laquelle je veux passer en paramètre 2 variables Le nom d'un champ et sa valeur

    J'ai écrit ce code pour tester mais ça ne marche pas :
    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE OR REPLACE FUNCTION __searchtest(character, character)
      RETURNS SETOF record AS
    $BODY$
    select prod_version from vprod_details
    where $1=$2;
     
    $BODY$
      LANGUAGE 'sql' VOLATILE
      COST 100
      ROWS 1000;
    ALTER FUNCTION __searchtest(character, character) OWNER TO postgres;
    avec $1 le nom du champ et $2 est la valeur du champ.
    Est-ce possible?
    Si oui comment faire?

  2. #2
    Membre éprouvé Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 863
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 863
    Par défaut
    Bonjour.

    Tu peux le faire mais tu dois passer par l'instruction EXECUTE:
    http://www.postgresql.org/docs/8.3/i...-EXECUTING-DYN

  3. #3
    Membre éclairé
    Profil pro
    Chef d’entreprise
    Inscrit en
    Mars 2002
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Chef d’entreprise

    Informations forums :
    Inscription : Mars 2002
    Messages : 212
    Par défaut
    J'ai essayé cette écriture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE OR REPLACE FUNCTION __searchtest2(character, character)
      RETURNS bigint AS
    $BODY$
    PREPARE  test(character,character) as select prod_version from vprod_details
    where $1=$2;
     
    EXECUTE test('prod_ref','ZA01820C'); 
     
    $BODY$
      LANGUAGE 'sql' VOLATILE
      COST 100;
    ALTER FUNCTION __searchtest(character, character) OWNER TO postgres;
    J'ai l'erreur suivante
    ERROR: return type mismatch in function declared to return bigint
    DÉTAIL : Function's final statement must be a SELECT.
    CONTEXTE : SQL function "__searchtest2"

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Le EXECUTE dont kain_tn parle est celui du langage pl/pgsql, et non du langage SQL, tu ne pourras pas l'utiliser si tu te cantonnes au langage SQL.

  5. #5
    Membre éprouvé Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 863
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 863
    Par défaut
    Citation Envoyé par estofilo Voir le message
    Le EXECUTE dont kain_tn parle est celui du langage pl/pgsql, et non du langage SQL, tu ne pourras pas l'utiliser si tu te cantonnes au langage SQL.
    Tout à fait.

    En fait, la documentation officielle de PostgreSQL recommande d'utiliser le pl/pgSQL plutôt que le SQL pour les procédures stockées pour des questions de performances.

    Tu dois d'abord ajouter ce langage à ta base:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE LANGUAGE plpgsql;

    Ensuite, ta procédure que tu peux réécrire ainsi:
    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
     
    CREATE OR REPLACE FUNCTION public.proc_searchtest2
    (
        _key character varying,
    	_value character varying,
    	OUT prod_version bigint
    )
    RETURNS record
    AS $$
    DECLARE __query text DEFAULT null;
    BEGIN
     
    	__query := 'SELECT prod_version FROM vprod_details WHERE "' || _key || '" = \'' || _value || '\'';
    	EXECUTE __query INTO prod_version;
     
    	RETURN;
     
    END $$ LANGUAGE plpgsql;

  6. #6
    Membre éclairé
    Profil pro
    Chef d’entreprise
    Inscrit en
    Mars 2002
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Chef d’entreprise

    Informations forums :
    Inscription : Mars 2002
    Messages : 212
    Par défaut
    merci c'est résolu!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/06/2015, 18h59
  2. Passer le contenu d'un TDJBCInput comme paramètre dans une routine
    Par ngatchou dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 09/02/2015, 14h36
  3. Réponses: 2
    Dernier message: 03/12/2006, 12h37
  4. Réponses: 6
    Dernier message: 23/05/2005, 10h47
  5. Un fichier .bmp comme paramètre d'une Procédure stockée
    Par FONKOU dans le forum Bases de données
    Réponses: 2
    Dernier message: 28/10/2004, 17h56

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