[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"

Carlos Andrade krlosgilson em gmail.com
Qui Jan 23 16:41:31 -03 2020


Olá Mário Reis! Sei que a pergunta não foi destinada a mim, mas mesmo 
assim vamos lá...
Eu tenho uma SP que ainda funciona perfeitamente, mas não com "execute 
block" e sim com "execute statement", logo porque não convém (pelo menos 
eu acho). Mas acredito que você adaptando-a para "execute block" possa 
funcionar também como o esperado.

/* Inicio */
create or alter procedure sp_exec (
     iqt_sql integer,
     ilist_sql varchar(8000))
as
declare variable v_i integer;
declare variable v_pos integer;
declare variable v_sql varchar(8000);
begin
   v_i = 1;
   while (v_i <= :iqt_sql) do
   begin
     v_pos = position(';', :ilist_sql);
     v_sql = substring(ilist_sql from 1 for :v_pos);
     --if (substring(:v_sql from 1 for 6) <> 'delete') then
     execute statement :v_sql;
     select f.wret from fu_extract_str(:v_sql, :ilist_sql) f into 
:ilist_sql;
     v_i =: v_i+1;
   end
end
/* Fim */

/* SP adicional */
create or alter procedure fu_extract_str (
     wsub varchar(8192),
     wstr varchar(8192))
returns (
     wret varchar(8192))
as
declare variable wpos smallint;
declare variable wvar varchar(8192);
begin
   /* Remove wsub de wstr */
   wpos = position(:wsub, :wstr);
   if (:wpos = 0) then
     wret = :wstr;
   else begin
     wret = substring(:wstr from 1 for (:wpos - 1));
     wvar = substring(:wstr from (:wpos + char_length(:wsub)) for 8191);
     wret = :wret || :wvar;
   end
   suspend;
end
/* Fim */
Exemplo de uso:
execute procedure SP_EXEC(5,'insert into LOGS (NUM,DATA) values 
(1,current_date);insert into LOGS (NUM,DATA) values 
(2,current_date);insert into LOGS (NUM,DATA) values 
(3,current_date);insert into LOGS (NUM,DATA) values 
(4,current_date);insert into LOGS (NUM,DATA) values (5,current_date);');
Note que o parâmetro "iqt_sql" deve conter a quantidade de instruções 
SQL delimitadas por ",".

> 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




Mais detalhes sobre a lista de discussão lista