В коде, показанном в вопросе, имеется более одной ошибки.
Вы используете локальную процедуру , то есть имя процедуры, объявленной внутри другой процедуры.
Локальные процедуры работают нормально при правильном использовании.
Некоторые предложения по успешной компиляции:
declare procedure
должно появляться перед любыми исполняемыми операторами или новымиblock в вызывающей процедуре.
Переместите оператор SET V_PROC = 'SP_DASH_CALENDARIO'
так, чтобы он появлялся перед CALL в локальной процедуре (или в любом месте блока главной процедуры ПОСЛЕ всех объявлений (в том числе после объявления). локальная процедура).
Кроме того, удалите BEGIN (и соответствующий END) в строке перед DECLARE PROCEDURE
. Вы хотите, чтобы все объявления объявлялись до any исполняемый оператор или новый блок начала и конца.
имя локальной процедуры должно быть неквалифицированным и в DECLARE и в CALL but вы используете квалификатор в вашем операторе CALL, который не позволит Db2 найти локальную процедуру.
последняя часть вашей процедуры будет выглядеть примерно так, как показано ниже:
...snip...
DECLARE V_SUM_VAL_ICMSZFMREPORTADO ANCHOR DATA TYPE TO DMTLDBR.TB_FATO_VENDASDIARIO.VAL_ICMSZFMREPORTADO;
DECLARE V_PROC ANCHOR DATA TYPE TO DMTLDBR.TB_TMP_LOG_EXECUTION_PROC.SYNCPOINT_PROC;
-- =========================================================================================================
-- P R O C P R O C U R A _ D I A _ U T I L _ P O S T _ D I A 1
--
-- OBTEM O PRIMEIRO DIA ÚTIL DO MÊS (QUE NÃO SEJA DOMINGO NEM FERIADO)
--
-- =========================================================================================================
DECLARE PROCEDURE PROCURA_DIA_UTIL_POST_DIA1(IN P_ID_MES INTEGER)
BEGIN
DECLARE V_ACHOU DECIMAL(1) DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND BEGIN END;
SET V_ID_DIA = NULL;
L1: LOOP -- (LP01)
BEGIN -- (BE02.)
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' BEGIN END;
SELECT MIN(ID_DIA) INTO V_ID_DIA
FROM DMTLDBR.TB_DIM_DIADIA
WHERE ID_MES = P_ID_MES
AND ID_DIASEMANA <> 1 -- DOMINGO
AND FLG_HOLIDAY = 0;
END; -- (BE02.)
IF SQLSTATE = '00000' THEN
LEAVE L1;
--SET V_ACHOU = 1;
END IF;
END LOOP L1; -- (LP01.)
END;
SET V_PROC = 'SP_DASH_CALENDARIO';
CALL PROCURA_DIA_UTIL_POST_DIA1(201909);
END@