[firebase-br] Como funcionar esse "Execute statement"
luapfirebird em yahoo.com.br
luapfirebird em yahoo.com.br
Ter Jul 3 15:07:43 -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
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