Pular para o conteúdo

Fóruns SQL e PL/SQL Ajuda SQL Ajuda SQL

#87781
leo_jf
Participante

    Miro,

    Teve alguns erros que não percebi no script, quando postei.
    Peço desculpas a todos pelo erro, que não irá acontecer novamente.
    Segue erros e correção:

    1) Faltou as variaveis para geração da saida do arquivo.
    2) Havia dois selects no cursor
    3) a variavel v_data deve estar ANTES do LOOP e não dentro, pois dentro não ira buscar as datas diferentes.

    Segue um teste que fiz e dados que foram gerados. Veja se agora te ajuda ou, se caso já tenha resolvido o problema, por favor, postar.

    DECLARE

    v_dt DATE;
    v_out VARCHAR2(250);
    v_line VARCHAR2(1000);
    v_diretorio VARCHAR2(250);
    v_arq UTL_FILE.FILE_TYPE;

    CURSOR c_acesso IS

    SELECT matr, data
    FROM acesso aces
    WHERE aces.matr = 99999999
    AND aces.data = v_dt;

    BEGIN

    EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT = "DD/MM/YYYY"';

    DBMS_OUTPUT.ENABLE(2000000);

    v_diretorio := '/leonardo/saida';

    v_out := 'Miro_' || TO_CHAR(SYSDATE, 'YYYYMMDD') || '.txt';
    v_arq := UTL_FILE.FOPEN(v_diretorio, v_out, 'W');

    v_dt := TO_DATE('01/07/2009','DD/MM/YYYY');

    FOR reg_acesso IN c_acesso LOOP

    v_line := RPAD(reg_acesso.matr, 10) || ' ' ||
    RPAD(reg_acesso.data, 10);

    UTL_FILE.PUT_LINE(v_arq, v_line);

    END LOOP;

    v_dt := TO_DATE('04/06/2009','DD/MM/YYYY');

    FOR reg_acesso IN c_acesso LOOP

    v_line := RPAD(reg_acesso.matr, 10) || ' ' ||
    RPAD(reg_acesso.data, 10);

    UTL_FILE.PUT_LINE(v_arq, v_line);

    END LOOP;

    UTL_FILE.FCLOSE(v_arq);

    --Tratamento das exceções, caso ocorram.

    EXCEPTION 
    
        WHEN UTL_FILE.INVALID_PATH THEN 
            DBMS_OUTPUT.PUT_LINE('Caminho inválido para gravação do arquivo *.txt'); 
            UTL_FILE.FCLOSE(v_arq); 
    
        WHEN UTL_FILE.READ_ERROR THEN 
            DBMS_OUTPUT.PUT_LINE('Erro durante a leitura.'); 
            UTL_FILE.FCLOSE(v_arq); 
    
        WHEN UTL_FILE.WRITE_ERROR THEN 
            DBMS_OUTPUT.PUT_LINE('Erro durante a escrita.'); 
            UTL_FILE.FCLOSE(v_arq); 
    
        WHEN UTL_FILE.ACCESS_DENIED THEN 
            DBMS_OUTPUT.PUT_LINE('Acesso ao arquivo negado - Consultar privilégios.'); 
            UTL_FILE.FCLOSE(v_arq); 
    
        WHEN UTL_FILE.FILE_OPEN THEN 
            DBMS_OUTPUT.PUT_LINE('Arquivo já esta aberto para processamento.'); 
            UTL_FILE.FCLOSE(v_arq); 
    
        WHEN UTL_FILE.INVALID_MAXLINESIZE THEN 
            DBMS_OUTPUT.PUT_LINE('Limite de linha excedeu os 32K - Consultar DBA.'); 
            UTL_FILE.FCLOSE(v_arq); 
    
        WHEN UTL_FILE.INTERNAL_ERROR THEN 
            DBMS_OUTPUT.PUT_LINE('Erro interno do Oracle.'); 
            UTL_FILE.FCLOSE(v_arq);  
    
        WHEN OTHERS THEN 
            DBMS_OUTPUT.PUT_LINE('Erro não tratado.Consultar Analista Responsável ' || 
            TRANSLATE(SUBSTR(SQLERRM,1,100),'()','  ')); 
            UTL_FILE.FCLOSE(v_arq); 
    

    END;

    Saida gerada:

    99999999 01/07/2009
    99999999 04/06/2009

    Lembrar que o numero de dadas que quiser, vc deve repetir o bloco: “v_data e for”, e que existem outras maneiras melhores para se fazer esse processamento, essa é uma delas ( que não é a melhor, apenas um quebra galho).
    []s