在Postgres中,以下命令将返回一个设置值:
SELECT current_setting('foo');
如果该设置不存在,它将引发异常。
我们有一个设置可能存在也可能不存在的情况,所以我们不得不创建一个函数来捕获异常并返回null:
CREATE OR REPLACE FUNCTION public.get_foo()
RETURNS varchar
LANGUAGE plpgsql AS $$
BEGIN
RETURN (SELECT current_setting('foo'));
EXCEPTION
WHEN others THEN
RETURN NULL;
END;
$$;
然而,当设置不存在时,这种情况会非常糟糕,可能是因为抛出和捕获异常的成本很高。
有没有办法检查设置是否存在?
实际上有两个名为current_setting
的函数。您使用的第一个接受一个表示变量名的string
。另一个接受两个参数,一个是用于变量名的string
,另一个是指示缺少的变量名是否正常的boolean
。
只需使用SELECT coalesce(current_setting('my.foo', true), 'mydefault');
示例:
postgres=> set session my.foo to 'baz';
SET
postgres=> select current_setting('public.foo', true);
current_setting
-----------------
baz
(1 row)
postgres=> select current_setting('public.bar', true);
current_setting
-----------------
(1 row)
postgres=> select coalesce(current_setting('public.bar', true), 'mydefault');
coalesce
-----------
mydefault
(1 row)
尝试使用此系统视图,而不是current_setting
函数。
SELECT setting FROM pg_catalog.pg_settings WHERE name = 'foo';
另一个";奖金";你可以把它用作一个常规表格:
(filip@[local]:5432) filip=# SELECT name, setting, unit, source, boot_val FROM pg_settings WHERE name ~ 'mem';
name | setting | unit | source | boot_val
----------------------------+---------+------+--------------------+----------
autovacuum_work_mem | -1 | kB | default | -1
dynamic_shared_memory_type | posix | NULL | configuration file | posix
hash_mem_multiplier | 1 | NULL | default | 1
logical_decoding_work_mem | 65536 | kB | default | 65536
maintenance_work_mem | 512000 | kB | session | 65536
shared_memory_type | mmap | NULL | default | mmap
work_mem | 20480 | kB | session | 4096
(7 rows)
(filip@[local]:5432) filip=# SELECT source, count(*) FROM pg_settings GROUP BY 1;
source | count
----------------------+-------
client | 2
environment variable | 1
configuration file | 26
default | 291
session | 2
override | 13
(6 rows)