从嵌套块中访问外部块变量

Accessing outer block variables from within a nested block

我正在尝试使用 postgresql 的 plpgsql 从嵌套块中的父块访问变量,如下所示

DO $outer-block$
DECLARE
  test_variable text DEFAULT "test";
BEGIN

  DO $inner-block$
  BEGIN

    RAISE NOTICE '%',test_variable;

  END;
  $inner-block$;

END;
$outer-block$;

当我尝试 运行 时,它告诉我“test_variable 列不存在”,所以我假设给出内部块时该变量不在范围内控件,有没有办法从嵌套块中访问它?

(我检查了这个问题:,这有点相似,但在那种情况下,它试图从一个函数中访问外部块变量,它是一个持久的数据库对象,它在某种程度上会尝试创建一个闭包,这不是我在这里所做的,因为我想从一次性执行的内部块中访问外部块的范围,这可能会有所不同,但我不会肯定知道)

文档 plpgsql structure 向您展示了如何执行此操作。使用您的示例作为起点:

DO
$$
<<outerblock>>
DECLARE
  test_variable text DEFAULT 'test';
BEGIN
    RAISE NOTICE '%',test_variable;

    DECLARE
        test_variable text := 'inner test';
    BEGIN
        RAISE NOTICE '%',test_variable;
        RAISE NOTICE '%', outerblock.test_variable;

  END;

END;
$$;

NOTICE:  test
NOTICE:  inner test
NOTICE:  test

与您的示例的不同之处:

  1. 'test' 而不是“test”,因此该值不被视为标识符。

  2. 使用<<outerblock>>标签语法来标注外块。 $<some_tag>$ 不会这样做。

  3. 使用outerblock.test_variable中的标签从外部块中获取变量值。

仅供参考,在你原来的例子中不需要内部块,因为你没有做任何改变值的事情test_variable所以它无论如何都会和外部块一样。

更新

刚刚意识到您可能正在尝试执行嵌套函数,根据示例中 DO 的使用。那是一个不同的东西然后块。为了传递数据,您必须将其作为参数添加到嵌套函数的参数中。因为 DO 函数不能有无效的参数。您将不得不使用常规函数。

进一步更新

您可以嵌套 DO 函数:

DO
$$
<<outerblock>>
DECLARE
  test_variable text DEFAULT 'test';
BEGIN
    RAISE NOTICE '%',test_variable;

    DO
    $i$
    DECLARE
        inner_test_variable text := 'inner test';
    BEGIN
        RAISE NOTICE 'Inner %', inner_test_variable;

    END;
    $i$;
END;
$$;

NOTICE:  test
NOTICE:  Inner inner test
DO

你只是不能访问外部的变量。它们必须作为函数参数的参数传递到内部函数中,而 DO 函数没有参数。您可以使用常规函数来完成。