Julian muito obrigado pela sua ajuda! Tem sido fundamental para o andamento do meu trabalho aqui.
Fiz o package como você falou mas estou com dificuldade de preencher o parametro de resposta com o resultado do select.
Pesquisei e fiz por EXECUTE IMMEDIATE, porém a mesma só apresenta erros . Segue abaixo os códigos:
Selecionar tudo
Package SMP_RESULT_CONSOLIDADO_UNIDADE IS
PROCEDURE SP_RESULT_CONSOLIDADO
(ano IN VARCHAR, grupo IN VARCHAR DEFAULT NULL, unidade IN VARCHAR DEFAULT NULL
, p_rc OUT SMP_RESULT_CONSOLIDADO_UNIDADE.tab_resultado);
TYPE r_resultado IS RECORD(
codigo fb_res_gerencial.codigo%TYPE
,descricao fb_res_gerencial.GERENCIAL%TYPE
,cdmaster fb_res_gerencial.codigo%TYPE
,dsmaster fb_res_gerencial.GERENCIAL%TYPE
,m1 FBG_RES_CONTA.VALOR%TYPE
,m2 FBG_RES_CONTA.VALOR%TYPE
,m3 FBG_RES_CONTA.VALOR%TYPE
,m4 FBG_RES_CONTA.VALOR%TYPE
,m5 FBG_RES_CONTA.VALOR%TYPE
,m6 FBG_RES_CONTA.VALOR%TYPE
,m7 FBG_RES_CONTA.VALOR%TYPE
,m8 FBG_RES_CONTA.VALOR%TYPE
,m9 FBG_RES_CONTA.VALOR%TYPE
,m10 FBG_RES_CONTA.VALOR%TYPE
,m11 FBG_RES_CONTA.VALOR%TYPE
,m12 FBG_RES_CONTA.VALOR%TYPE
,valor_ano FBG_RES_CONTA.VALOR%TYPE
);
TYPE tab_resultado IS TABLE OF r_resultado INDEX BY BINARY_INTEGER;
END;
Selecionar tudo
Package Body SMP_RESULT_CONSOLIDADO_UNIDADE
IS
PROCEDURE SP_RESULT_CONSOLIDADO
(ano IN VARCHAR, grupo IN VARCHAR DEFAULT NULL, unidade IN VARCHAR DEFAULT NULL
, p_rc OUT SMP_RESULT_CONSOLIDADO_UNIDADE.tab_resultado)
IS
str VARCHAR2(3000);
c_str SMP_RESULT_CONSOLIDADO_UNIDADE.r_resultado;
BEGIN
str := 'SELECT RES1.CODIGO AS CODIGO,RES1.GERENCIAL AS DESCRICAO,RES2.CODIGO AS CDMASTER,RES2.GERENCIAL AS DSMASTER'||
' ,SUM(CASE WHEN CONTA.MESANO=''01'||ano||''' THEN decode(nvl(FBGGRCONTA.OPERADOR,''N''),''N'',-1*CONTA.VALOR,CONTA.VALOR) ELSE NULL END) AS M1'||
' ,SUM(CASE WHEN CONTA.MESANO=''02'||ano||''' THEN decode(nvl(FBGGRCONTA.OPERADOR,''N''),''N'',-1*CONTA.VALOR,CONTA.VALOR) ELSE NULL END) AS M2'||
' ,SUM(CASE WHEN CONTA.MESANO=''03'||ano||''' THEN decode(nvl(FBGGRCONTA.OPERADOR,''N''),''N'',-1*CONTA.VALOR,CONTA.VALOR) ELSE NULL END) AS M3'||
' ,SUM(CASE WHEN CONTA.MESANO=''04'||ano||''' THEN decode(nvl(FBGGRCONTA.OPERADOR,''N''),''N'',-1*CONTA.VALOR,CONTA.VALOR) ELSE NULL END) AS M4'||
' ,SUM(CASE WHEN CONTA.MESANO=''05'||ano||''' THEN decode(nvl(FBGGRCONTA.OPERADOR,''N''),''N'',-1*CONTA.VALOR,CONTA.VALOR) ELSE NULL END) AS M5'||
' ,SUM(CASE WHEN CONTA.MESANO=''07'||ano||''' THEN decode(nvl(FBGGRCONTA.OPERADOR,''N''),''N'',-1*CONTA.VALOR,CONTA.VALOR) ELSE NULL END) AS M7'||
' ,SUM(CASE WHEN CONTA.MESANO=''08'||ano||''' THEN decode(nvl(FBGGRCONTA.OPERADOR,''N''),''N'',-1*CONTA.VALOR,CONTA.VALOR) ELSE NULL END) AS M8'||
' ,SUM(CASE WHEN CONTA.MESANO=''09'||ano||''' THEN decode(nvl(FBGGRCONTA.OPERADOR,''N''),''N'',-1*CONTA.VALOR,CONTA.VALOR) ELSE NULL END) AS M9'||
' ,SUM(CASE WHEN CONTA.MESANO=''10'||ano||''' THEN decode(nvl(FBGGRCONTA.OPERADOR,''N''),''N'',-1*CONTA.VALOR,CONTA.VALOR) ELSE NULL END) AS M10'||
' ,SUM(CASE WHEN CONTA.MESANO=''11'||ano||''' THEN decode(nvl(FBGGRCONTA.OPERADOR,''N''),''N'',-1*CONTA.VALOR,CONTA.VALOR) ELSE NULL END) AS M11'||
' ,SUM(CASE WHEN CONTA.MESANO=''12'||ano||''' THEN decode(nvl(FBGGRCONTA.OPERADOR,''N''),''N'',-1*CONTA.VALOR,CONTA.VALOR) ELSE NULL END) AS M12'||
' ,SUM(decode(nvl(FBGGRCONTA.OPERADOR,''N''),''N'',-1*CONTA.VALOR,CONTA.VALOR)) AS VALOR_ANO'||
' FROM'||
' ((fb_res_gerencial RES1 JOIN fb_res_gerencial RES2 ON RES1.CODTOTAL=RES2.CODIGO AND RES1.CODTOTAL IS NOT NULL)'||
' LEFT JOIN FB_DEPA_GERENCIAL DEPA ON DEPA.CODGER=RES1.CODIGO)'||
' JOIN FBG_RES_CONTA CONTA ON CONTA.CODCONTA=DEPA.CODCONTA AND CONTA.RATCOM=DEPA.COMUM'||
' LEFT JOIN SCCUSTO SC ON SC.COD_RED=CONTA.SCC'||
' LEFT JOIN FBGCONTA ON FBGCONTA.CODCONTA=CONTA.CODCONTA'||
' LEFT JOIN FBGGRCONTA ON FBGGRCONTA.CODIGO=FBGCONTA.GRUPO'||
' LEFT JOIN FBGSCCUSTO ON FBGSCCUSTO.CODIGO=SC.COD_RED'||
' WHERE substr(CONTA.mesano,3,4) = '''||ano||''''||
' AND SC.COD_RED NOT IN(SELECT COD_RED FROM FBGSCCOM)'||
' AND FBGSCCUSTO.PRODUTIVO=''S''';
IF(LENGTH(unidade)>0)THEN
str:=str||' AND CONTA.SCC='''||unidade||'''';
END IF;
IF(LENGTH(grupo)>0)THEN
str:=str||' AND SC.CDGRUPOCUS='''||grupo||'''';
END IF;
str:=str||' GROUP BY RES1.CODIGO,RES1.GERENCIAL,RES2.CODIGO,RES2.GERENCIAL'||
' ORDER BY CDMASTER,CODIGO';
EXECUTE IMMEDIATE str INTO c_str;
--ERRO ORA-01007: variable not in select list
--p_rc := TABLE OF c_str INDEX BY BINARY_INTEGER;
--COMO FAÇO PARA PREENCHER O PARAM DE RESPOSTA P_RC?
END;
END;
Muito obrigado novamente pela ajuda!