PostgreSQL
La base de données la plus sophistiquée au monde.

Ouverture de session

Navigation

Contactez-nous

Administration du site :
"equipe chez postgresqlfr point org"

Contact presse :
"fr chez postgresql point org"

Contact association :
"bureau chez postgresqlfr point org"

Questions PostgreSQL :
 IRC :
  serveur irc.freenode.net
  canal #postgresqlfr

Recherche

Accéder aux archives

« Octobre 2008  
Lun Mar Mer Jeu Ven Sam Dim
  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  

Syndication

Flux XML

Sondage

Quelle est la version de PostgreSQL la plus répandue sur vos serveurs ?
8.3
10%
8.2
42%
8.1
40%
8.0
2%
7.4
6%
7.3 ou antérieure
0%
Nombre de votes: 48

[Débutant][PgSql] Appel de Procédures InOut

Technique - Langages Procéduraux (PL) | [Débutant][PgSql] Appel de Procédures InOut

Par GyLes le 19/06/2008 - 14:12

Bonjour,

Débutant sur l'utilisation de PgSql, je reste complètement bloqué sur un simple appel de procédure. Venant du monde Oracle, je pense qu'il me manque quelques concepts clés que je ne suis pourtant pas arrivé à débusquer sur Internet.

J'ai une simple procédure qui me permet d'ajouter un couple attribut/valeur dans une chaîne de caractères : (j'utilise EMS SQL Manager Lite)

Code :

CREATE OR REPLACE FUNCTION "client_sys"."add_to_attr" (name_ varchar, value_ varchar, inout attr_ varchar) RETURNS varchar AS
$body$
BEGIN
attr_ := attr_||name_||client_sys.getsep('field')||value_||client_sys.getsep('record');
END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

La fonction getsep permet d'obtenir un caract_res de séparation pour les champs et enregistrements. Ces fonctions fonctionnent (testées).

et une deuxième procédure de test :

Code :

CREATE OR REPLACE FUNCTION "client_sys"."test" () RETURNS varchar AS
$body$
DECLARE
ess VARCHAR;
BEGIN
ess := 'test123';
-- Clear de l'attr_
-- select client_sys.clear_attr(ess);
perform client_sys.add_to_attr('essai','toto',ess);
RETURN ess;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

A l'exécution de cette procédure, je devrais avoir en sortie le résultat suivant :

Code :

Query OK (0,16 sec)
RETURN Value: test123Arg1val1

Or ce n'est pas le cas, j'ai tout simplement le résultat suivant :
Code :

Query OK (0,14 sec)
RETURN Value: test123

En parcourant la documentation, PERFORM semble être l'instruction à utiliser pour exécuter une procédure. A priori, j'ai l'impression qu'elle ignore complètement le résultat en sortie.

En utilisant l'instruction SELECT, l'exécution sort en erreur (ou la compilation) en demandant une variable pour recevoir le résultat de la fonction.

Donc:

Code :

SELECT client_sys.clear_attr(ess) INTO ess;

fonctionne. Mais dans ce cas, où est l'intérêt d'utiliser des arguments en INOUT ?

Voilà l'exposé de mon petit problème qui m'a déjà tout de même joyeusement grignoter deux belles soirées.

Merci pour votre aide sur ce point, je ne vois plus trop ...

Options d'affichage des commentaires

Sélectionnez la méthode d'affichage des commentaires que vous préférez, puis cliquez sur "Sauvegarder les paramètres" pour activer vos changements.

Ok, en fait sous postgreSQL,

GyLes/ = 20 Juin, 2008 - 16:34

Ok, en fait sous postgreSQL, créer une procédure avec un seul argument en INOUT revient à créer une fonction.

Code :

CREATE FUNCTION arr(INOUT x varchar[])

est synonyme de

CREATE FUNCTION arr(x varchar[]) RETURNS varchar[]

Un post avait été ouvert par un utilisateur de la liste de diffusion postgres.

http://archives.postgresql.org/pgsql-general/2007-12/msg00789.php

Quel est l'intérêt dès lors de créer une procédure avec un seul argument INOUT si Postgres la transforme en fonction ?


Une très bonne URL pour l'ex

GyLes/ = 20 Juin, 2008 - 17:15

Une très bonne URL pour l'explication de tout cela :

http://www.postgresqlfr.org/?q=node/483


© PostgreSQLFr, tous droits réservés.
Site déclaré à la CNIL sous le numéro 1074678, conformément à la Loi en vigueur.