[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