[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