2017-05-09 48 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.