[firebase-br] Como funcionar esse "Execute statement"

Gladiston Santana gladiston em vidy.com.br
Ter Jul 3 13:11:02 -03 2018


seria mais produtivo você concentrar sua sintaxe inteira numa variavel só,
veja esse exemplo:
create or alter procedure get_cep (
    p_cep varchar (8) = '')
returns (
    cep char (8),
    logradouro varchar (125),
    bairro varchar (70),
    cidade varchar (70),
    uf char (2),
    last_update timestamp)
as
declare variable st varchar (1024)='';
begin
  cep='';
  logradouro='';
  bairro='';
  cidade='';
  uf='';
  last_update='01.01.1970';

  st='select cep, logradouro, bairro, cidade, uf, last_update from ceps ';
  if (:p_cep<>'') then
  begin
    if ((char_length(:p_cep)<8) and (position ('%' in :p_cep)=0)) then
p_cep=:p_cep||'%';
    if (position ('%' in :p_cep)=0)
    then st=:st||'where cep like '''||:p_cep||'''';
    else st=:st||'where cep='''||:p_cep||'''';
  end
  for execute statement :st
  into :cep, :logradouro, :bairro, :cidade, :uf, :last_update do
  begin
    suspend;
  end

end

E muito cuidado com aspas dentro de aspas, aspas duplas e simples
misturadas podem não produzir o resultado desejado, alguns bancos
interpretam aspas duplas como literal ou case sensitive.
Também é permitido usar parametros dentro do statement, mas eu só tentei
uma vez, demorou muito para descobrir como se faz e quando descobri achei
que não valia a pena o esforço. Essa era uma das duas coisas mais dificieis
de se achar na docuementação do firebird sobre parametros, a outra era usar
queries parametrizadas em execute block.


Em 3 de julho de 2018 10:42, luapfirebird em yahoo.com.br <
luapfirebird em yahoo.com.br> escreveu:

> Pessoal estou com uma problema que acredito ser simples para os colegas.
>
> Execute Block Returns ( Cod_Produto Varchar(35), Preco_Venda type of
> "Valores")As Declare variable vNomePreco VarChar(80);Begin vNomePreco =
> 'Preco_Venda_1';
>  Execute statement 'Select Distinct CP.Cod_Produto, ' || :vNomePreco   ||
> ' From Cadastro_Precos CP'  || ' Where CP.COD_PRODUTO = ''1'' '  Into
> :Cod_Produto, :Preco_Venda;  Suspend;
> End
> Essa Block funciona perfeitamente porem se eu trocar a linha
>  Execute statement 'Select Distinct CP.Cod_Produto, ' || :vNomePreco
>
> Para
>  Execute statement 'Select Distinct CP.Cod_Produto, ' || IIF(:vNomePreco >
> 0, :vNomePreco, 1)
>
>  Vai dar o erro   Conversion Error from String "Preco_Venda_1"
>  Fiquei sem entender  Como eu poderia resolver isso ?
>
>
>



Mais detalhes sobre a lista de discussão lista