在存储过程中设置自定义选项

时间:2016-03-29 19:37:53

标签: postgresql stored-procedures plpgsql postgresql-9.5

我正在尝试在存储过程中设置自定义选项,但它存储变量名称而不是变量的内容。

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"

1 个答案:

答案 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链接以进行测试。

注意:

    如果输入参数为null,
  • 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链接以进行测试。

注意:

  • 您必须显式地将第二个参数转换为varchar类型
  • PERFORM用于评估表达式并丢弃结果,因为它不需要
  • 您也可以在这里使用quote_nullable()功能