postgresql - 使用可变后连接设置 application_name?
问题描述
我正在尝试使用 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;
where my_var
is PL/pgSQL 变量实际上将被转换为参数化查询:
SELECT x FROM atable WHERE column = $1;
的值my_var
将作为参数值提供。
当且仅当语句支持参数时,在 PL/pgSQL 语句中使用变量才有效。
现在SELECT
支持参数(就像INSERT
,UPDATE
和一样DELETE
),但SET
(像所有“实用程序语句”一样)不支持。
这就是为什么要在实用程序语句中使用变量时必须使用动态 SQL 的原因。
推荐阅读
- r - 添加布局以展示 corr 值时,带有回归线的 plotly 会缩小;为什么?
- php - 如何使用 fpdf 保持最佳图像质量并使用 Image() 调整大小
- excel-formula - 如何比较两个不同的列并突出显示每行中的最大值?
- php - 将几行代码从 PHP 转换为 Smarty PHP
- flutter - 分开的圆形进度条
- javascript - 用花哨的设计在 react-native 中创建水平 ScrollView
- firebase - firestore rest api响应大小有限制吗?
- matlab - MATLAB轮廓尖角
- reactjs - 在 React 页面上显示私人用户信息的最佳方式
- laravel - 模型中具有引导功能的种子工厂