2017-05-09 1 views
1

J'ai cette fonction:Erreur dans la création de la fonction dans Postgres

CREATE OR REPLACE FUNCTION public.sp_rptadvsalincr(
    p_flag character, 
    p_empcds character varying, 
    p_incrtype character varying) 
    RETURNS SETOF "TABLE(empcd character, name character varying, basic integer, incrdt timestamp without time zone, incrdbasic integer, nextincrdt timestamp without time zone, deptgenno character varying)" 
    LANGUAGE 'plpgsql' 
    COST 100.0 
    VOLATILE NOT LEAKPROOF 
    ROWS 1000.0 
AS $function$ 

Lorsqu'il est exécuté, il affiche cette erreur:

ERROR: type "TABLE(empcd character, name character varying, basic integer, i" does not exist 
NOTICE: identifier "TABLE(empcd character, name character varying, basic integer, incrdt timestamp without time zone, incrdbasic integer, nextincrdt timestamp without time zone, deptgenno character varying)" will be truncated to "TABLE(empcd character, name character varying, basic integer, i" 

Pourquoi puis-je obtenir cette erreur, et comment puis-je résoudre ce problème?

+0

En dehors de ce qui a écrit Laurenz, il vous manque aussi le corps de la fonction. –

+0

Vous devez également supprimer 'setof' car RETURNS TABLE implique set et PostgreSQL retournera une erreur si vous essayez de les mixer. –

+1

Ce que vous montrez n'est * pas * une fonction, seulement l'en-tête avec un devis de départ, le reste étant évidemment tronqué. Veuillez toujours présenter une fonction complète (minimale) - celle que vous avez réellement (moins les choses éventuellement non pertinentes dans le corps). Et toujours votre version de Postgres. –

Répondre

0

Supprimez les guillemets autour de TABLE(...).

3

Il est soit:

RETURNS TABLE (...) 

ou:

RETURNS SETOF sometype 

Vous avez un mélange illégal de ces deux formes. On dirait que vous avez remplacé un nom de type entre guillemets avec une définition de table personnalisée. Cela fonctionnerait:

CREATE OR REPLACE FUNCTION public.sp_rptadvsalincr(
    p_flag character, 
    p_empcds character varying, 
    p_incrtype character varying) 
    RETURNS TABLE(empcd character, name character varying, basic integer, incrdt timestamp without time zone, incrdbasic integer, nextincrdt timestamp without time zone, deptgenno character varying) 
    LANGUAGE plpgsql 
    COST 100 
    VOLATILE NOT LEAKPROOF 
    ROWS 1000 
AS $function$ 
BEGIN 
RETURN QUERY 
SELECT NULL::char, NULL::varchar, NULL::int, NULL::timestamp, NULL::int, NULL::timestamp, NULL::varchar; 
END 
$function$; 

Appel:

SELECT * FROM pg_temp.sp_rptadvsalincr('a','b','c'); 

Details in the manual.