Busca de varias linhas de uma tabela

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
leo_jf
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Qua, 05 Dez 2007 1:37 pm
Localização: rio de janeiro

Boa Tarde,

Tenho uma tabela com vários registros, por data.
Exemplo:
data tipo
07/06/2010 CAIXA 1
07/06/2010 CAIXA 5
07/06/2010 CAIXA 5
07/06/2010 CAIXA 2
07/06/2010 CAIXA 1
08/06/2010 CAIXA 1
08/06/2010 CAIXA 3
08/06/2010 CAIXA 3

Preciso gerar um relatório agrupado por dia.
Exemplo da saida dbsm_output.
dia tipos
07/06/2010 CAIXA 1;CAIXA 5;CAIXA 5;CAIXA 2;CAIXA 1;
08/06/2010 CAIXA 1;CAIXA 3;CAIXA 3;

Alguém sabe como faço isso? Pensei em um vetor, mas acho que não estou conseguindo usar corretamente, pois não consigo
agrupar por dia.

Qualquer ajuda é bem vinda. Obrigado.
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

Poderia fazer uma procedure que dentro dela teria um cursor, nesse cursor você vai passando sempre dia a dia e então montando sua saida..

tem varias soluções..
leo_jf
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Qua, 05 Dez 2007 1:37 pm
Localização: rio de janeiro

beleza Diego,

Poderia me dar um exemplo de uma procedure?
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

leo_jf
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Qua, 05 Dez 2007 1:37 pm
Localização: rio de janeiro

beleza Vitor,
Exemplo de procedure com as condições que defini, na verdade.
Ainda não visualizei como fazer esse processamento dentro da procedure.
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

posta o nome da tabela e as colunas...
da pra montar uma estrutura mais facil pra você visualizar...
vou escrever meio de cabeca ai... to sem tempo agora cara, espero que ajude

Selecionar tudo

create or replace procedure PGERACAIXA IS

  cursor cur_caixas (iDia in Date) is
    select que você postou no exemplo as caixa,
              coluna_diames as diames
      from dual;

  cursor cur_diames loop
    select pegando todos os dias que tem movimento de caixa, para passar como parametro para o outro cursor,

  mensagem   varchar2(32000);

begin

  for x in cur_diames loop

   mensagem := null;

   for i in cur_caixas (x.diames) LOOP
     if (mensagem is null) then 
       mensagem := 'xxx';
       dbms_output.put_line('Dia: '||i.diames);
       dbms_output.pt_line('caixa: '||i.caixa);
     else
       dbms_output.put(i.caixa);
     end if;
  end loop;

como disse da pra fazer de varias formas, essa escrevi rapidamente aqui pra passar a ideia, que seria percorrer dia a dia e ir montando a saida, ai no cursor dos dias_mês você considera o periodo que você montar a saida...
dudu0566
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 74
Registrado em: Seg, 06 Ago 2007 3:59 pm
Localização: Campinas - SP
Eduardo Gomes

leo_jf não sei se você já resolveu seu problema, mas segue uma alternativa para resolve-lo:

-- criação da tabela para simular sua situação

Selecionar tudo

create table t_teste (
data date,
tipo varchar2(15)
);
--inserção dos dados conforme postado no fórum

Selecionar tudo

insert into t_teste values (to_date('07/06/2010','dd/mm/rrrr'),'CAIXA 1');
insert into t_teste values (to_date('07/06/2010','dd/mm/rrrr'),'CAIXA 5');
insert into t_teste values (to_date('07/06/2010','dd/mm/rrrr'),'CAIXA 5');
insert into t_teste values (to_date('07/06/2010','dd/mm/rrrr'),'CAIXA 2');
insert into t_teste values (to_date('07/06/2010','dd/mm/rrrr'),'CAIXA 1');
insert into t_teste values (to_date('08/06/2010','dd/mm/rrrr'),'CAIXA 1');
insert into t_teste values (to_date('08/06/2010','dd/mm/rrrr'),'CAIXA 3');
insert into t_teste values (to_date('08/06/2010','dd/mm/rrrr'),'CAIXA 3');
--select que traz o resultado conforme solicitado
--pode no caso, criar uma view para seu relatório

Selecionar tudo

 select data,  
        substr(max(replace(sys_connect_by_path(tipo, '|')
                          , '|'
                          , '; ' /*delimitador*/
                          )
                  )/*max para agrupar*/
              ,3 /*length do delimitador +1 = [length('; ') + 1] */
              ) string_concatenada /*substr para eliminar o delimitador no início do registro*/
   from (
          select a.*
                ,row_number() over (partition by a.data order by a.data, a.tipo) row#
            from t_teste a) 
start with row# = 1
connect by prior data = data
and prior row# = row#-1
group by data
order by data;

--resultado
"DATA" "STRING_CONCATENADA"
1 07/06/10 "CAIXA 1; CAIXA 1; CAIXA 2; CAIXA 5; CAIXA 5"
2 08/06/10 "CAIXA 1; CAIXA 3; CAIXA 3"


veja ai se atende sua necessidade, e qualquer dúvida posta ai...

espero ter ajudado!!!!
Responder
  • Informação