[firebase-br] Execute Block: "Executes a block of PSQL code as if it were a stored procedure, optionally with input and output parameters and variable declarations"

Gladiston Santana gladiston em vidy.com.br
Sex Jan 24 11:18:18 -03 2020


Se eu entedi direito você quer usar o execute block ao inves de procedure,
está correto?
Bem isso, é simples, pega a procedure e muda apoenas o cabecalho, daí é uma
query qualquer em seu sistema, a unica coisa que é mais dificil é usar
queries parametrizadas com ela, não é que não seja possivel, mas é bem
diferente do convencional, veja este exemplo:
      if qcount.Active then
        qcount.Close;
      qcount.SQL.Clear;
      qcount.SQL.Add('EXECUTE BLOCK (');
      qcount.SQL.Add('   P_CODITEM varchar(30)=?,');
      qcount.SQL.Add('   P_ANO int=? )');
      qcount.SQL.Add('RETURNS(RESULT_VALUE bigint) AS');
      qcount.SQL.Add('DECLARE VARIABLE C bigint;');
      qcount.SQL.Add('BEGIN');
      qcount.SQL.Add('  RESULT_VALUE=0;');
      qcount.SQL.Add('');
      qcount.SQL.Add('  IF (LEFT(:p_coditem,4)=''BDI-'') THEN');
      qcount.SQL.Add('  BEGIN');
      qcount.SQL.Add('    SELECT COUNT(*) FROM CV_BDI ');
      qcount.SQL.Add('      WHERE coditem=:p_coditem AND EXTRACT(YEAR FROM
LAST_UPDATE)=:P_ANO');
      qcount.SQL.Add('    INTO :C;');
      qcount.SQL.Add('    RESULT_VALUE=(:RESULT_VALUE+:C);');
      qcount.SQL.Add('  END');
      qcount.SQL.Add('  (...)'); // so um trecho de teste
      qcount.SQL.Add('  SUSPEND;');
      qcount.SQL.Add('END');
      if not qcount.prepared then
        qcount.Prepare;
Daí para executar:
          qcount.Params[0].AsString:=sCoditem_produto;
          qcount.Params[1].AsInteger:=iAno;
          qcount.Open;
Apesar de sua versatilidade e velocidade por rodar diretamente no servidor
toma cuidado se planeja usar multi-banco no futuro, pois essa forma de
execução não é ANSI e seria dificil de portar para outros bancos.

[] ´s

Em qua., 22 de jan. de 2020 às 13:35, Mário Reis <mariodosreyx em gmail.com>
escreveu:

> Cantú ou Gladison,
>
> Àquele de vós que possa estar mais disponível rogo o favor de me informar
> como usar "Execute Block" uma vez que dentro de uma store procedure não dá
> e como?
> Por exemplo no próprio Servidor do Firebird, ou a partir do meu programa em
> Delphi ou C++ etc... Mas como? Ainda não percebi. O problema deve ser meu,
> mas até agora
> não encontrei um único exemplo a funcionar de modo a que possa perceber.
> Obrigado
> E, desculpem qualquer coisa.
>
> Com os meus melhores cumprimentos
> Mário Agostinho Reis
> 919262146
>
> Esta mensagem contém informação de natureza confidencial e é
> exclusivamente dirigida ao(s) destinatário(s) indicado(s). Se, por engano,
> receber este email agradecemos que não o copie nem o reenvie e que nos
> notifique do ocorrido através do email de resposta.
> [image: cloudHQ]
> <
> https://chrome.google.com/webstore/detail/free-email-tracker/nknojfclnachdkpdkjbbhbkgpnladhnj
> >
> Powered
> by
> cloudHQ
> <
> https://chrome.google.com/webstore/detail/free-email-tracker/nknojfclnachdkpdkjbbhbkgpnladhnj
> >
> ______________________________________________
> 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://www.firebase.com.br/pesquisa_lista.html
>


-- 
A Vidy possui um Sistema de Gestão da Qualidade estruturado e com
Certificação ISO 9001 há mais de 10 anos, mantendo seu foco na Qualidade e
na Melhoria Continua.

Em março de2018 migramos com sucesso para a nova versão da ISO 9001.

Somos a única Empresa Brasileira de Engenharia de Laboratórios com
certificação com o Escopo Completo; desde Projetos, Engenharia, Construção,
Fabricação e Instalação de Laboratórios.



Mais detalhes sobre a lista de discussão lista