2

在 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
4

1 回答 1

1

你不能嵌套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 中声明具有有限范围的变量的其他选项。

于 2020-03-12T15:00:20.173 回答