Como Substituir LISTAGG e DECODE por JOIN.

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
leonardo.silva
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Sáb, 12 Mar 2016 5:38 pm

Ola pessoal boa noite!

Seguinte, tenho uma procedure onde existe esse select abaixo que retorna 4 colunas, sendo que a ultima com o nome "FAMILIAR" que tem o resultado de um de decode,
feito a partir da variavel "decodeVALUE" que atribui o valor de um select usando o LISTAGG.

Selecionar tudo

             sql_select_stmt := 'SELECT p.id_prot, p.MATRICULA, p.documento' ;
    
    -- Decode FAMILIAR: starting from code into descr
    SELECT LISTAGG(KEY||','''||VALUE||'''', ',') WITHIN GROUP (ORDER BY KEY) INTO decodeVALUE FROM TB_CONFIGURACAO WHERE GRUPO='FAMILIAR';
    sql_select_stmt := sql_select_stmt || ',DECODE(p.FAMILIAR,'||decodeVALUE||',p.FAMILIAR) AS FAMILIAR';

O problema é que o LISTAGG tem um limite para concatenar valores, e no momento esta estorando esse limite, minha solução é,
não usar mais o LISTAGG e ao invés de fazer o decode usar JOIN, só que estou sem ideia agora como montar, se alguém poder me ajudar agradeço.

A tabela que é feito o decode é: TB_PROTOCOLO p.
Segue o select abaixo:

Selecionar tudo

SELECT MONTATO É ESSE: SELECT p.id_prot, p.MATRICULA, p.documento,DECODE(p.FAMILIAR,1,'Chamado aberto',2,'Cliente atendido',3,'Cliente Atendido',p.FAMILIAR) as FAMILIAR
        

RESULTADO QUE GERA HOJE:

Selecionar tudo

	ID_PROT              MATRICULA      DOCUMENTO      FAMILIAR                               
-------------------- ----------- -------------- ----------------------------------------
	12349                   11111111         321321         Chamado aberto
	21                        99999               99999          Chamado aberto
	22                        99999               99999          Chamado aberto
	23                        99999               99999          Chamado aberto
	24                        99999               99999          Chamado aberto
	12                        999923344        12345          7 

Obrigado
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

Acho que você pode usar PIVOT pra isso. E depois concatenar as linhas.
http://www.oraclehome.com.br/2011/11/09 ... m-colunas/

É possível usar DECODE também, aqui no forum tem vários exemplos de CROSSTAB:
http://glufke.net/oracle/viewtopic.php?t=1651

Depois de transformar em colunas, é só juntar tudo na mesma linha.
Responder
  • Informação
  • Quem está online

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