将 current_setting('the_setting') 的结果赋给 PL/pgSQL 中的一个变量

Kaz*_*ler 4 postgresql parameter plpgsql

我有一个函数,我需要获取一个配置参数并将其分配给我稍后将在函数中使用的变量。问题是当配置参数不被识别(因为它还不存在)时,函数就会死亡。我想评估是否可以分配变量,如果不能为其设置空值。

这是我尝试过的:

   DECLARE
      conf_param text;
      num integer;

   BEGIN
      SELECT current_setting('the_setting') INTO conf_param;
         -- here is where dies when the_setting is not recognized!
      IF FOUND THEN
         num := conf_param::integer;
      ELSE
         num := NULL;
      END IF;
      -- more stuff
Run Code Online (Sandbox Code Playgroud)

我不确定我使用Found的方式是否需要。

Erw*_*ter 5

在 Postgres 9.6或更高版本中,您可以更简单地做到这一点。就像a_horse 评论的那样,有一个新的变体current_setting()需要第二个参数missing_ok,如果没有设置配置参数(穷人的“全局变量”),则抑制异常。因此不再需要昂贵的错误捕获。

而且你不需要另一个变量conf_param,你可以直接转换函数调用的结果:

DECLARE
   num integer;
BEGIN
   num := current_setting('the_setting', true)::int;
   -- more stuff
END;
Run Code Online (Sandbox Code Playgroud)

这是假设 config 参数在设置时始终是有效numeric字符串。如果您对此不完全确定,您可以添加一个EXCEPTION子句来捕获可能的转换错误。或者在强制转换之前测试该值以排除异常。通常要便宜得多。详细说明: