我正在努力工作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;
Run Code Online (Sandbox Code Playgroud)
设置通过以下方式设置:
SELECT set_config('hws.current_user_id', '5', true); -- true = local setting -> only visible in current transaction
Run Code Online (Sandbox Code Playgroud)
问题是,current_setting()如果值无效,则抛出异常.我不想使用,EXCEPTION因为我读到异常块很昂贵.
有没有办法检查设置是否有值而不使用异常?
顺便说一句:我也尝试过阅读,pg_settings但这似乎不适用于本地设置.
在Oracle的PL/SQL中,我可以使用包定义创建基于会话的全局变量.使用Postgresql的PLpg/SQL,它似乎不可能,因为没有包,只有独立的程序和功能.
以下是PL/SQL将g_spool_key声明为全局的语法...
CREATE OR REPLACE PACKAGE tox IS
g_spool_key spool.key%TYPE := NULL;
TYPE t_spool IS REF CURSOR RETURN spool%ROWTYPE;
PROCEDURE begin_spool;
PROCEDURE into_spool
(
in_txt IN spool.txt%TYPE
);
PROCEDURE reset_spool;
FUNCTION end_spool
RETURN t_spool;
FUNCTION timestamp
RETURN VARCHAR2;
END tox;
Run Code Online (Sandbox Code Playgroud)
如何使用PLpg/SQL实现基于会话的全局变量?