Vous n'êtes pas identifié(e).

#1 29/08/2016 09:52:00

jp
Membre

[RESOLU] variable externe dans du plpgsql

Bonjour,
J'ai besoin de passer une variable (surement plusieurs à termes) dans un bloc plpgsql.
Mais je n'y arrive pas ! c'est pour ca que je requière votre aide :-)
Voici un exemple pour illustrer mon probleme.
La commande psql que je passe (toujours la meme):
# psql  --set vdate_debut=\'01/01/2016\' -f mon_fichier.sql

Contenu de mon_fichier.sql qui fonctionne:
------------------------------------
DROP table ma_table;
CREATE TABLE ma_table (message text) ;
insert into ma_table values (:vdate_debut);
------------------------------------
Ici pas de probleme la valeur est bien insérée.

Contenu de mon_fichier.sql qui ne fonctionne pas:
------------------------------------
DROP table ma_table;
CREATE TABLE ma_table (message date) ;
DO language plpgsql $$
declare
\set ddeb    date := to_date(:vdate_debut,'dd/mm/yyyy');
begin
insert into ma_table values (ddeb);
END
$$;
------------------------------------

Ici problème, ddeb n'est meme pas "seté". J'ai essayé plusieurs technique mais je n'y arrive toujours pas.
Est ce que quelqu'un aurai une solution miracle ?
J'ai forcement raté un truc mais n’étant pas tres fort en plpgsql, je ne sais pas quoi.
Merci

Dernière modification par jp (29/08/2016 13:10:36)

Hors ligne

#2 29/08/2016 11:41:09

gleu
Administrateur

Re : [RESOLU] variable externe dans du plpgsql

Parce que vous mélangez des trucs qui n'ont rien à voir.

Les méta-commandes \quelquechose sont interprétées par psql uniquement. Or, le contenu d'une fonction ou d'un DO est interprété par le serveur PostgreSQL (et plus exactement par le gestionnaire du langage indiqué). Donc pas étonnant qu'un \set ne fonctionne pas avec pl/pgsql.

Comme une instruction DO n'accepte pas d'argument, la seule solution est de créer une fonction et de mettre votre variable psql comme argument de la nouvelle fonction.


Guillaume.

Hors ligne

#3 29/08/2016 13:09:58

jp
Membre

Re : [RESOLU] variable externe dans du plpgsql

Merci !
J'ai compris mon erreur et j'ai suivi vos conseils. Comme ceci tout fonctionne.

----------------------------------------------
DROP table ma_table;

CREATE TABLE ma_table (message date) ;

CREATE OR REPLACE FUNCTION ma_func (date_debut date)
RETURNS text AS $BODY$

declare

begin
 
  insert into ma_table values (date_debut);
  return 'insert ok';
end;
$BODY$ LANGUAGE plpgsql;

select ma_func(:vdate_debut);

-----------------------------------------------

Merci encore

Hors ligne

Pied de page des forums