Första lösningen
Syntax för SET
är:
SET [ SESSION | LOCAL ] configuration_parameter { TO | = } { value |'value' | DEFAULT }
där värde
är det nya värdet för en given configuration_parameter
.
För att tilldela ett värde lagrat i _user_id
variabel måste du generera ett dynamiskt kommando och sedan UTFÖR
det.
Detta skulle vara sättet att göra det:
CREATE OR REPLACE FUNCTION set_user(_user_id bigint, is_local boolean default true)
RETURNS void
LANGUAGE PLPGSQL
AS $$
BEGIN
EXECUTE 'SET my.user_id TO ' || quote_nullable(_user_id);
END;
$$;
Bifogar SQL Fiddle länk för teständamål.
Obs!
quote_nullable()
funktion skulle returneraNULL
om inmatningsargumentet är null. Det kanske inte är nödvändigt i ditt fall.
Andra lösningen
Du kan också uppnå samma sak med code>set_config() fungerar som @a_horse_with_no_name noterat. Din funktion skulle då se ut så här:
CREATE OR REPLACE FUNCTION set_user(_user_id bigint, is_local boolean default true)
RETURNS void
LANGUAGE PLPGSQL
AS $$
BEGIN
PERFORM set_config('my.user_id', _user_id::TEXT, false);
END;
$$;
Bifogar SQL Fiddle länk för teständamål.
Obs!
- Du måste uttryckligen casta det andra argumentet till en varchar-typ
PERFORM
används för att utvärdera ett uttryck och förkasta resultatet eftersom det inte behövs- Du kan använda
quote_nullable()
fungerar även här