控制到达功能结束,无需返回

问题描述 投票:0回答:2

我在

PostgreSQL
中有这个函数,当我尝试执行它时,我收到此错误消息:

 ERROR:  control reached end of function without RETURN

CONTEXT:  PL/pgSQL function "SA_PRJ".usp_add_timesheet_record_neww(integer,integer,numeric,numeric,character varying,character varying)

我不确定,但我认为退货是问题所在,最后一定有退货吗?

CREATE OR REPLACE FUNCTION "SA_PRJ".usp_add_timesheet_record_neww(p_uid integer, p_project_id integer, p_allocated_time numeric, p_achieved_time numeric, p_task_desc character varying, p_obs character varying)
  RETURNS character varying AS
$BODY$
declare alloc_id integer;
declare project integer;
declare allocated integer;
declare allocated_time numeric;
BEGIN

    project := p_project_id;

    allocated_time := (SELECT SUM(fld_allocated_time)
    FROM "SD_PRJ".tbl_project_timesheet
    WHERE fld_project_id = project);

    allocated := (SELECT fld_allocated_days FROM "SD_PRJ".tbl_project where fld_id = project);

    if not "SA_ADM".usp_check_permission(p_uid, 'SA_PRJ', 'usp_add_timesheet_record') then
    raise exception 'User ID % nu are permisii pentru aceasta operatie!', p_uid;
    end if;

    select fld_id into alloc_id from "SD_PRJ".tbl_project_allocation where fld_emp_id = p_uid and fld_project_id = p_project_id;

    BEGIN
    IF (allocated > allocated_time) THEN

    INSERT INTO "SD_PRJ".tbl_project_timesheet(fld_emp_id, fld_project_id, fld_is_allocated,fld_allocated_time, fld_achieved_time, fld_task_desc, fld_obs)
    VALUES (p_uid,p_project_id,coalesce(alloc_id,0), p_allocated_time, p_achieved_time,p_task_desc, p_obs);
    RAISE NOTICE 'OK';

    ELSE
        RAISE NOTICE 'Not OK!';
    END IF;
    END;
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

谢谢

sql postgresql stored-procedures postgresql-9.1
2个回答
7
投票

将函数定义为:

CREATE OR REPLACE FUNCTION "SA_PRJ".usp_add_timesheet_record_neww(p_uid integer, p_project_id integer, p_allocated_time numeric, p_achieved_time numeric, p_task_desc character varying, p_obs character varying)
RETURNS void AS
...

或者您使用

RETURN
而不是
RAISE NOTICE
(如果这就是您想要返回的内容)


0
投票

我创建了 PL/pgSQL 函数,它对

RETURNS INTEGER
没有返回任何内容,如下所示:

CREATE FUNCTION my_func() RETURNS INTEGER
AS $$                     -- ↑ Here ↑
BEGIN
END;
$$ LANGUAGE plpgsql;

然后,调用

my_func()
得到了同样的错误,如下所示:

postgres=# SELECT my_func();
ERROR:  control reached end of function without RETURN
CONTEXT:  PL/pgSQL function my_func()

所以,我将

RETURN 2;
设置为
my_func()
,如下所示:

CREATE FUNCTION my_func() RETURNS INTEGER
AS $$
BEGIN
  RETURN 2; -- Here
END;
$$ LANGUAGE plpgsql;

然后,我可以毫无错误地调用

my_func()
,如下所示:

postgres=# SELECT my_func();
 my_func
---------
       2
(1 row)

或者,我将

RETURNS INTEGER
替换为
RETURNS VOID
,如下所示:

CREATE FUNCTION my_func() RETURNS VOID
AS $$                     -- ↑ Here ↑
BEGIN
END;
$$ LANGUAGE plpgsql;

然后,我可以毫无错误地调用

my_func()
,如下所示:

postgres=# SELECT my_func();
 my_func
---------

(1 row)
© www.soinside.com 2019 - 2024. All rights reserved.