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 :

Fonction avec plusieurs paramètres OUT


Sujet :

Requêtes PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 28
    Par défaut Fonction avec plusieurs paramètres OUT
    Bonjour,

    J'ai
    1. une table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE TABLE pk_test.variable (
      champ_v VARCHAR(100),
      champ_n INTEGER
    )
    2. une fontion
    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
    19
    20
    21
    22
    23
    24
    25
    26
    CREATE OR REPLACE FUNCTION pk_test.f_08 (
      pv_in pk_test.variable,
      pn_in integer,
      out ps_out varchar,
      out pn_out integer,
      out pv_out pk_test.variable
    )
    RETURNS record AS
    $body$
    DECLARE
    BEGIN
      raise notice 'dans la fonction:début:%:%:%',pv_in.champ_v,pv_in.champ_n,pn_in;
      pv_out := pv_in;
      pv_out.champ_n := 8;
      pv_out.champ_v := 'f_08';
      ps_out := 'paramètre out';
      pn_out := pn_in * 8;
      raise notice 'dans la fonction:fin:%:%,%,%',pv_out.champ_v,pv_out.champ_n,ps_out,pn_out;
      return;
    END;
    $body$
    LANGUAGE 'plpgsql'
    VOLATILE
    CALLED ON NULL INPUT
    SECURITY INVOKER
    COST 100;
    3. une autre fonction qui appelle la précédent :
    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
    19
    20
    21
    22
    CREATE OR REPLACE FUNCTION pk_test.f_test (
    )
    RETURNS void AS
    $body$
    DECLARE
      vv_var           pk_test.variable%rowtype;
      vv_var_out     pk_test.variable%rowtype;
      vr_retour	      RECORD;
    BEGIN
      raise notice 'F_08-----------------------------------';
      vv_var.champ_v := 'champ v';
      vv_var.champ_n := 0;
      raise notice 'avant appel fonction:%:%', vv_var.champ_v, vv_var.champ_n;
      select * into vr_retour from pk_test.f_08(vv_var, 8);
      raise notice 'retour:%', vr_retour;
    END;
    $body$
    LANGUAGE 'plpgsql'
    VOLATILE
    CALLED ON NULL INPUT
    SECURITY INVOKER
    COST 100;
    lorsque j'exécute cette fonction, je reçois ces résultats :
    NOTICE: F_08-----------------------------------
    NOTICE: avant appel fonction:champ v:0
    NOTICE: dans la fonction:début:champ v:0:8
    NOTICE: dans la fonction:fin:f_08:8,paramètre out,64
    NOTICE: retour: ("paramètre out",64,"(f_08,8)")

    c'est bien correct, mais comment faire pour "décomposer" ces données (en format RECORD) dans une variable varchar, une variable integer et une variable rowtype ?

  2. #2
    Membre Expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Billets dans le blog
    8
    Par défaut
    Salut
    Il y a assez de symptômes de débutant dans votre cas.
    • le message envoyé par RAISE N'EST PAS UTILISABLE comme retour d'une fonction
    • le ROWTYPE est utiliser pour copier la structure d'une table

    Je vous conseille vivement de beaucoup lire la doc sur plpgsql et ce petit article de sqlpro.
    Bonne lecture et @+

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 28
    Par défaut
    C'est vrai que je suis un débutant en PostgreSQL mais je viens du "monde" Oracle et j'essaye de trouver des similitudes.

    Voici une autre fonction (toujours avec la même table) :
    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
    19
    20
    21
    22
    CREATE OR REPLACE FUNCTION pk_test.f_05 (
      pv_in pk_test.variable,
      pn_in integer,
      out pv_out pk_test.variable
    )
    RETURNS pk_test.variable AS
    $body$
    DECLARE
    BEGIN
      raise notice 'f_05 avant:%:%',pv_in.champ_v,pv_in.champ_n;
      pv_out := pv_in;
      pv_out.champ_n := 5;
      pv_out.champ_v := 'f_05';
      raise notice 'f_05 apres:%:%',pv_out.champ_v,pv_out.champ_n;
      return;
    END;
    $body$
    LANGUAGE 'plpgsql'
    VOLATILE
    CALLED ON NULL INPUT
    SECURITY INVOKER
    COST 100;
    Et la fonction qui l'appelle :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    CREATE OR REPLACE FUNCTION pk_test.f_test (
    )
    RETURNS void AS
    $body$
    DECLARE
      vv_var pk_test.variable%rowtype;
      vv_var_out pk_test.variable%rowtype;
      vn_retour INTEGER;
      vn integer;
      vr_retour	RECORD;
      vs		VARCHAR(100);
      vs_detail varchar(100);
      vs_1			varchar(100);
      vs_2			varchar(100);
      vn_1			integer;
      vn_2			integer;
      vv_1			pk_test.variable%rowtype;
    BEGIN
     
      raise notice 'F_05-----------------------------------';
      vv_var.champ_v := 'toto';
      vv_var.champ_n := 0;
      raise notice 'avant:%:%', vv_var.champ_v, vv_var.champ_n;
      SELECT *
      INTO vv_var
      FROM pk_test.f_05(vv_var, vn);
      raise notice 'retour:%:%', vv_var.champ_v,vv_var.champ_n;
     
      return;
    END;
    $body$
    LANGUAGE 'plpgsql'
    VOLATILE
    CALLED ON NULL INPUT
    SECURITY INVOKER
    COST 100;
    avec le résultat suivant :
    NOTICE: F_05-----------------------------------
    NOTICE: avant:toto:0
    NOTICE: f_05 avant:toto:0
    NOTICE: f_05 apres:f_05:5
    NOTICE: retour:f_05:5

    on voit bien que les infos ont bien été chargées dans le rowtype.

    ce que je voudrais avoir, ce sont plusieurs paramètres output y compris le rowtype.

Discussions similaires

  1. Appel d'une fonction avec plusieurs paramètres
    Par kazarn dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 06/06/2009, 18h55
  2. créer une fonction avec plusieurs paramètres
    Par SHERPAE dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 06/01/2009, 17h41
  3. Aide pour déclarer fonction avec plusieurs paramètres de sortie
    Par tonioj41 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 16/01/2008, 11h06
  4. [Système] Fonction avec plusieurs paramètres optionnels
    Par cerede2000 dans le forum Langage
    Réponses: 1
    Dernier message: 25/05/2007, 14h36
  5. Réponses: 1
    Dernier message: 01/06/2006, 11h31

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