sql >> Database >  >> RDS >> PostgreSQL

Een aangepaste optie instellen in een opgeslagen procedure

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



  1. Laravel 4:aangepaste login en controleer wachtwoord

  2. MySQL/Postgres-query 5 minuten intervalgegevens

  3. databaseschema voor productkenmerken

  4. Waarschuwing:mail() [function.mail]:kan geen verbinding maken met mailserver op localhost-poort 25