create or replace PROCEDURE RECURSIVE_RECEITA(
P_CDFILIPROC IN VARCHAR2,
P_CDRECEITA IN VARCHAR2,
P_CDRECEITA_COMP IN VARCHAR2,
P_DSMANUAL IN VARCHAR2,
P_NMCIA IN VARCHAR2,
P_NMFILIAL IN VARCHAR2,
P_NRVERSAO IN NUMBER DEFAULT NULL,
P_NRORG IN NUMBER,
P_CDOPERADOR IN VARCHAR2,
P_NRLISTAERROS IN OUT NUMBER
)
AS
   V_DSRECEITA VARCHAR2(50);
   V_SEQ VARCHAR2(20);
   PROCEDURE INSERE_LISTA_ERROS(P_MENSAGEM IN VARCHAR2)
   AS
      V_SEQ VARCHAR2(20);
   BEGIN
      IF P_MENSAGEM IS NOT NULL THEN
         IF P_NRLISTAERROS IS NULL THEN
            NOVO_CODIGO('LISTAERROS'|| P_CDFILIPROC, V_SEQ);
            P_NRLISTAERROS := TO_NUMBER(V_SEQ);
         END IF;
         INSERT INTO LISTAERROS
         (CDFILIAL, NRLISTA, DSERRO,
          NRORG, NRORGINCLUSAO, NRORGULTATU,
          CDOPERINCLUSAO, CDOPERULTATU,
          DTINCLUSAO, DTULTATU)
         VALUES
         (P_CDFILIPROC, P_NRLISTAERROS, P_MENSAGEM,
          P_NRORG, P_NRORG, P_NRORG,
          P_CDOPERADOR, P_CDOPERADOR,
          SYSDATE, SYSDATE);
      END IF;
   END;
   
BEGIN  
  FOR CUR_SUBREC IN (
    SELECT SUBREC.CDSUBRECEITA, SUBREC.CDRECEITA
      FROM SUBRECEITAM SUBREC
      WHERE SUBREC.CDRECEITA     = P_CDRECEITA
            AND SUBREC.NRORG         = P_NRORG
  ) LOOP
    IF CUR_SUBREC.CDSUBRECEITA = P_CDRECEITA_COMP THEN
      /*BUSCA O NOME DA RECEITA QUE UTILIZA A SUBRECEITA SELECIONADA*/
      SELECT DSRECEITA 
      INTO V_DSRECEITA
      FROM RECEITAM 
      WHERE CDRECEITA = CUR_SUBREC.CDRECEITA;      
      IF P_NRVERSAO IS NULL THEN
        /*Operacao bloqueada. A subreceita e utilizada na composicao da Receita:  $param[0]*/
        INSERE_LISTA_ERROS('APPERRMSGSTR' || 'APP-00075' || '$$' || V_DSRECEITA || '$$' || P_DSMANUAL || '$$' || P_NMCIA || '$$' || P_NMFILIAL || '$$' ||  'APPERRMSGEND');
      ELSE            
        /*Operacao bloqueada. A subreceita e utilizada na composicao da Receita:  $param[0]*/
        INSERE_LISTA_ERROS('APPERRMSGSTR' || 'APP-00161' || '$$' || V_DSRECEITA || '$$' || P_DSMANUAL || '$$' || P_NMCIA || '$$' || P_NMFILIAL || '$$' || TO_CHAR(P_NRVERSAO) || '$$' ||  'APPERRMSGEND');
      END IF;
    ELSE   
      /*BUSCA SUBRECEITAS QUE POSSUEM A SUBRECEITA SELECIONADA --RECURSIVE*/
      RECURSIVE_RECEITA(P_CDFILIPROC, CUR_SUBREC.CDSUBRECEITA, P_CDRECEITA_COMP, P_DSMANUAL, P_NMCIA, P_NMFILIAL, P_NRVERSAO, P_NRORG, P_CDOPERADOR, P_NRLISTAERROS);
    END IF;
  END LOOP; 
  
END RECURSIVE_RECEITA;
/