2017-05-09 2 views
1

Ich habe diese Funktion:Fehler bei der Erstellung Funktion in 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$ 

Wenn er ausgeführt wird, zeigt dieser Fehler:

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" 

Warum muss ich diesen Fehler, und wie kann ich es beheben?

+0

Abgesehen von dem, was Laurenz schrieb, Sie fehlen auch die Funktion Körper. –

+0

Sie müssen auch 'setof' entfernen, da RETURNS TABLE impliziert set und PostgreSQL wird Fehler zurückgeben, wenn Sie versuchen, diese zu mischen. –

+1

Was Sie zeigen, ist * nicht * eine Funktion, nur die Kopfzeile mit einem beginnenden Dollar-Zitat, der Rest ist offensichtlich abgeschnitten. Bitte präsentiere immer eine komplette (minimale) Funktion - diejenige, die du tatsächlich hast (abzüglich möglicherweise irrelevanter Dinge im Körper). Und immer deine Version von Postgres. –

Antwort

0

Entfernen Sie die Anführungszeichen um TABLE(...).

3

Es ist entweder:

RETURNS TABLE (...) 

oder:

RETURNS SETOF sometype 

Sie haben eine illegale Mischung beider Formen. Es sieht so aus, als hätten Sie einen Namen in doppelter Anführungszeichen durch eine benutzerdefinierte Tabellendefinition ersetzt. Dies würde funktionieren:

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$; 

Call:

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

Details in the manual.

Verwandte Themen