› Fóruns › SQL e PL/SQL › Ajuda SQL › Ajuda SQL
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