sql >> Base de Datos >  >> RDS >> PostgreSQL

Establecer una opción personalizada en un procedimiento almacenado

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.

Nota:

  • quote_nullable() la función devolvería NULL 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.

Nota:

  • 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