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 19/09/2016 23:38:06

Mlan2
Membre

Erreur d'exécution EXECUTE

Bonjour,

Ci-dessous, une erreur d'exécution obtenue lors de l'invocation de la fonction : EXECUTE, dont je ne vois pas la cause :

$$
DECLARE
 r record;
 user_name   VARCHAR      (255);
 schema_name VARCHAR      (255);
BEGIN
  user_name   := 'decatn';
  schema_name := 's_etptabe';
  
   FOR r IN SELECT p.proname, p.proowner, p.pronamespace
              FROM pg_proc p
             WHERE (p.proowner = (select u.usesysid
				    from  pg_user u
 			           where (u.usename = user_name)))
	       AND (p.proowner = (select nspowner
			            From pg_namespace
			           Where (nspname = schema_name)))
    LOOP
        EXECUTE 'ALTER FUNCTION ' || quote_ident(schema_name) || '.' || quote_ident(r.proname) || ' SET SCHEMA public;';
    END LOOP;
END;
$$
Message obtenu :

ERREUR:  erreur de syntaxe sur ou près de « SET »
LINE 1: ALTER FUNCTION s_etptabe.inst_wepal SET SCHEMA public;
                                            ^
QUERY:  ALTER FUNCTION s_etptabe.inst_wepal SET SCHEMA public;
CONTEXT:  fonction PL/pgsql inline_code_block, ligne 19 à instruction EXECUTE
********** Erreur **********

ERREUR: erreur de syntaxe sur ou près de « SET »
État SQL :42601
Contexte : fonction PL/pgsql inline_code_block, ligne 19 à instruction EXECUTE

Le message est peu explicite.
Avez-vous une idée de la cause de l'erreur ?

D'avance merci, de votre retour.

Hors ligne

#2 20/09/2016 08:42:38

Mlan2
Membre

Re : Erreur d'exécution EXECUTE

Il manque le DO en début du bloc de code fourni en exemple.

Après quelques recherches complémentaires, l'erreur produite viendrait de l'absence des paramètres fournis entre parenthèses de la fonction.

D'une manière générale, quelle serait le code pour fournir la chaine de caractères correspondant aux paramètres de la fonction ?

D'avance merci de votre retour.

Hors ligne

#3 20/09/2016 13:56:10

gleu
Administrateur

Re : Erreur d'exécution EXECUTE

L'erreur vient évidemment du manque des arguments. La seule façon d'identifier une fonction avec PostgreSQL est de fournir son nom et les types de ses arguments, vu qu'il est possible d'avoir plusieurs fonctions de même nom.

Quant au code, le plus simple est de récupérer les noms des types dans pg_type, une fois récupéré la liste des identifiants de type avec la colonne proargtypes de pg_proc.

Hors ligne

#4 20/09/2016 14:36:10

Mlan2
Membre

Re : Erreur d'exécution EXECUTE

Merci de l'information.

Comment implémenter le code pour fabriquer la chaine de caractères correspondant au type de chacun des paramètres de la fonction ?

Dans mon exemple, une fonction a une liste de paramètres :

SELECT p.proargtypes
  FROM pg_proc p
  where (p.proname = 'Ma_fonction')

"1043 1043 25 25 25 1114 1043 1043 1043 23 1043 23"


select typname, typelem from pg_type
 where (typelem in (1043, 23, 25, 1114));
 
"_int4";23
"_text";25
"_varchar";1043
"_timestamp";1114

Quand j'observe les types de paramètres liés à mon exemple de fonction, j'obtiens des valeurs différentes de celles obtenues dans la table pg_type pour les valeurs rencontrées.

IN namefile character varying,
    IN buff_err character varying,
    IN buff_pg1 text,
    IN buff_pg2 text,
    IN buff_pg3 text,
    IN dat_trt timestamp without time zone,
    IN mod_trt character varying,
    IN num_j character varying,
    IN nam_l character varying,
    INOUT nb_l integer,
    IN nam_i character varying,
    INOUT nb_i integer)

Aussi, quelles sont les valeurs de types de paramètres à utiliser pour identifier la fonction ?

Un exemple de code pour l'obtenir ?

D'avance merci de votre réponse.

Hors ligne

#5 20/09/2016 15:02:23

rjuju
Administrateur

Re : Erreur d'exécution EXECUTE

Vous pouvez utiliser la fonction pg_get_function_arguments() avec en paramètre l'oid de la fonction en question.

Hors ligne

#6 20/09/2016 16:02:11

Mlan2
Membre

Re : Erreur d'exécution EXECUTE

Comment récupérer l'oid d'une fonction ?

Celui-ci n'est pas présent dans la table pg_proc.

Hors ligne

#7 20/09/2016 17:18:17

arthurr
Membre

Re : Erreur d'exécution EXECUTE

Bonjour,
select pg_get_function_arguments(p.oid),p.proname, p.proowner, p.pronamespace from pg_proc p where p.proname='NOM_DE_LA_FONCTION';

Hors ligne

#8 05/11/2016 20:46:00

ASarahh
Membre

Re : Erreur d'exécution EXECUTE

Je suis tombé sur un problème très proche.
Merci pour vos solutions qui m'ont permis de trouver mes erreurs big_smile

Hors ligne

Pied de page des forums