[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