PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

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

#1 16/12/2015 10:08:34

Mlan2
Membre

Génération de messages personnalisés

Bonjour,

Je suis en quête de méthode pour restituer des messages personnalisés durant le déroulement de la fonction utilisée.

Sous Oracle existait une fonctionnalité pour le réaliser à l'aide du package DBMS_OUTPUT

Il ne semble pas avoir d'équivalent sous POSTGRESQL.

Pour cela, j'ai cru bon d'utiliser la fonction RAISE NOTICE, qui me restitue un message, qui n'est pas tout à fait ce que je souhaite, car du texte indésirable "NOTICE" apparait dans le message, et n'est pas souhaité par l'utilisateur final de ces messages.

Existe t'il un moyen pour obtenir son propre message uniquement ?

(Une précision : Je veux obtenir le message sur la console).

Ci-dessous, le code de la fonction que j'utilise pour l'essai :

CREATE OR REPLACE FUNCTION my_fct1()
  RETURNS void AS
$BODY$
DECLARE

  V_Ret             INTEGER := 0;
  V_Message         VARCHAR (255) := NULL;

BEGIN 
  V_Message := 'Ceci est le message souhaité : ';
  RAISE NOTICE '%', V_Message;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

Le code pour l'exécuter à partir de psql :

SPIE=# select My_Fct1 ();

Le message obtenu :

NOTICE:  Ceci est le message souhaité :

Je voudrai obtenir le message ci-dessous, sans l'identifiant NOTICE :

Ceci est le message souhaité :

D'avance merci de votre retour.

Hors ligne

#2 16/12/2015 10:15:23

gleu
Administrateur

Re : Génération de messages personnalisés

Non, ce n'est pas possible en natif. C'est une fonction SQL, ce n'est pas prévu pour avoir une interface client (texte ou graphique).

Hors ligne

#3 16/12/2015 10:25:14

Mlan2
Membre

Re : Génération de messages personnalisés

Dans ce cas, comment pourrait t'on procéder pour obtenir le résultat souhaité ?

Hors ligne

#4 16/12/2015 10:35:48

gleu
Administrateur

Re : Génération de messages personnalisés

Le seul moyen possible est de créer un outil (en perl, python, php, C, java, ce que vous voulez) qui se connecte à PostgreSQL et fait ce que la fonction SQL fait. Les messages de cet outil n'auront pas les NOTICE.

Hors ligne

#5 16/12/2015 10:40:05

ruizsebastien
Membre

Re : Génération de messages personnalisés

Bonjour,

et pourquoi pas : select 'mon message';

Cordialement.

Hors ligne

#6 16/12/2015 10:58:41

Mlan2
Membre

Re : Génération de messages personnalisés

Merci pour vos retours.

En résumé, pour répondre aux nombreuses questions que l'on trouve sur les forums, il n'y a pas d'équivalent postgreSQL aux fonctionnalités du package DBMS_OUTPUT fourni par Oracle.

Merci de confirmer ma conclusion.

Hors ligne

#7 16/12/2015 11:17:01

ruizsebastien
Membre

Re : Génération de messages personnalisés

Si :
RAISE NOTICE
ou select 'message';
ou developpement externe.

Hors ligne

#8 16/12/2015 17:57:11

Mlan2
Membre

Re : Génération de messages personnalisés

Merci de vos retours.

Je continue mes investigations en utilisant RAISE NOTICE pour mes sorties de messages.

Ci-dessous, un exemple de code, qui s'exécute correctement en copiant le texte dans la console psql :

DO
$$

DECLARE

  V_Message         VARCHAR (255) := NULL;

BEGIN 

  V_Message := 'Le message : ';
  RAISE NOTICE '%', V_Message;
	

  V_Message := '-----------------------------';
  RAISE NOTICE '%', V_Message;
  V_Message := 'Recapitulatif : ';
  RAISE NOTICE '%', V_Message;
  V_Message := '-----------------------------';
  RAISE NOTICE '%', V_Message;
 
END;
$$ LANGUAGE plpgsql;

Les messages générés par RAISE NOTICE ressortent bien sur la console de psql.

NOTICE:  Le message :
NOTICE:  -----------------------------
NOTICE:  Recapitulatif :
NOTICE:  -----------------------------

A présent, je veux inclure ce code dans un shell script

de la façon suivante :

psql -h ${PGSERVEUR} -d ${PGDB} -U ${PGUSR} -t <<EOF >/dev/null
DO
$$

DECLARE

  V_Message         VARCHAR (255) := NULL;

BEGIN 

  V_Message := 'Le message : ';
  RAISE NOTICE '%', V_Message;
	

  V_Message := '-----------------------------';
  RAISE NOTICE '%', V_Message;
  V_Message := 'Recapitulatif : ';
  RAISE NOTICE '%', V_Message;
  V_Message := '-----------------------------';
  RAISE NOTICE '%', V_Message;
 
END;
$$ LANGUAGE plpgsql;

EOF

J'obtiens les erreurs ci-dessous :

+ psql -h localhost -d user -U password -t
ERROR:  syntax error at or near "15653"
LINE 2: 15653
        ^
ERROR:  syntax error at or near "V_Message"
LINE 2:   V_Message := 'Le message : ';
          ^
ERROR:  syntax error at or near "RAISE"
LINE 1: RAISE NOTICE '%', V_Message;
        ^
ERROR:  syntax error at or near "V_Message"
LINE 1: V_Message := '-----------------------------';
        ^
ERROR:  syntax error at or near "RAISE"
LINE 1: RAISE NOTICE '%', V_Message;
        ^
ERROR:  syntax error at or near "V_Message"
LINE 1: V_Message := 'Recapitulatif : ';
        ^
ERROR:  syntax error at or near "RAISE"
LINE 1: RAISE NOTICE '%', V_Message;
        ^
ERROR:  syntax error at or near "V_Message"
LINE 1: V_Message := '-----------------------------';
        ^
ERROR:  syntax error at or near "RAISE"
LINE 1: RAISE NOTICE '%', V_Message;
        ^
WARNING:  there is no transaction in progress
ERROR:  syntax error at or near "15653"
LINE 1: 15653 LANGUAGE plpgsql;

Que se passe t'il ?

Il semble que toutes les lignes soient en erreur.

D'avance merci de votre retour.

Hors ligne

#9 16/12/2015 18:56:12

gleu
Administrateur

Re : Génération de messages personnalisés

Le shell interprète les $$ comme étant la variable d'environnement pour le PID (identifiant processus). D'où le nombre qui apparaît. Vous devez échapper les $$.

Hors ligne

#10 16/12/2015 19:22:06

Mlan2
Membre

Re : Génération de messages personnalisés

Merci de l'information.

Effectivement, après avoir échappé les $$, le script se déroule correctement.

Hors ligne

Pied de page des forums