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 restituirebbeNULL
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