Вы не можете вкладывать execute block
операторов. Дизайн этой функции не рассматривал этот вариант. В Firebird 3 вы можете определить «подпроцедуры» или «подфункции», но они не имеют доступа к переменным или входным столбцам с внешнего уровня (поэтому они предоставляют только изолированную область видимости, и вам потребуется явно передавать значения с использованием параметров и выход с использованием возвращаемых значений), и вы не можете вкладывать более одного уровня.
Например:
execute block
returns (firstval integer, secondval integer)
as
declare function x(param1 integer) returns integer
as
declare var1 integer;
begin
var1 = param1 * 2;
return param1 + var1;
end
begin
firstval = 1;
while (firstval < 10) do
begin
secondval = x(firstval);
suspend;
firstval = firstval + 1;
end
end
https://dbfiddle.uk/?rdbms=firebird_3.0&fiddle=677b33e416bd3f6a6a34e060d9afce9e
Мне не известны другие варианты объявления переменных с ограниченной областью действия в Firebird PSQL.