PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Configurando uma opção personalizada em um procedimento armazenado

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 retornaria NULL 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