- Este tópico contém 13 respostas, 3 vozes e foi atualizado pela última vez 16 anos, 8 meses atrás por
leo_jf.
-
AutorPosts
-
6 de julho de 2009 às 3:49 pm #87730
Miro
ParticipanteOla, gostaria de uma dica como fazer um loop no script abaixo, ou seja esse script pede uma data de referencia mas gostaria que pedisse a data 5 vezes pois tenho 5 periodos a consultar, ou ate mesmo modificar esse script para pedir 5 periodos de referencia, quem poder me ajudar fico grato
segue escript:
select sum
(case when(r034fun.datadm <= ('&data') and exists(select 1 from r038hfi where r038hfi.numemp = r034fun.numemp and r038hfi.tipcol = r034fun.tipcol and r038hfi.numcad = r034fun.numcad and r038hfi.datalt <= ('&data')) and not exists (select 1 from r038afa where r038afa.numemp = r034fun.numemp and r038afa.tipcol = r034fun.tipcol and r038afa.numcad = r034fun.numcad and r038afa.datafa = (select max(r038afa.datafa) from r038afa, r010sit where r038afa.numemp = r034fun.numemp and r038afa.tipcol = r034fun.tipcol and r038afa.numcad = r034fun.numcad and r038afa.datafa <= ('&data') and r038afa.sitafa = r010sit.codsit and r010sit.tipsit = 7)) and r038hsa.datalt = (select max (datalt) from r038hsa tab3 where tab3.numemp = r038hsa.numemp and tab3.tipcol = r038hsa.tipcol and tab3.numcad = r038hsa.numcad and tab3.datalt <= '&data') and r038hsa.valsal = (select max (valsal) from r038hsa tab4 where tab4.numemp = r038hsa.numemp and tab4.tipcol = r038hsa.tipcol and tab4.numcad = r038hsa.numcad and tab4.datalt <= '&data')) then (r038hsa.valsal) end) from r034fun, r016hie, r010sit, r038hsa, r016orn where r034fun.sitafa = r010sit.codsit and r034fun.taborg = r016orn.taborg and r034fun.numloc = r016orn.numloc and r016hie.taborg = r016orn.taborg and r016hie.numloc = r016orn.numloc and r038hsa.numemp = r034fun.numemp and r038hsa.tipcol = r034fun.tipcol and r038hsa.numcad = r034fun.numcad and r034fun.numemp in (1,2) and r034fun.tipcol = 1 and r034fun.tipcon = 16 de julho de 2009 às 6:26 pm #87735Ishii
ParticipanteOlá,
Uma alternativa se eu entendi direito é colocar um &data diferente para cada caso. Tipo &data1, &data2, etc que ele vai pedir para cada parâmetro um novo valor, desta forma que esta se eu passar somente um (&data) ele será usado para os outros casos.
[]s Ishii
6 de julho de 2009 às 6:49 pm #87736leo_jf
ParticipanteOlas,
Acho que fica mais facil transformar em um bloco anônimo, e usar as variaveis que assim vc não se perde. Para saida dos dados geralmente uso o utl_file.
Ou se achar complicado, faça com o Ishii falou que é bem legal também.
P.s: Usa o plsdeveloper (RAD), que ajuda bem.DECLARE
v_periodo_01 DATE;
v_periodo_02 DATE;
.
.
.BEGIN
sua_query;
END;
Espero que ajude.
[]s6 de julho de 2009 às 7:58 pm #87737Miro
ParticipanteOla, agradeço mas nao entendi muito bem ficaria assim : mas nao rodou
select
sum (case when(r034fun.datadm <= ('&&data1,&&data2') and exists(select 1
from vetorh.r038hfi
where r038hfi.numemp = r034fun.numemp
and r038hfi.tipcol = r034fun.tipcol
and r038hfi.numcad = r034fun.numcad
and r038hfi.datalt <= ('&&data1,&&data2'))
and not exists (select 1from vetorh.r038afa where r038afa.numemp = r034fun.numemp and r038afa.tipcol = r034fun.tipcol and r038afa.numcad = r034fun.numcad and r038afa.datafa = (select max(r038afa.datafa) from vetorh.r038afa, vetorh.r010sit where r038afa.numemp = r034fun.numemp and r038afa.tipcol = r034fun.tipcol and r038afa.numcad = r034fun.numcad and r038afa.datafa <= ('&&data1,&&data2') and r038afa.sitafa = r010sit.codsit and r010sit.tipsit = 7)) and r038hsa.datalt = (select max (datalt) from vetorh.r038hsa tab3 where tab3.numemp = r038hsa.numemp and tab3.tipcol = r038hsa.tipcol and tab3.numcad = r038hsa.numcad and tab3.datalt <= '&&data1,&&data2') and r038hsa.valsal = (select max (valsal) from vetorh.r038hsa tab4 where tab4.numemp = r038hsa.numemp and tab4.tipcol = r038hsa.tipcol and tab4.numcad = r038hsa.numcad and tab4.datalt <= '&&data1,&&data2')) then (r038hsa.valsal) end) from vetorh.r034fun, vetorh.r016hie, vetorh.r010sit, vetorh.r038hsa, vetorh.r016orn where r034fun.sitafa = r010sit.codsit and r034fun.taborg = r016orn.taborg and r034fun.numloc = r016orn.numloc and r016hie.taborg = r016orn.taborg and r016hie.numloc = r016orn.numloc and r038hsa.numemp = r034fun.numemp and r038hsa.tipcol = r034fun.tipcol and r038hsa.numcad = r034fun.numcad and r034fun.numemp in (1,2) and r034fun.tipcol = 1 and r034fun.tipcon = 1[quote="Ishii":3uar8khw]Olá,
Uma alternativa se eu entendi direito é colocar um &data diferente para cada caso. Tipo &data1, &data2, etc que ele vai pedir para cada parâmetro um novo valor, desta forma que esta se eu passar somente um (&data) ele será usado para os outros casos.
[]s Ishii[/quote]
6 de julho de 2009 às 8:04 pm #87738Miro
ParticipanteOLA OBRIGADO, MAS ACREDITO QUE DEVO ESTAR FAZENDO ALGO ERRADO, TENS COMO ME AJUDAR ??? SEGUE
DECLARE
‘&&v_periodo_01’ DATE;
BEGIN
select
sum (case when(r034fun.datadm <= (DATE) and exists(select 1
from vetorh.r038hfi
where r038hfi.numemp = r034fun.numemp
and r038hfi.tipcol = r034fun.tipcol
and r038hfi.numcad = r034fun.numcad
and r038hfi.datalt <= (DATE))
and not exists (select 1from vetorh.r038afa where r038afa.numemp = r034fun.numemp and r038afa.tipcol = r034fun.tipcol and r038afa.numcad = r034fun.numcad and r038afa.datafa = (select max(r038afa.datafa) from vetorh.r038afa, vetorh.r010sit where r038afa.numemp = r034fun.numemp and r038afa.tipcol = r034fun.tipcol and r038afa.numcad = r034fun.numcad and r038afa.datafa <= (DATE) and r038afa.sitafa = r010sit.codsit and r010sit.tipsit = 7)) and r038hsa.datalt = (select max (datalt) from vetorh.r038hsa tab3 where tab3.numemp = r038hsa.numemp and tab3.tipcol = r038hsa.tipcol and tab3.numcad = r038hsa.numcad and tab3.datalt <= DATE) and r038hsa.valsal = (select max (valsal) from vetorh.r038hsa tab4 where tab4.numemp = r038hsa.numemp and tab4.tipcol = r038hsa.tipcol and tab4.numcad = r038hsa.numcad and tab4.datalt <= DATE)) then (r038hsa.valsal) end) from vetorh.r034fun, vetorh.r016hie, vetorh.r010sit, vetorh.r038hsa, vetorh.r016orn where r034fun.sitafa = r010sit.codsit and r034fun.taborg = r016orn.taborg and r034fun.numloc = r016orn.numloc and r016hie.taborg = r016orn.taborg and r016hie.numloc = r016orn.numloc and r038hsa.numemp = r034fun.numemp and r038hsa.tipcol = r034fun.tipcol and r038hsa.numcad = r034fun.numcad and r034fun.numemp in (1,2) and r034fun.tipcol = 1 and r034fun.tipcon = 1END;
[quote="leo_jf":17umn5ad]Olas,
Acho que fica mais facil transformar em um bloco anônimo, e usar as variaveis que assim vc não se perde. Para saida dos dados geralmente uso o utl_file.
Ou se achar complicado, faça com o Ishii falou que é bem legal também.
P.s: Usa o plsdeveloper (RAD), que ajuda bem.DECLARE
v_periodo_01 DATE;
v_periodo_02 DATE;
.
.
.BEGIN
sua_query;
END;
Espero que ajude.
[]s[/quote]6 de julho de 2009 às 9:01 pm #87740Ishii
ParticipanteOlá,
Você vai chamar esta procedure? Ou ela é que tem que te pedir cinco vezes o parâmetro data?
Se for você a chamar a proc… acho melhor chamar cinco vezes mesmo, se não for voce, terá que ser conforme a exemplo do Leo mesmo.
Especifique melhor para nós, assim fica mais fácil entender…
[]s Ishii
[/code]6 de julho de 2009 às 9:04 pm #87742Miro
Participantesim, eu preciso que o script me peça 5 datas diferentes
[quote=”Ishii”:1w82hnq7]Olá,
Você vai chamar esta procedure? Ou ela é que tem que te pedir cinco vezes o parâmetro data?
Se for você a chamar a proc… acho melhor chamar cinco vezes mesmo, se não for voce, terá que ser conforme a exemplo do Leo mesmo.
Especifique melhor para nós, assim fica mais fácil entender…
[]s Ishii
[/code][/quote]6 de julho de 2009 às 9:30 pm #87743Ishii
ParticipanteOlá,
Melhor fazer uma procedure então, pois somente no script do SQL isso seria melhor ser chamado 5 vezes….
[]s Ishii
6 de julho de 2009 às 9:38 pm #87744Miro
Participantevc tem como montar um exemplo com 5 chamadas ????
DECLARE????????
BEGIN
select
sum (case when(r034fun.datadm <= (DATE) and exists(select 1
from vetorh.r038hfi
where r038hfi.numemp = r034fun.numemp
and r038hfi.tipcol = r034fun.tipcol
and r038hfi.numcad = r034fun.numcad
and r038hfi.datalt <= (DATE))
and not exists (select 1from vetorh.r038afa where r038afa.numemp = r034fun.numemp and r038afa.tipcol = r034fun.tipcol and r038afa.numcad = r034fun.numcad and r038afa.datafa = (select max(r038afa.datafa) from vetorh.r038afa, vetorh.r010sit where r038afa.numemp = r034fun.numemp and r038afa.tipcol = r034fun.tipcol and r038afa.numcad = r034fun.numcad and r038afa.datafa <= (DATE) and r038afa.sitafa = r010sit.codsit and r010sit.tipsit = 7)) and r038hsa.datalt = (select max (datalt) from vetorh.r038hsa tab3 where tab3.numemp = r038hsa.numemp and tab3.tipcol = r038hsa.tipcol and tab3.numcad = r038hsa.numcad and tab3.datalt <= DATE) and r038hsa.valsal = (select max (valsal) from vetorh.r038hsa tab4 where tab4.numemp = r038hsa.numemp and tab4.tipcol = r038hsa.tipcol and tab4.numcad = r038hsa.numcad and tab4.datalt <= DATE)) then (r038hsa.valsal) end) from vetorh.r034fun, vetorh.r016hie, vetorh.r010sit, vetorh.r038hsa, vetorh.r016orn where r034fun.sitafa = r010sit.codsit and r034fun.taborg = r016orn.taborg and r034fun.numloc = r016orn.numloc and r016hie.taborg = r016orn.taborg and r016hie.numloc = r016orn.numloc and r038hsa.numemp = r034fun.numemp and r038hsa.tipcol = r034fun.tipcol and r038hsa.numcad = r034fun.numcad and r034fun.numemp in (1,2) and r034fun.tipcol = 1 and r034fun.tipcon = 1END;
[quote="Ishii":4mq9em0q]Olá,
Melhor fazer uma procedure então, pois somente no script do SQL isso seria melhor ser chamado 5 vezes….
[]s Ishii[/quote]
6 de julho de 2009 às 9:58 pm #87746leo_jf
ParticipanteMiro,
Fiz um exemplo como teste aqui e ta ok.
Veja se consegue ai.
Se conseguir, avisa.
[]s
DECLARE
/*
Analista de Sistemas : Leonardo Novais
Analista De Negócios : xxx
Data Criação : xxx
Funcionalidade : xxx
/
/Variáveis para processamento dos dados */v_dt_01 DATE := TO_DATE('01/07/2009','DD/MM/YYYY');
v_dt_02 DATE := TO_DATE('02/07/2009','DD/MM/YYYY');
v_dt_03 DATE := TO_DATE('03/07/2009','DD/MM/YYYY');
v_dt_04 DATE := TO_DATE('04/07/2009','DD/MM/YYYY');
v_dt_05 DATE := TO_DATE('05/07/2009','DD/MM/YYYY');/Area de contexto principal que irá buscar os dados/
CURSOR c_Principal_Miro IS
SELECT
SELECT /*+ all_rows */ SUM
(CASE
WHEN (r034fun.datadm <= (v_dt_01)
AND EXISTS (
SELECT 1
FROM vetorh.r038hfi
WHERE r038hfi.numemp = r034fun.numemp
AND r038hfi.tipcol = r034fun.tipcol
AND r038hfi.numcad = r034fun.numcad
AND r038hfi.datalt <= (v_dt_02))
AND NOT EXISTS (
SELECT 1
FROM vetorh.r038afa
WHERE r038afa.numemp = r034fun.numemp
AND r038afa.tipcol = r034fun.tipcol
AND r038afa.numcad = r034fun.numcad
AND r038afa.datafa =
(SELECT MAX (r038afa.datafa)
FROM vetorh.r038afa, vetorh.r010sit
WHERE r038afa.numemp = r034fun.numemp
AND r038afa.tipcol = r034fun.tipcol
AND r038afa.numcad = r034fun.numcad
AND r038afa.datafa <= (v_dt_03)
AND r038afa.sitafa = r010sit.codsit
AND r010sit.tipsit = 7))
AND r038hsa.datalt =
(SELECT MAX (datalt)
FROM vetorh.r038hsa tab3
WHERE tab3.numemp = r038hsa.numemp
AND tab3.tipcol = r038hsa.tipcol
AND tab3.numcad = r038hsa.numcad
AND tab3.datalt <= v_dt_04)
AND r038hsa.valsal =
(SELECT MAX (valsal)
FROM vetorh.r038hsa tab4
WHERE tab4.numemp = r038hsa.numemp
AND tab4.tipcol = r038hsa.tipcol
AND tab4.numcad = r038hsa.numcad
AND tab4.datalt <= v_dt_05)
)
THEN (r038hsa.valsal)
END
) resultado
FROM vetorh.r034fun,
vetorh.r016hie,
vetorh.r010sit,
vetorh.r038hsa,
vetorh.r016orn
WHERE r034fun.sitafa = r010sit.codsit
AND r034fun.taborg = r016orn.taborg
AND r034fun.numloc = r016orn.numloc
AND r016hie.taborg = r016orn.taborg
AND r016hie.numloc = r016orn.numloc
AND r038hsa.numemp = r034fun.numemp
AND r038hsa.tipcol = r034fun.tipcol
AND r038hsa.numcad = r034fun.numcad
AND r034fun.numemp IN (1, 2)
AND r034fun.tipcol = 1
AND r034fun.tipcon = 1;BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT = "DD/MM/YYYY"';
DBMS_OUTPUT.ENABLE(2000000);
--Area do Unix que irá gravar o arquivo txt com a saida dos dados
v_diretorio := '/diretorio/diretorio2';--Nome do arquivo que sera gerado.
v_out := 'Miro_' || TO_CHAR(SYSDATE, 'YYYYMMDD') || '.txt';
v_arq := UTL_FILE.FOPEN(v_diretorio, v_out, 'W');--Abre o cursor para processamento
FOR reg_Principal_Miro IN c_Principal_Miro LOOPv_line := RPAD(reg_Principal_Miro.resultado, 50);
UTL_FILE.PUT_LINE(v_arq, v_line);
END LOOP; --fim do loop para busca dos dados do cursor Principal_Miro
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;
/
EXIT;
6 de julho de 2009 às 10:12 pm #87747Miro
Participantevc colocou no script em cada seção uma data mas é a mesma data em todas so que quero rode a primeira data mostre o resultado, rode a segunda data e mostre o resultada e assim por diante
[quote=”leo_jf”:305pc76g]Miro,
1
Fiz um exemplo como teste aqui e ta ok.
Veja se consegue ai.
Se conseguir, avisa.
[]s
DECLARE
/*
Analista de Sistemas : Leonardo Novais
Analista De Negócios : xxx
Data Criação : xxx
Funcionalidade : xxx
/
/Variáveis para processamento dos dados */v_dt_01 DATE := TO_DATE('01/07/2009','DD/MM/YYYY');
v_dt_02 DATE := TO_DATE('02/07/2009','DD/MM/YYYY');
v_dt_03 DATE := TO_DATE('03/07/2009','DD/MM/YYYY');
v_dt_04 DATE := TO_DATE('04/07/2009','DD/MM/YYYY');
v_dt_05 DATE := TO_DATE('05/07/2009','DD/MM/YYYY');/Area de contexto principal que irá buscar os dados/
CURSOR c_Principal_Miro IS
SELECT
SELECT /*+ all_rows */ SUM
(CASE
WHEN (r034fun.datadm <= (v_dt_01)
AND EXISTS (
SELECT 1
FROM vetorh.r038hfi
WHERE r038hfi.numemp = r034fun.numemp
AND r038hfi.tipcol = r034fun.tipcol
AND r038hfi.numcad = r034fun.numcad
AND r038hfi.datalt <= (v_dt_02))
AND NOT EXISTS (
SELECT 1
FROM vetorh.r038afa
WHERE r038afa.numemp = r034fun.numemp
AND r038afa.tipcol = r034fun.tipcol
AND r038afa.numcad = r034fun.numcad
AND r038afa.datafa =
(SELECT MAX (r038afa.datafa)
FROM vetorh.r038afa, vetorh.r010sit
WHERE r038afa.numemp = r034fun.numemp
AND r038afa.tipcol = r034fun.tipcol
AND r038afa.numcad = r034fun.numcad
AND r038afa.datafa <= (v_dt_03)
AND r038afa.sitafa = r010sit.codsit
AND r010sit.tipsit = 7))
AND r038hsa.datalt =
(SELECT MAX (datalt)
FROM vetorh.r038hsa tab3
WHERE tab3.numemp = r038hsa.numemp
AND tab3.tipcol = r038hsa.tipcol
AND tab3.numcad = r038hsa.numcad
AND tab3.datalt <= v_dt_04)
AND r038hsa.valsal =
(SELECT MAX (valsal)
FROM vetorh.r038hsa tab4
WHERE tab4.numemp = r038hsa.numemp
AND tab4.tipcol = r038hsa.tipcol
AND tab4.numcad = r038hsa.numcad
AND tab4.datalt <= v_dt_05)
)
THEN (r038hsa.valsal)
END
) resultado
FROM vetorh.r034fun,
vetorh.r016hie,
vetorh.r010sit,
vetorh.r038hsa,
vetorh.r016orn
WHERE r034fun.sitafa = r010sit.codsit
AND r034fun.taborg = r016orn.taborg
AND r034fun.numloc = r016orn.numloc
AND r016hie.taborg = r016orn.taborg
AND r016hie.numloc = r016orn.numloc
AND r038hsa.numemp = r034fun.numemp
AND r038hsa.tipcol = r034fun.tipcol
AND r038hsa.numcad = r034fun.numcad
AND r034fun.numemp IN (1, 2)
AND r034fun.tipcol = 1
AND r034fun.tipcon = 1;BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT = "DD/MM/YYYY"';
DBMS_OUTPUT.ENABLE(2000000);
--Area do Unix que irá gravar o arquivo txt com a saida dos dados
v_diretorio := '/diretorio/diretorio2';--Nome do arquivo que sera gerado.
v_out := 'Miro_' || TO_CHAR(SYSDATE, 'YYYYMMDD') || '.txt';
v_arq := UTL_FILE.FOPEN(v_diretorio, v_out, 'W');--Abre o cursor para processamento
FOR reg_Principal_Miro IN c_Principal_Miro LOOPv_line := RPAD(reg_Principal_Miro.resultado, 50);
UTL_FILE.PUT_LINE(v_arq, v_line);
END LOOP; --fim do loop para busca dos dados do cursor Principal_Miro
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;
/
EXIT;
[/quote]6 de julho de 2009 às 11:28 pm #87749leo_jf
ParticipanteSaquei.Mas é fácil!!!
O jeito mais facil seria você abrir o for… n vezes que quiser. Fixar a data para cada For ( como o For abre e fecha internamente vc nao precisa se preocupar).
Testei aqui e funcionou, mas com certeza não é o melhor jeito para fazer.
Segue, veja se consegue.
Lembrar que você só ira fechar o utl_file uma única vez para ser gerado apenas um arquivo com tantas linhas forem necessárias de cada cursor.
DECLARE
/*
Analista de Sistemas : Leonardo Novais
Analista De Negócios : xxx
Data Criação : xxx
Funcionalidade : xxx
/
/Variáveis para processamento dos dados */v_dt DATE;
/Area de contexto principal que irá buscar os dados/
CURSOR c_Principal_Miro IS
SELECT
SELECT /*+ all_rows */ SUM
(CASE
WHEN (r034fun.datadm <= (v_dt)
AND EXISTS (
SELECT 1
FROM vetorh.r038hfi
WHERE r038hfi.numemp = r034fun.numemp
AND r038hfi.tipcol = r034fun.tipcol
AND r038hfi.numcad = r034fun.numcad
AND r038hfi.datalt <= (v_dt))
AND NOT EXISTS (
SELECT 1
FROM vetorh.r038afa
WHERE r038afa.numemp = r034fun.numemp
AND r038afa.tipcol = r034fun.tipcol
AND r038afa.numcad = r034fun.numcad
AND r038afa.datafa =
(SELECT MAX (r038afa.datafa)
FROM vetorh.r038afa, vetorh.r010sit
WHERE r038afa.numemp = r034fun.numemp
AND r038afa.tipcol = r034fun.tipcol
AND r038afa.numcad = r034fun.numcad
AND r038afa.datafa <= (v_dt)
AND r038afa.sitafa = r010sit.codsit
AND r010sit.tipsit = 7))
AND r038hsa.datalt =
(SELECT MAX (datalt)
FROM vetorh.r038hsa tab3
WHERE tab3.numemp = r038hsa.numemp
AND tab3.tipcol = r038hsa.tipcol
AND tab3.numcad = r038hsa.numcad
AND tab3.datalt <= v_dt)
AND r038hsa.valsal =
(SELECT MAX (valsal)
FROM vetorh.r038hsa tab4
WHERE tab4.numemp = r038hsa.numemp
AND tab4.tipcol = r038hsa.tipcol
AND tab4.numcad = r038hsa.numcad
AND tab4.datalt <= v_dt)
)
THEN (r038hsa.valsal)
END
) resultado
FROM vetorh.r034fun,
vetorh.r016hie,
vetorh.r010sit,
vetorh.r038hsa,
vetorh.r016orn
WHERE r034fun.sitafa = r010sit.codsit
AND r034fun.taborg = r016orn.taborg
AND r034fun.numloc = r016orn.numloc
AND r016hie.taborg = r016orn.taborg
AND r016hie.numloc = r016orn.numloc
AND r038hsa.numemp = r034fun.numemp
AND r038hsa.tipcol = r034fun.tipcol
AND r038hsa.numcad = r034fun.numcad
AND r034fun.numemp IN (1, 2)
AND r034fun.tipcol = 1
AND r034fun.tipcon = 1;BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT = "DD/MM/YYYY"';
DBMS_OUTPUT.ENABLE(2000000);
--Area do Unix que irá gravar o arquivo txt com a saida dos dados
v_diretorio := '/diretorio/diretorio2';--Nome do arquivo que sera gerado.
v_out := 'Miro_' || TO_CHAR(SYSDATE, 'YYYYMMDD') || '.txt';
v_arq := UTL_FILE.FOPEN(v_diretorio, v_out, 'W');--Abre o cursor para processamento
FOR reg_Principal_Miro IN c_Principal_Miro LOOP
v_dt := TO_DATE('01/07/2009','DD/MM/YYYY');
v_line := RPAD(reg_Principal_Miro.resultado, 50);
UTL_FILE.PUT_LINE(v_arq, v_line);
END LOOP; --fim do loop para busca dos dados do cursor Principal_Miro
FOR reg_Principal_Miro IN c_Principal_Miro LOOP
v_dt := TO_DATE('02/07/2009','DD/MM/YYYY');
v_line := RPAD(reg_Principal_Miro.resultado, 50);
UTL_FILE.PUT_LINE(v_arq, v_line);
END LOOP; --fim do loop para busca dos dados do cursor Principal_Miro
FOR reg_Principal_Miro IN c_Principal_Miro LOOP
v_dt := TO_DATE('03/07/2009','DD/MM/YYYY');
v_line := RPAD(reg_Principal_Miro.resultado, 50);
UTL_FILE.PUT_LINE(v_arq, v_line);
END LOOP; --fim do loop para busca dos dados do cursor Principal_Miro
FOR reg_Principal_Miro IN c_Principal_Miro LOOP
v_dt := TO_DATE('04/07/2009','DD/MM/YYYY');
v_line := RPAD(reg_Principal_Miro.resultado, 50);
UTL_FILE.PUT_LINE(v_arq, v_line);
END LOOP; --fim do loop para busca dos dados do cursor Principal_Miro
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;
/
EXIT;
7 de julho de 2009 às 7:40 pm #87776Miro
Participantecerto, mas vc tem como fazer o script sem salvar somente listando em tela ??
[quote=”leo_jf”:3infodo0]Saquei.Mas é fácil!!!
O jeito mais facil seria você abrir o for… n vezes que quiser. Fixar a data para cada For ( como o For abre e fecha internamente vc nao precisa se preocupar).
Testei aqui e funcionou, mas com certeza não é o melhor jeito para fazer.
Segue, veja se consegue.
Lembrar que você só ira fechar o utl_file uma única vez para ser gerado apenas um arquivo com tantas linhas forem necessárias de cada cursor.
DECLARE
/*
Analista de Sistemas : Leonardo Novais
Analista De Negócios : xxx
Data Criação : xxx
Funcionalidade : xxx
/
/Variáveis para processamento dos dados */v_dt DATE;
/Area de contexto principal que irá buscar os dados/
CURSOR c_Principal_Miro IS
SELECT
SELECT /*+ all_rows */ SUM
(CASE
WHEN (r034fun.datadm <= (v_dt)
AND EXISTS (
SELECT 1
FROM vetorh.r038hfi
WHERE r038hfi.numemp = r034fun.numemp
AND r038hfi.tipcol = r034fun.tipcol
AND r038hfi.numcad = r034fun.numcad
AND r038hfi.datalt <= (v_dt))
AND NOT EXISTS (
SELECT 1
FROM vetorh.r038afa
WHERE r038afa.numemp = r034fun.numemp
AND r038afa.tipcol = r034fun.tipcol
AND r038afa.numcad = r034fun.numcad
AND r038afa.datafa =
(SELECT MAX (r038afa.datafa)
FROM vetorh.r038afa, vetorh.r010sit
WHERE r038afa.numemp = r034fun.numemp
AND r038afa.tipcol = r034fun.tipcol
AND r038afa.numcad = r034fun.numcad
AND r038afa.datafa <= (v_dt)
AND r038afa.sitafa = r010sit.codsit
AND r010sit.tipsit = 7))
AND r038hsa.datalt =
(SELECT MAX (datalt)
FROM vetorh.r038hsa tab3
WHERE tab3.numemp = r038hsa.numemp
AND tab3.tipcol = r038hsa.tipcol
AND tab3.numcad = r038hsa.numcad
AND tab3.datalt <= v_dt)
AND r038hsa.valsal =
(SELECT MAX (valsal)
FROM vetorh.r038hsa tab4
WHERE tab4.numemp = r038hsa.numemp
AND tab4.tipcol = r038hsa.tipcol
AND tab4.numcad = r038hsa.numcad
AND tab4.datalt <= v_dt)
)
THEN (r038hsa.valsal)
END
) resultado
FROM vetorh.r034fun,
vetorh.r016hie,
vetorh.r010sit,
vetorh.r038hsa,
vetorh.r016orn
WHERE r034fun.sitafa = r010sit.codsit
AND r034fun.taborg = r016orn.taborg
AND r034fun.numloc = r016orn.numloc
AND r016hie.taborg = r016orn.taborg
AND r016hie.numloc = r016orn.numloc
AND r038hsa.numemp = r034fun.numemp
AND r038hsa.tipcol = r034fun.tipcol
AND r038hsa.numcad = r034fun.numcad
AND r034fun.numemp IN (1, 2)
AND r034fun.tipcol = 1
AND r034fun.tipcon = 1;BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT = "DD/MM/YYYY"';
DBMS_OUTPUT.ENABLE(2000000);
--Area do Unix que irá gravar o arquivo txt com a saida dos dados
v_diretorio := '/diretorio/diretorio2';--Nome do arquivo que sera gerado.
v_out := 'Miro_' || TO_CHAR(SYSDATE, 'YYYYMMDD') || '.txt';
v_arq := UTL_FILE.FOPEN(v_diretorio, v_out, 'W');--Abre o cursor para processamento
FOR reg_Principal_Miro IN c_Principal_Miro LOOP
v_dt := TO_DATE('01/07/2009','DD/MM/YYYY');
v_line := RPAD(reg_Principal_Miro.resultado, 50);
UTL_FILE.PUT_LINE(v_arq, v_line);
END LOOP; --fim do loop para busca dos dados do cursor Principal_Miro
FOR reg_Principal_Miro IN c_Principal_Miro LOOP
v_dt := TO_DATE('02/07/2009','DD/MM/YYYY');
v_line := RPAD(reg_Principal_Miro.resultado, 50);
UTL_FILE.PUT_LINE(v_arq, v_line);
END LOOP; --fim do loop para busca dos dados do cursor Principal_Miro
FOR reg_Principal_Miro IN c_Principal_Miro LOOP
v_dt := TO_DATE('03/07/2009','DD/MM/YYYY');
v_line := RPAD(reg_Principal_Miro.resultado, 50);
UTL_FILE.PUT_LINE(v_arq, v_line);
END LOOP; --fim do loop para busca dos dados do cursor Principal_Miro
FOR reg_Principal_Miro IN c_Principal_Miro LOOP
v_dt := TO_DATE('04/07/2009','DD/MM/YYYY');
v_line := RPAD(reg_Principal_Miro.resultado, 50);
UTL_FILE.PUT_LINE(v_arq, v_line);
END LOOP; --fim do loop para busca dos dados do cursor Principal_Miro
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;
/
EXIT;
[/quote]7 de julho de 2009 às 10:41 pm #87781leo_jf
ParticipanteMiro,
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/2009Lembrar 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 -
AutorPosts
- Você deve fazer login para responder a este tópico.