Não está fechando com end final, dando erro

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
pnet1
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 73
Registrado em: Qui, 23 Jan 2020 9:12 pm

Corrigi e parece que não tem problemas no fechamaento, mas no END final, fica um "~" vermelho, como se houvesse erro. E tem mais, esse PROC vai ler apenas a primeira linha, o HEADER, mas eu coloquei dentro de um loop. Como eu saio do loop, caso a condição seja satisfeita. Abaixo a PROC:

Selecionar tudo

CREATE OR REPLACE PROCEDURE REG_AB1CARTA_HEADER_INSERT
AS

    vFILE_HANDLE_R                     UTL_FILE.FILE_TYPE;
    vFILE_HANDLE_W                     UTL_FILE.FILE_TYPE;
    vREG                               VARCHAR2(800);
    vRETORNO                           VARCHAR2(800);
    vDATAPROC                          DATE;
    vDATACONTROLE                      DATE;
    vPATH                              VARCHAR2(50);
    vINSERT                            BOOLEAN;
    
    vID_REG_AB1CARTA_HEADER            REG_AB1CARTA_HEADER.ID_REG_AB1CARTA_HEADER%TYPE;
    vAB1_CODREG_H                      REG_AB1CARTA_HEADER.AB1_CODREG_H%TYPE;
    vAB1_SEQREG_H                      REG_AB1CARTA_HEADER.AB1_SEQREG_H%TYPE;
    vAB1_DTPROC_H                      REG_AB1CARTA_HEADER.AB1_DTPROC_H%TYPE;
    vAB1_SEQARQ_H                      REG_AB1CARTA_HEADER.AB1_SEQARQ_H%TYPE;
    vAB1_CODPROG_H                     REG_AB1CARTA_HEADER.AB1_CODPROG_H%TYPE;
    vAB1_CODEMPRE_H                    REG_AB1CARTA_HEADER.AB1_CODEMPRE_H%TYPE;
    vAB1_ANOQUITA_H                    REG_AB1CARTA_HEADER.AB1_ANOQUITA_H%TYPE;
    vAB1_FILLER_H                      REG_AB1CARTA_HEADER.AB1_FILLER_H%TYPE;

BEGIN

    vPATH := 'C:\arquivos';
    vDATAPROC     := SYSDATE;
    vDATACONTROLE := SYSDATE + 0.001;
        
--****************** INÍCIO ROTINA ****************************       
    SP_MONITORAMENTO_TI ('I',
                        VDATACONTROLE,
                        5,
                        13,
                        '');
--******************** FIM ROTINA *****************************
    
    BEGIN
    
        vFILE_HANDLE_R := UTL_FILE.FOPEN (vPATH,'ARQ_CARTA_QUIT_ANUAL.TXT','R');
        vFILE_HANDLE_W := UTL_FILE.FOPEN (vPATH,'ARQ_CARTA_QUIT_ANUAL_' || VDATACONTROLE || '.TXT','W');
        
    EXCEPTION
        WHEN UTL_FILE.INVALID_PATH THEN      
             RAISE_APPLICATION_ERROR(-20001,SQLERRM);
        WHEN UTL_FILE.INVALID_OPERATION THEN
             SP_MONITORAMENTO_TI('E',VDATACONTROLE,5,13,'Arquivo ARQ_CARTA_QUIT_ANUAL.TXT não Encontrado');   
        WHEN UTL_FILE.INVALID_MODE THEN      
            RAISE_APPLICATION_ERROR(-20003,SQLERRM);
    
    END;
    
    LOOP
    
        vAB1_CODREG_H           := NULL;                 
        vAB1_SEQREG_H           := NULL;             
        vAB1_DTPROC_H           := NULL;          
        vAB1_SEQARQ_H           := NULL;            
        vAB1_CODPROG_H          := NULL;             
        vAB1_CODEMPRE_H         := NULL;             
        vAB1_ANOQUITA_H         := NULL;              
        vAB1_FILLER_H           := NULL;
        
        UTL_FILE.GET_LINE (vFILE_HANDLE_R, vREG);                
        vAB1_CODREG_H := SUBSTR(vREG, 1, 1);
        
        IF vAB1_CODREG_H = 0 THEN
        BEGIN
        
           vINSERT         :=  TRUE;
           vAB1_SEQREG_H   :=  SUBSTR(vREG,2,7);
           vAB1_DTPROC_H   :=  SUBSTR(vREG, 10, 10);
           vAB1_SEQARQ_H   :=  SUBSTR(vREG, 21, 7);
           vAB1_CODPROG_H  :=  SUBSTR(vREG, 29, 6);
           vAB1_CODEMPRE_H :=  SUBSTR(vREG, 36, 60);
           vAB1_ANOQUITA_H :=  SUBSTR(vREG, 97, 4); 
           vAB1_FILLER_H   :=  SUBSTR(vREG, 102, 305);
           
           BEGIN
           
               INSERT INTO REG_AB1CARTA_HEADER(
                       ID_REG_AB1CARTA_HEADER,
                       AB1_CODREG_H,
                       AB1_SEQREG_H,
                       AB1_DTPROC_H,
                       AB1_SEQARQ_H,
                       AB1_CODPROG_H,
                       AB1_CODEMPRE_H,
                       AB1_ANOQUITA_H,
                       AB1_FILLER_H)
                    VALUES(
                       REG_AB1CARTA_HEADER_SEQ.NEXTVAL,
                       vAB1_CODREG_H,
                       vAB1_SEQREG_H,
                       vAB1_DTPROC_H,
                       vAB1_SEQARQ_H,
                       vAB1_CODPROG_H,
                       vAB1_CODEMPRE_H,
                       vAB1_ANOQUITA_H,
                       vAB1_FILLER_H);
           
           END;
        
        END;
    
    END LOOP;

END;
/
pnet1
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 73
Registrado em: Qui, 23 Jan 2020 9:12 pm

Foi mal pessoal, é que teva faltando o END IF; Falta de atenção minha, me desculpem a comunidade.
Responder
  • Informação