I'm trying to work with current_setting()
.
I came up with this:
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;
The setting is set via:
SELECT set_config('hws.current_user_id', '5', true); -- true = local setting -> only visible in current transaction
The problem is, that current_setting()
throws an exception if the value is not valid. I don't want to use EXCEPTION
because I read that exception blocks are expensive.
Is there a way to check if the setting has a value without using exceptions?
Btw: I also tried to read from pg_settings
but that doesn't seem to work with local settings.
PostgreSQL (9.6+) supports current_setting('setting_name', 't')
to fetch a setting and return NULL
if it's unset. you can combine this with coalesce
to supply a default.
Per the question, you can do it with a plpgsql
function that uses a BEGIN ... EXCEPTION
handler, if you don't mind the performance hit and clumsiness. But there's no built-in support.
Please find the below example which i use while working with 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$
;
while calling:
set session "spm.appCode" = 'spm-alignment-web';
SELECT public.usp_fetch_current_setting();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With