gpt4 book ai didi

postgresql - 使用变量后连接设置 application_name?

转载 作者:行者123 更新时间:2023-11-29 12:07:09 53 4
gpt4 key购买 nike

我正在尝试使用 pl/pgsql 函数中的变量设置 application_name。我需要设置一些变量,所以我想包装在一个函数中,而不是让客户端多次运行命令。

但是当我运行的时候

my_variable := 'foo';
SET application_name = my_variable;

它将 application_name 设置为 my_variable 而不是 foo。

这是在 postgresql11 上。我尝试以各种方式引用变量以使其求值,但到目前为止没有成功。

当我运行一个简单的

SET application_name = 'foo';

它按预期工作。我试过从另一个答案中引用的一些字符串: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');

我相当确定这是可能的,但我必须以某种方式引用字符串。非常感谢。


编辑:下面来自 a_horse_with_no_name 的评论中的答案解决了这个问题。

EXECUTE FORMAT('SET application_name = %L', p_application_name);

虽然知道为什么这适用于表(扩展的变量)但不适用于这个特定的 SQL,但会很有趣。例如

SELECT * from table where column = my_var;

有效,但上面没有。

最佳答案

像这样的语句

SELECT x INTO dest FROM atable WHERE column = my_var;

其中 my_var 是一个 PL/pgSQL 变量,实际上将变成一个参数化查询:

SELECT x FROM atable WHERE column = $1;

my_var 的值将作为参数值提供。

当且仅当语句支持参数时,在 PL/pgSQL 语句中使用变量才有效。

现在 SELECT 支持参数(INSERTUPDATEDELETE),但是 SET (就像所有“实用程序语句”一样)没有。

这就是如果您想在实用程序语句中使用变量,则必须使用动态 SQL 的原因。

关于postgresql - 使用变量后连接设置 application_name?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57664742/

53 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com