sql >> Databasteknik >  >> RDS >> PostgreSQL

Ställa in ett anpassat alternativ i en lagrad procedur

Första lösningen

Syntax för SET är:

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

där värde är det nya värdet för en given configuration_parameter .

För att tilldela ett värde lagrat i _user_id variabel måste du generera ett dynamiskt kommando och sedan UTFÖR det.

Detta skulle vara sättet att göra det:

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

Bifogar SQL Fiddle länk för teständamål.

Obs!

  • quote_nullable() funktion skulle returnera NULL om inmatningsargumentet är null. Det kanske inte är nödvändigt i ditt fall.

Andra lösningen

Du kan också uppnå samma sak med code>set_config() fungerar som @a_horse_with_no_name noterat. Din funktion skulle då se ut så här:

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

Bifogar SQL Fiddle länk för teständamål.

Obs!

  • Du måste uttryckligen casta det andra argumentet till en varchar-typ
  • PERFORM används för att utvärdera ett uttryck och förkasta resultatet eftersom det inte behövs
  • Du kan använda quote_nullable() fungerar även här



  1. Går det snabbare att konvertera till varchar eller varchar till int när man jämför i MySQL?

  2. Återställer SQL Server Master Database

  3. Tabell Variable Style Entities i Oracle

  4. Lägg till en CHECK-begränsning till en befintlig tabell i SQL Server (T-SQL)