在Postgresql中存储函数/过程中定义全局常量?

时间:2014-03-24 15:26:50

标签: postgresql stored-procedures constants global

我有一组我在PostgreSql中创建的函数。我希望能够使用全局常量配置一些行为和限制。

到目前为止,我已经实现了这些函数,我的函数调用它来检索常量值:

CREATE OR REPLACE FUNCTION slice_length()
RETURNS integer AS $$
BEGIN
    RETURN 50;
END; $$
LANGUAGE plpgsql IMMUTABLE;

我在想,是否有更好/更聪明的方法来实现这一目标?

4 个答案:

答案 0 :(得分:1)

看看这个其他答案。它使用与您相同的方法。

Create constant string for entire database

答案 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 可能是一个很好的参考。