Първо решение
Синтаксис за SET
е:
SET [ SESSION | LOCAL ] configuration_parameter { TO | = } { value |'value' | DEFAULT }
където value
е новата стойност за даден configuration_parameter
.
За да присвоите стойност, съхранена в _user_id
променлива, трябва да генерирате динамична команда и след това EXECUTE
то.
Това би бил начинът да направите това:
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;
$$;
Прикачване на SQL Fiddle връзка за тестови цели.
Забележка:
quote_nullable()
функцията ще върнеNULL
ако входният аргумент е нула. Във вашия случай може да не е необходимо.
Второ решение
Можете също да постигнете същото с set_config()
функция, както отбеляза @a_horse_with_no_name. Тогава вашата функция ще изглежда така:
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;
$$;
Прикачване на SQL Fiddle връзка за тестови цели.
Забележка:
- Трябва изрично да прехвърлите втори аргумент към тип varchar
PERFORM
се използва за оценка на израз и отхвърляне на резултата, тъй като не е необходим- Можете да използвате
quote_nullable()
функционират и тук