Bloco anônimo dá erro ao ser ecxecutado

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

Fiz isso:

Selecionar tudo

DECLARE

    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);
    
    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
    
        vDATAPROC     := SYSDATE;
        vDATACONTROLE := SYSDATE + 0.001;
        
--****************** INÍCIO ROTINA ****************************       
        SP_MONITORAMENTO_TI ('I',
                        VDATACONTROLE,
                        5,
                        13,
                        '');
--******************** FIM ROTINA *****************************
    vPATH := 'C:\arquivos';
    
        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');                                                     
                 --GOTO FIM;
            WHEN UTL_FILE.INVALID_MODE THEN      
                RAISE_APPLICATION_ERROR(-20003,SQLERRM);
        
        END;
        
        vID_REG_AB1CARTA_HEADER := NULL;           
        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;
        
        BEGIN
        
            UTL_FILE.GET_LINE (vFILE_HANDLE_R, vREG);
            
            DBMS_OUTPUT.PUT_LINE(vREG);
        
        END;
        
    END;
e recebo isso, mas o diretório C:\arquivos existe. Abaixo o erro completo

Selecionar tudo

Error starting at line : 2 in command -
DECLARE

    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);

    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

        vDATAPROC     := SYSDATE;
        vDATACONTROLE := SYSDATE + 0.001;

--****************** INÍCIO ROTINA ****************************       
        SP_MONITORAMENTO_TI ('I',
                        VDATACONTROLE,
                        5,
                        13,
                        '');
--******************** FIM ROTINA *****************************
    vPATH := 'C:\arquivos';

        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');                                                     
                 --GOTO FIM;
            WHEN UTL_FILE.INVALID_MODE THEN      
                RAISE_APPLICATION_ERROR(-20003,SQLERRM);

        END;

        vID_REG_AB1CARTA_HEADER := NULL;           
        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;

        BEGIN

            UTL_FILE.GET_LINE (vFILE_HANDLE_R, vREG);

            DBMS_OUTPUT.PUT_LINE(vREG);

        END;

    END;
Error report -
ORA-20001: ORA-29280: invalid directory object
ORA-06512: at line 41
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Tenta criar um DIRECTORY:

Selecionar tudo

CREATE OR REPLACE DIRECTORY seudiretorio AS '/home/oracle/arquivos';
Depois usa esse diretório no seu FOPEN:

Selecionar tudo

vFILE_HANDLE_R := UTL_FILE.FOPEN ( seudiretorio ,'ARQ_CARTA_QUIT_ANUAL.TXT','R');
Um detalhe:
* O diretório é dentro do servidor ORACLE. Não é na sua máquina local.
* O diretório deve ter permissão dada ao usuário ORACLE. (chmod).
* O diretório deve ter sido pre-configurado no parâmetro UTL_FILE_DIR. (Ele designa ao oracle ONDE o usuário pode ler e salvar arquivos).
Veja sobre UTL_FILE_DIR aqui no forum se tiver dúvida.

Era isso!
pnet1
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 73
Registrado em: Qui, 23 Jan 2020 9:12 pm

Uma dúvida, dessa forma não funciona

Selecionar tudo

CREATE OR REPLACE DIRECTORY seudiretorio AS 'C:\Temp';
Não sei se é permissão ou o que
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

O seu servidor Oracle é WINDOWS? Se sim, deve funcionar.
pnet1
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 73
Registrado em: Qui, 23 Jan 2020 9:12 pm

Consegui falar com o DBA nesse fds e me disse que não tenho permissão para isso. Resolvido a questão. Eu não sabia, pois meu líder me disse que tava liberado.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 11 visitantes