Primeira solução
Sintaxe para
SET
é:SET [ SESSION | LOCAL ] configuration_parameter { TO | = } { value |'value' | DEFAULT }
onde
value
é o novo valor para um determinado configuration_parameter
. Para atribuir um valor armazenado em
_user_id
variável, você precisa gerar um comando dinâmico e, em seguida, EXECUTE
isto. Esta seria a maneira de fazer isso:
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;
$$;
Anexando SQL Fiddle link para fins de teste.
Observação:
quote_nullable()
função retornariaNULL
se o argumento de entrada for nulo. Pode não ser necessário no seu caso.
Segunda solução
Você também pode conseguir a mesma coisa com
set_config()
função como @a_horse_with_no_name anotado. Sua função então ficaria assim: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;
$$;
Anexando SQL Fiddle link para fins de teste.
Observação:
- Você precisa converter explicitamente o segundo argumento para um tipo varchar
PERFORM
é usado para avaliar uma expressão e descartar o resultado, pois não é necessário- Você pode usar
quote_nullable()
funcionam aqui também