我有一组我在PostgreSql中创建的函数。我希望能够使用全局常量配置一些行为和限制。
到目前为止,我已经实现了这些函数,我的函数调用它来检索常量值:
CREATE OR REPLACE FUNCTION slice_length()
RETURNS integer AS $$
BEGIN
RETURN 50;
END; $$
LANGUAGE plpgsql IMMUTABLE;
我在想,是否有更好/更聪明的方法来实现这一目标?
答案 0 :(得分:1)
看看这个其他答案。它使用与您相同的方法。
答案 1 :(得分:1)
我遇到了类似的问题:存储某种配置并从我的函数中访问它。 为了解决这个问题,我创建了一个函数,它返回一个包含我的配置的常量JSONB。
该功能如下所示:
create or replace function config()
returns jsonb
language 'plpgsql'
immutable
as $BODY$
declare
job_manager_config constant jsonb := '{
"notify": {
"channels": {
"all_available": "all.available",
"all_status": "all.status",
"task_available": "task.%s.available",
"task_status": "task.%s.status",
"job": "job.%s"
},
}
"allowed_pets": {
"dogs": 6,
"cats": 6,
"rabbits": 3,
"lions": 2,
"sweet_piranha": 8
}
}';
begin
return job_manager_config;
end;
$BODY$;
为了快速访问配置元素,我定义了第二个函数来查询配置。此函数接受路径作为字符串列表,并返回在路径中找到的值(或JSON对象)。 请注意,返回的值是文本,但您可以轻松地将其转换为实际类型。
create or replace function job_manager.config(
variadic path_array text[])
returns text
language 'plpgsql'
immutable
as $BODY$
begin
-- Return selected object as text (instead of json or jsonb)
return jsonb_extract_path_text(job_manager.config(), variadic path_array);
end;
$BODY$;
这是一个用法示例:
test=# select job_manager.config('notify', 'channels', 'job');
config
--------------------
job_manager.job.%s
(1 row)
答案 2 :(得分:0)
我会为此创建一个表:
create table constant (c1 int, c2 numeric);
insert into constant (c1, c2) values (100, 33.2);
函数SQL不是PL / pgSQL会检索单行:
create or replace function get_constants()
returns constant as $$
select *
from constant;
$$ language sql immutable;
每个常数都会被调用:
select (get_constants()).c1, (get_constants()).c2;
所有数据都在一个地方,并通过一个功能进行检索。
如果表确实那么糟糕,那么将所有值放在一个函数中:
create or replace function get_constants (
c1 out int, c2 out numeric
) returns record as $$
select 100, 33.5;
$$ language sql immutable;
并按上述方式使用。
答案 3 :(得分:0)
您可以为此目的声明一个名为 constants
的表,如前面提到的 that answer,其中每列对应一个设置。
为确保最多只能向表格中添加一行,this answer 可能会有所帮助。
正如评论指出,当像这样存储常量而不是将常量存储为函数时会增加 I/O,this 可能是一个很好的参考。