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)
La fonction getsep permet d'obtenir un caract_res de séparation pour les champs et enregistrements. Ces fonctions fonctionnent (testées).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 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;
et une deuxième procédure de test :
A l'exécution de cette procédure, je devrais avoir en sortie le résultat suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 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;
Or ce n'est pas le cas, j'ai tout simplement le résultat suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Query OK (0,16 sec) Return Value: test123Arg1val1
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Query OK (0,14 sec) Return Value: test123
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:
fonctionne. Mais dans ce cas, où est l'intérêt d'utiliser des arguments en INOUT ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 select client_sys.clear_attr(ess) into ess;
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 ...
Partager