Eerste oplossing
Syntaxis voor SET
is:
SET [ SESSION | LOCAL ] configuration_parameter { TO | = } { value |'value' | DEFAULT }
waar value
is de nieuwe waarde voor een gegeven configuration_parameter
.
Om een waarde toe te wijzen die is opgeslagen in _user_id
variabele, moet je een dynamisch commando genereren en vervolgens EXECUTE
het.
Dit zou de manier zijn om dat te doen:
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;
$$;
SQL Fiddle toevoegen link voor testdoeleinden.
Opmerking:
quote_nullable()
functie zouNULL
teruggeven als het invoerargument null is. In jouw geval is het misschien niet nodig.
Tweede oplossing
U kunt hetzelfde bereiken met set_config()
functie zoals @a_horse_with_no_name genoteerd. Je functie ziet er dan zo uit:
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;
$$;
SQL Fiddle toevoegen link voor testdoeleinden.
Opmerking:
- Je moet expliciet een tweede argument casten naar een varchar-type
PERFORM
wordt gebruikt om een uitdrukking te evalueren en het resultaat te negeren omdat het niet nodig is- Je zou
quote_nullable()
. kunnen gebruiken functioneren hier ook