2014-11-13 2 views
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; 

Благодаря

+2

Как сказано в сообщении об ошибке, вы определили возвращаемое значение, и в вашей функции нет возврата. – Robert

ответ

2

Либо определяют функцию, как:

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

Я использовал RETURN insted из RAISE NOTICE.Thanks @Robert – Alienware

+0

Это также происходит, когда вы пытаетесь вернуть значение до конца родительской или одиночной транзакции, поэтому сначала выполните дочернюю транзакцию, а затем верните и завершите начальный блок родителя. как это показано ниже. Объявление начало save: = false; - код для инициализации начало - Код для детской транзакции save: = true; ИСКЛЮЧЕНИЕ КОГДА NO_DATA_FOUND THEN УВЕДОМЛЕНИЕ ОБ ИЗМЕНЕНИИ «Не найдено записей!»; Commit; \t \t \t конец; \t \t \t \t return save; \t \t конец; – Ankur

Смежные вопросы