[firebase-br] select para retornar o nome e valor dos campos de uma tabela.
Kelver Merlotti
kmerlotti em gmail.com
Qua Set 8 10:36:39 -03 2010
Bom Saulo, como é uma tabela de parâmetros, estou assumindo que ela
tenha somente um registro. Sendo assim, minha sugestão é:
create or alter procedure CAMPOS_TABELA(tabela varchar(30))
RETURNS (CAMPO VARCHAR(30), VALOR VARCHAR(100)) as
declare variable nome_campo varchar(30) = '';
declare variable valor_campo varchar(100) = '';
BEGIN
--Percorre os campos da tabela
FOR SELECT RDB$FIELD_NAME FROM RDB$RELATION_FIELDS WHERE
RDB$RELATION_NAME = :tabela INTO :nome_campo DO
--Para cada campo da tabela, faz um select para recuperar o valor
FOR EXECUTE STATEMENT
'SELECT FIRST 1 ' || nome_campo || ' FROM ' || tabela INTO :valor_campo DO
BEGIN
CAMPO = nome_campo;
VALOR = valor_campo;
Suspend;
END
END;
Aí para usar você faria algo como:
SELECT * FROM CAMPOS_TABELA('TB_PARAMETROS');
Obs. 1: este código não é muito otimizado com relação à performance,
pois ele fará um select para cada campo e, na lógica, abrir os dois
selects em cursores separados com todos os campos e trabalhar com eles
em paralelo seria melhor. Porém, até onde sei isso não é possível no
Firebird.
Obs. 2: se sua tabela tiver mais de um registro, terá de estudar
melhor o que fazer com o segundo select, onde utilizei um FIRST 1!
Abraço!
Kelver Merlotti
Coordenador Editorial do Portal www.ActiveDelphi.com.br
Contato: kelver em activedelphi.com.br
Google: kmerlotti em gmail.com
Twitter: http://twitter.com/kmerlotti
Tem um segundo? Então, dá uma olhadinha nisso:
Um site de publicidades, de Portugal, está pagando em euros (quase 3x
mais que em reais) pra quem estiver disposto a:
* Ler anúncios
* Visitar sites
* Clicar em banners
* Navegar na NET
* Ler e-mails
* Convidar novos usuários
O pagamento pode ser feito de várias formas!
Registra lá. Não custa nada!!! ;-)
http://www.publipt.com/pages/index.php?refid=kmerlotti
2010/9/8 Saulo Mendes <saulo em gigatron.com.br>:
> Bom dia Kelver, obrigado pela ajuda.
>
> vou explicar melhor o que estou precisando:
>
> Eu tenho uma tabela de parametros que tem vários campos, e de vez em quando
> é acrecentado novos campos.
> O que estou precisando de uma forma dinamica de me travez as informações
> desta tabela com os nomes e valores dos campos.
> Exemplo:
>
> Tabela parametro.
>
> CAMPO | VALOR |
> --------------------------------
> IMP_RECIBO | 1 |
> --------------------------------
> MENSAGEM | OBRIGADO |
> --------------------------------
> MENSAGEM2 | VOLTE SEMPRE |
> --------------------------------
>
> ex.da sql : select field as nome_do_campo, value as valor_do_campo from
> TABELA
>
> ex. do resultado da sql.
>
> nome_do_campo | valor_do_campo |
> --------------------------------
> IMP_RECIBO | 1 |
> --------------------------------
> MENSAGEM | OBRIGADO |
> --------------------------------
> MENSAGEM2 | VOLTE SEMPRE |
> --------------------------------
>
> obs. gostaria se fosse dinamica para não precisar mexer nesse código toda
> vez que for acrescentado um novo campo.
>
> Atenciosamente,
> --------------------------------------------------------------------------------
> Saulo Mendes
> Programador Delphi Pleno
> Gigatron Tecnologia Ltda ME
> www.gigatron.com.br
>
> ----- Original Message -----
> From: "Kelver Merlotti" <kmerlotti em gmail.com>
> To: "Saulo" <saulo em gigatron.com.br>; "FireBase" <lista em firebase.com.br>
> Sent: Wednesday, September 08, 2010 9:09 AM
> Subject: Re: [firebase-br] select para retornar o nome e valor dos campos de
> uma tabela.
> Não entendi muito bem a necessidade (gostaria até que você nos
> explicasse), mas aparentemente você quer trazer os valores de N
> campos de um determinado registro em uma única coluna, sendo
> intercalado nome do campo e valor, ok?
>
> Se for assim, uma saída é montar uma Stored Procedure. Fiz uma rápida
> aqui apenas para exemplificar:
>
> create or alter procedure teste (id integer) RETURNS (dados varchar(100)) as
> declare variable nome varchar(30) = '';
> declare variable email varchar(50) = '';
> BEGIN
> SELECT NOMUSU, EMAUSU FROM USUARIOS WHERE CODUSU = :id INTO :nome, :email;
>
> dados = 'NOMUSU';
> suspend;
> dados = nome;
> suspend;
> dados = 'EMAUSU';
> suspend;
> dados = email;
> suspend;
> END;
>
> A partir daí dá pra você ampliar e fazer pra mais de um registro, se
> for o caso, removendo o filtro pelo ID e fazendo um for select.
>
> Se não for essa a questão, por favor, dê mais detalhes.
>
> Um abraço!
>
> Kelver Merlotti
> Coordenador Editorial do Portal www.ActiveDelphi.com.br
> Contato: kelver em activedelphi.com.br
> Google: kmerlotti em gmail.com
> Twitter: http://twitter.com/kmerlotti
> Tem um segundo? Então, dá uma olhadinha nisso:
> Um site de publicidades, de Portugal, está pagando em euros (quase 3x
> mais que em reais) pra quem estiver disposto a:
> * Ler anúncios
> * Visitar sites
> * Clicar em banners
> * Navegar na NET
> * Ler e-mails
> * Convidar novos usuários
> O pagamento pode ser feito de várias formas!
> Registra lá. Não custa nada!!! ;-)
> http://www.publipt.com/pages/index.php?refid=kmerlotti
>
>
>
> 2010/9/6 Saulo <saulo em gigatron.com.br>:
>> Boa tarde,
>>
>> estou precisando fazer um select que me retorne o nome do campo e valor
>> desse campo.
>>
>> exemplo:
>> exemplo da tabela cliente.
>> FIELDS
>> VALOR
>>
>> Nome
>> Cliente 01
>>
>> endereco
>> Rua tal
>>
>> Estado
>> sp
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> tenhos os campos nome, endereco estado.
>>
>> ex: select nome_campo, valor_campo from clientes.
>>
>> Atenciosamente,
>>
>> --------------------------------------------------------------------------------
>> Saulo Mendes Programador
>> Gigatron Tecnologia Ltda ME
>>
>>
>>
>>
>> ______________________________________________
>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>> Para saber como gerenciar/excluir seu cadastro na lista, use:
>> http://www.firebase.com.br/fb/artigo.php?id=1107
>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>
>
Mais detalhes sobre a lista de discussão lista