SET LOCAL для ранее сохраненного значения - PullRequest
1 голос
/ 24 сентября 2019

Я хочу временно изменить lock_timeout в моей функции PL / pgSQL, и я подумал, что это будет так просто:

CREATE OR REPLACE FUNCTION public.myfunction()
RETURNS void AS
$body$
DECLARE
    l_tmp_lock_timeout TEXT;
BEGIN
    -- We want this to bail out when no lock is gained
    SHOW lock_timeout INTO l_tmp_lock_timeout;
    SET LOCAL lock_timeout TO '10s';
    RAISE NOTICE 'Local lock timeout set to 10s, was %', l_tmp_lock_timeout;

    -- ... do stuff ...

    -- and reset the lock timeout
    SET LOCAL lock_timeout TO l_tmp_lock_timeout;
    RAISE NOTICE 'Local lock timeout set to %', l_tmp_lock_timeout;

    RETURN;    
END;
$body$
LANGUAGE 'plpgsql'

Но это дает мне такой результат:

NOTICE:  Local lock timeout set to 10s, was 0
ERROR:  invalid value for parameter "lock_timeout": "l_tmp_lock_timeout"
CONTEXT:  SQL statement "SET LOCAL lock_timeout TO l_tmp_lock_timeout"
PL/pgSQL function myfunction() line 48 at SQL statement

Как правильно сохранить и сбросить настройку lock_timeout?

1 Ответ

2 голосов
/ 24 сентября 2019

Служебные операторы, такие как SET, нельзя использовать с параметрами.

Вам придется либо использовать динамический SQL, например

EXECUTE format('SET lock_timeout = %L', l_tmp_lock_timeout);

, либо использовать

SELECT set_config('lock_timeout', l_tmp_lock_timeout, FALSE);
...