我正在尝试使用 pl/pgsql 函数内的变量来设置 application_name 。我需要设置一些变量,所以我想包装在一个函数中,而不是让客户端多次运行该命令。
然而当我跑步时
my_variable := 'foo';
SET application_name = my_variable;
Run Code Online (Sandbox Code Playgroud)
它将 application_name 设置为 my_variable 而不是 foo。
这是在 postgresql11 上的。我尝试以各种方式引用该变量以使其进行评估,但到目前为止还没有成功。
当我运行一个简单的
SET application_name = 'foo';
Run Code Online (Sandbox Code Playgroud)
它按预期工作。我已经尝试了引用另一个答案的一些字符串:How do you use script variables in psql? 但这些似乎都不适合我。
到目前为止我的代码是:
CREATE OR REPLACE FUNCTION app_name_test(
p_application_name VARCHAR(64)
) RETURNS BOOLEAN
LANGUAGE plpgsql
AS $$
DECLARE
BEGIN
RAISE INFO 'Setting Application Name To: %', p_application_name;
SET application_name = p_application_name;
RETURN TRUE;
END;
$$;
SELECT app_name_test('This_is_a_test');
Run Code Online (Sandbox Code Playgroud)
我相当确定这是可能的,但我必须以某种方式引用字符串。提前谢谢了。
编辑:下面来自 a_horse_with_no_name 的评论中的答案解决了这个问题。
EXECUTE FORMAT('SET application_name = %L', p_application_name);
Run Code Online (Sandbox Code Playgroud)
不过,了解为什么这适用于表(变量扩展)但不适用于此特定 SQL 会很有趣。例如
SELECT * from table where column = my_var;
Run Code Online (Sandbox Code Playgroud)
有效,但上面的没有。
像这样的声明
SELECT x INTO dest FROM atable WHERE column = my_var;
Run Code Online (Sandbox Code Playgroud)
其中my_varPL/pgSQL 变量实际上会变成参数化查询:
SELECT x FROM atable WHERE column = $1;
Run Code Online (Sandbox Code Playgroud)
并且 的值my_var将作为参数值提供。
当且仅当语句支持参数时,在 PL/pgSQL 语句中使用变量才有效。
现在SELECT支持参数(如INSERT、UPDATE和DELETE),但SET(如所有“实用程序语句”)不支持。
这就是为什么如果您想在实用程序语句中使用变量,则必须使用动态 SQL。
| 归档时间: |
|
| 查看次数: |
993 次 |
| 最近记录: |