[firebase-br] Erro muito extranho com "Execute statement"

luapfirebird em yahoo.com.br luapfirebird em yahoo.com.br
Ter Jul 3 15:11:35 -03 2018


 Usando apenas uma variavel também não funciona é algo muito extranho que está acontecendo.
Veja :
Execute Block Returns ( Cod_Produto Varchar(35), Preco_Venda type of "Valores")As Declare variable vNomePreco VarChar(80);declare variable Str VarChar(1024) = '';Begin vNomePreco = 'Preco_Venda_1';

  str = 'Select Distinct CP.Cod_Produto, ' || IIF(:vNomePreco > 0, :vNomePreco, 1)     || '  From Cadastro_Precos CP  Where CP.COD_PRODUTO = ''1'' ';
 Execute statement :str  Into :Cod_Produto, :Preco_Venda; Suspend;
End


Se eu trocar essa linha
  str = 'Select Distinct CP.Cod_Produto, ' || IIF(:vNomePreco > 0, :vNomePreco, 1)

por isso
  str = 'Select Distinct CP.Cod_Produto, ' || :vNomePreco

Ai funciona sem problemas
Então a conclusão que se segue é 
 Str = 'Select Distinct CP.Cod_Produto, ' || :vNomePreco  // Funciona
 Str = 'Select Distinct CP.Cod_Produto, ' || IIF(:vNomePreco > 0, :vNomePreco, 1)  // Erro


 Agora vejam essa ultima linha :::
 Str = 'Select Distinct CP.Cod_Produto, ' ||  IIF(1 > 0, :vNomePreco, 1)   // Funciona

 Interessante pois essa linha funciona






    Em terça-feira, 3 de julho de 2018 13:11:04 BRT, Gladiston Santana <gladiston em vidy.com.br> escreveu:  
 
 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)asdeclare 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