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

  1. #1
    Membre habitué
    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
    Points : 149
    Points
    149
    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
    Expert éminent Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 564
    Points : 7 289
    Points
    7 289
    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
    Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
     
    int main(int argc, char **argv) {
     
        printf("So long, and thanks for the fish, Dennis...\n");
        return 0;
    }

  3. #3
    Membre habitué
    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
    Points : 149
    Points
    149
    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 émérite
    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
    Points : 2 890
    Points
    2 890
    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
    Expert éminent Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 564
    Points : 7 289
    Points
    7 289
    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;
    Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
     
    int main(int argc, char **argv) {
     
        printf("So long, and thanks for the fish, Dennis...\n");
        return 0;
    }

  6. #6
    Membre habitué
    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
    Points : 149
    Points
    149
    Par défaut
    merci c'est résolu!

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Bonjour.
    Tout d'abord désolé de réouvrir un sujet clos, mais je voudrais utiliser le même genre de procédure.

    Mon problème étant que lors de l'exécution de ma procédure, le nom du champ n'est pas reconnu(du fait que pour exécuter la procédure le premier paramètre est entre simples quotes)...

    Merci de votre aide, je désespère!

+ 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