Как вложить анонимные блоки с операторами объявления в Firebird? - PullRequest
2 голосов
/ 12 марта 2020

В Firebird DECLARE операторы могут быть перечислены в начале оператора EXECUTE BLOCK :

EXECUTE BLOCK [(<inparams>)]
     [RETURNS (<outparams>)]
AS
   [<declarations>]
BEGIN
   [<PSQL statements>]
END

в блоке , дальнейшие операторы DECLARE невозможны, т. Е. Все переменные имеют глобальную область действия для всего блока. Есть ли обходной путь для объявления локальных переменных только для области вложенного блока, в Firebird? Вложение EXECUTE BLOCK звонков невозможно:

EXECUTE BLOCK AS
  DECLARE i INTEGER;
BEGIN
  EXECUTE BLOCK AS -- This doesn't compile
    DECLARE j INTEGER;
  BEGIN

  END
END

1 Ответ

1 голос
/ 12 марта 2020

Вы не можете вкладывать 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.

...