使用current_setting()检查值

时间:2013-07-30 20:19:40

标签: postgresql postgresql-9.2

我正在尝试使用current_setting()

我想出了这个:

CREATE OR REPLACE FUNCTION process_audit() RETURNS TRIGGER AS $audit$
    DECLARE
        user_id integer;
    BEGIN
        BEGIN
            user_id := current_setting('hws.current_user_id');
        EXCEPTION WHEN OTHERS THEN
            user_id := NULL;
        END;
        ...
        RETURN NULL;
   END;
$audit$ LANGUAGE plpgsql;

通过以下方式设置设置:

SELECT set_config('hws.current_user_id', '5', true); -- true = local setting -> only visible in current transaction

问题是,如果值无效,current_setting()会抛出异常。我不想使用EXCEPTION,因为我读到异常块很昂贵。

有没有办法检查设置是否有值而不使用例外?

顺便说一句:我也尝试从pg_settings读取,但这似乎不适用于本地设置。

3 个答案:

答案 0 :(得分:17)

9.6及更新版本:

PostgreSQL(9.6+)支持current_setting('setting_name', 't')获取设置,如果未设置则返回NULL。您可以将其与coalesce结合使用以提供默认值。

9.5及更早版本:

根据这个问题,如果您不介意性能损失和笨拙,可以使用plpgsql函数使用BEGIN ... EXCEPTION处理程序。但是没有内置的支持。

答案 1 :(得分:0)

你还应该投演员吗?如下,

user_id := current_setting('hws.current_user_id')::integer;

答案 2 :(得分:0)

请找到我在使用 current_setting 时使用的以下示例。

CREATE OR REPLACE FUNCTION public.usp_fetch_current_setting()
    RETURNS text
    LANGUAGE plpgsql
    AS $function$
    declare 
        v_appCode text;
    begin
        select current_setting('spm.appCode', 't') into v_appCode;
        return v_appCode;
    END;
$function$
;

通话时:

set session "spm.appCode" = 'spm-alignment-web';
SELECT public.usp_fetch_current_setting();