Primera solución
Sintaxis para SET
es:
SET [ SESSION | LOCAL ] configuration_parameter { TO | = } { value |'value' | DEFAULT }
donde value
es el nuevo valor para un configuration_parameter
dado .
Para asignar un valor almacenado en _user_id
variable, debe generar un comando dinámico y luego EXECUTE
eso.
Esta sería la forma de hacerlo:
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;
$$;
Adjuntar SQL Fiddle enlace con fines de prueba.
quote_nullable()
la función devolveríaNULL
si el argumento de entrada es nulo. Puede que no sea necesario en su caso.
Segunda solución
También podría lograr lo mismo con set_config()
función como se indicó @a_horse_with_no_name. Su función se vería así:
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;
$$;
Adjuntar SQL Fiddle enlace con fines de prueba.
- Tienes que lanzar explícitamente el segundo argumento a un tipo varchar
PERFORM
se usa para evaluar una expresión y descartar el resultado ya que no es necesario- Podrías usar
quote_nullable()
funcionan aquí también