Solusi pertama
Sintaks untuk SET
adalah:
SET [ SESSION | LOCAL ] configuration_parameter { TO | = } { value |'value' | DEFAULT }
di mana value
adalah nilai baru untuk configuration_parameter
yang diberikan .
Untuk menetapkan nilai yang disimpan di _user_id
variabel, Anda perlu membuat perintah dinamis dan kemudian EXECUTE
itu.
Ini akan menjadi cara untuk melakukannya:
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;
$$;
Melampirkan SQL Fiddle tautan untuk tujuan pengujian.
Catatan:
quote_nullable()
fungsi akan mengembalikanNULL
jika argumen input adalah nol. Ini mungkin tidak diperlukan dalam kasus Anda.
Solusi kedua
Anda juga dapat mencapai hal yang sama dengan set_config()
berfungsi sebagai @a_horse_with_no_name dicatat. Fungsi Anda kemudian akan terlihat seperti ini:
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;
$$;
Melampirkan SQL Fiddle tautan untuk tujuan pengujian.
Catatan:
- Anda harus secara eksplisit memberikan argumen kedua ke tipe varchar
PERFORM
digunakan untuk mengevaluasi ekspresi dan membuang hasilnya karena tidak diperlukan- Anda dapat menggunakan
quote_nullable()
berfungsi di sini juga