PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Impostazione di un'opzione personalizzata in una procedura memorizzata

Prima soluzione

Sintassi per SET è:

SET [ SESSION | LOCAL ] configuration_parameter { TO | = } { value |'value' | DEFAULT }

dove value è il nuovo valore per un dato configuration_parameter .

Per assegnare un valore memorizzato in _user_id variabile, è necessario generare un comando dinamico e quindi EXECUTE esso.

Questo sarebbe il modo per farlo:

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;
$$;

Allegando SQL Fiddle collegamento a scopo di test.

Nota:

  • quote_nullable() funzione restituirebbe NULL se l'argomento di input è null. Potrebbe non essere necessario nel tuo caso.

Seconda soluzione

Potresti anche ottenere lo stesso risultato con set_config() funzione come @a_horse_with_no_name annotato. La tua funzione sarebbe quindi simile a questa:

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;
$$;

Allegando SQL Fiddle collegamento a scopo di test.

Nota:

  • Devi eseguire esplicitamente il cast del secondo argomento su un tipo varchar
  • PERFORM viene utilizzato per valutare un'espressione e scartare il risultato poiché non è necessario
  • Potresti usare quote_nullable() funzionano anche qui