PSQL 传递外部变量

PSQL passing external variables

我正在尝试将 value/variable 从批处理脚本传递到 SQL 脚本,但我遇到了问题。

代码流程如下:

从我的批处理脚本开始,我调用了一个引用 myFirstSQLFile.sql 的 psql 命令调用,并将 env 作为值为 test[=26 的变量传递=]

%PSQLCOMMAND% -h {server} -U {user} -d {dbname} -E -q -f myFirstSQLFile.sql -v env="test"

在我的 myFirstSQLFile.sql 中,它引用了许多其他 sql 文件,但为了简单起见,我只显示一个。正是在这个文件中,我知道我可以使用 :env

访问我的 env 变量
\i myLastSQLFile.sql;

myLastSQLFile.sql 中,我有 sql 代码用于使用外部 env var 进行条件语句,如下所示

DO
$do$
BEGIN
   IF :env = 'test' THEN
       # Do Something
   END IF;
END
$do$

我知道在那些 $do$ 标签之外,我可以使用符号 :env 访问我的变量,但是在它们内部我不能。我不太明白 $do$ 标签或 BEGIN/END 块的用途,if/how 我可以在其中访问我的 env 变量。

A DO statement 执行匿名代码块。 “$do$ 标签” 是 dollar-quotes。请先阅读此内容以了解:

  • What are '$$' used for in PL/pgSQL

BEGINENDPL/pgSQL code block 的修饰符 - 这是 DO 语句的默认 PL(编程语言)。

psql 不插入变量 inside quoted SQL literals and identifiers.

一种 解决问题的方法是使用 Postgres 字符串处理,然后使用 \gexec 执行结果。来自 psql:

SELECT format($$
DO
$do$
BEGIN
   IF %L = 'test' THEN
      -- do something
   END IF;
END
$do$;
$$, :'env')\gexec

还有其他各种方式。也许一个(临时)函数可以更好地为您服务:您可以将参数传递给它。以全图为准
请参阅 dba.SE 上一个非常相似的问题的答案: