我正在尝试在存储过程中设置自定义选项,但它存储变量名称而不是变量的内容。
CREATE OR REPLACE FUNCTION set_user(_user_id bigint, is_local boolean default true) returns void AS $$
BEGIN
SET my.user_id TO _user_id;
END;
$$ LANGUAGE PLPGSQL;
select set_user(1);
select current_setting('my.user_id');
current_setting
-----------------
_user_id
(1 row)
我希望current_setting
返回1
,而不是字符串值"_user_id"
。
答案 0 :(得分:1)
SET
的语法是:
SET [ SESSION | LOCAL ] configuration_parameter { TO | = } { value |'value' | DEFAULT }
其中value
是给定configuration_parameter
的新值。
为了分配存储在_user_id
变量中的值,您需要生成动态命令,然后EXECUTE
。
这将是这样做的方式:
CREATE OR REPLACE FUNCTION set_user(_user_id bigint, is_local boolean default true)
RETURNS void
LANGUAGE PLPGSQL
AS $$
BEGIN
EXECUTE 'SET my.user_id TO ' || quote_nullable(_user_id);
END;
$$;
附加SQL Fiddle链接以进行测试。
注意:强>
quote_nullable()
函数将返回NULL
。在您的情况下可能没有必要。您还可以使用set_config()
函数实现相同的功能,并注明@a_horse_with_no_name。您的功能将如下所示:
CREATE OR REPLACE FUNCTION set_user(_user_id bigint, is_local boolean default true)
RETURNS void
LANGUAGE PLPGSQL
AS $$
BEGIN
PERFORM set_config('my.user_id', _user_id::TEXT, false);
END;
$$;
附加SQL Fiddle链接以进行测试。
注意:强>
PERFORM
用于评估表达式并丢弃结果,因为它不需要quote_nullable()
功能