2017-05-09 40 views
1

功能我有這樣的功能:出錯創建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$ 

執行時,它顯示了這個錯誤:

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" 

爲什麼我得到這個錯誤,我怎麼能解決這個問題?

+0

除了什麼Laurenz寫的,你也缺少函數體。 –

+0

您還需要刪除'setof',因爲RETURNS TABLE意味着set和PostgreSQL將返回錯誤,如果您嘗試混合這些。 –

+1

你顯示的是* not *函數,只有起始美元報價的標題,其餘顯然被截斷。請始終提供一個完整的(最小)功能 - 您實際擁有的功能(減去可能無關緊要的東西)。永遠是你的Postgres版本。 –

回答

0

刪除有關TABLE(...)的雙引號。

3

這是不是:

RETURNS TABLE (...) 

或:

RETURNS SETOF sometype 

你有兩種形式的非法組合。看起來你用自定義表定義替換了雙引號類型的名稱。這會工作:

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

電話:

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

Details in the manual.