Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Willie

Concater String de uma coluna de todos os registros retornados

Recommended Posts

Preciso concatenar um campo que contém a descrição de componentes de um produto, logo:

 

Tabela COMPONENTE+-----------+------------+--------------+| produto   | componente |  descricao   |+-----------+------------+--------------+|  123456   |	 2	  |   PUXADOR	|+-----------+------------+--------------+|  123456   |	 3	  |   CAVILHA	|+-----------+------------+--------------+|  123456   |	 4	  |   TAPA-FURO  |+-----------+------------+--------------+

Como fazer uma consulta que me retorne:

 

+----------------------------------------+|  descricao							 |+----------------------------------------+|   PUXADOR, CAVILHA, TAPA-FURO		  |+----------------------------------------+
Ou seja, a concatenação de strings da coluna descricao de todos os registros selecionados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta, tem como eu aproveitar esta string retornada em uma outra stored procedure chamando esta funcao para cada registro de um cursor criado na procedure e anexar a string ao registro, ou seja, inclui-lo no resultado do cursor?

 

Colunas da consulta apontada pelo cursor da procedure:

+-----------+| produto   |+-----------+|  123456   |+-----------+|  123457   |+-----------+|  123458   |+-----------+
Conteúdo do cursor após anexar a string:

+-----------+-----------------------------+| produto   | descricao				   |+-----------+-----------------------------+|  123456   |  PUXADOR, SAPATA			|+-----------+-----------------------------+|  123457   |  CAVILHA, BORDA, PAINEL	 |+-----------+-----------------------------+|  123458   |  TAPA-FURO				  |+-----------+-----------------------------+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seria criar uma FUNCTION e chama-la no select, a FUNCTION receberia o codigo como parametro

 

CREATE OR REPLACE FUNCTION itens( paramp IN number)

RETURN VARCHAR2 IS

--

-- Retorna uma string

Cursor c1 is Select descricao

From produto

where codigo= paramp;

Saida VARCHAR2(200);

BEGIN

Saida:= ' ';

FOR r1 In c1 LOOP

Saida := saida || r1.descricao;

END LOOP;

RETURN TRIM(Saida);

END;

 

 

select codigo,itens(codigo) itens

from ....

 

ok ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta beleza!Gostaria de saber uma coisinha pra completar este exemplo que me deu...Não sei o tamanho que a string saida vai ficar existe um tipo de dados com alocação dinâmica?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Defina a saida como string limitando o tamanho , se estourar dará erro na rotina , você pode tratar o tamanho pelo comando length.

 

CREATE OR REPLACE FUNCTION itens( paramp IN number)

RETURN VARCHAR2 IS

--

-- Retorna uma string

Cursor c1 is Select descricao

From produto

where codigo= paramp;

Saida VARCHAR2(200);

BEGIN

Saida:= ' ';

FOR r1 In c1 LOOP

if length(saida || r1.descricao) < 200 then

Saida := saida || r1.descricao;

END LOOP;

RETURN TRIM(Saida);

END;

 

 

Uma dica é criar a rotina e testar o pior caso via select (sqlplus por exemplo)

 

select max(length(itens(produto)))

from produto

 

Sabendo o pior caso fica + fácil definir uma solução

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.