PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Festlegen einer benutzerdefinierten Option in einer gespeicherten Prozedur

Erste Lösung

Syntax für SET ist:

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

wobei wert ist der neue Wert für einen gegebenen configuration_parameter .

Um einen in _user_id gespeicherten Wert zuzuweisen Variable müssen Sie einen dynamischen Befehl generieren und dann AUSFÜHREN es.

Dies wäre der Weg, das zu tun:

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

Anhängen von SQL Fiddle Link zu Testzwecken.

Hinweis:

  • quote_nullable() Funktion würde NULL zurückgeben wenn das Eingabeargument null ist. In Ihrem Fall ist dies möglicherweise nicht erforderlich.

Zweite Lösung

Dasselbe könnten Sie auch mit set_config() Funktion als @a_horse_with_no_name notiert. Ihre Funktion würde dann so aussehen:

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

Anhängen von SQL Fiddle Link zu Testzwecken.

Hinweis:

  • Sie müssen das zweite Argument explizit in einen Varchar-Typ umwandeln
  • PERFORM wird verwendet, um einen Ausdruck auszuwerten und das Ergebnis zu verwerfen, da es nicht benötigt wird
  • Sie könnten quote_nullable() verwenden funktionieren auch hier