Как получить доступ к внешним переменным области видимости из функции в PostgreSQL? - PullRequest
0 голосов
/ 31 января 2019

У меня есть этот код:

DO $$
DECLARE
    NODE_ID bigint :=  46;
BEGIN
    CREATE OR REPLACE FUNCTION funk(VAL bigint) 
    RETURNS bigint AS $f$
        BEGIN
            RETURN VAL;
        END; $f$ LANGUAGE plpgsql;

    RAISE NOTICE '%', funk(NODE_ID);
END $$;

Я работаю как положено и выводит 46 на консоль.Я хочу избавиться от параметров, потому что переменная является глобальной.Но я получаю ошибки:

DO $$
DECLARE
    NODE_ID bigint :=  46;
BEGIN
    CREATE OR REPLACE FUNCTION funk() 
    RETURNS bigint AS $f$
        BEGIN
            RETURN NODE_ID;
        END; $f$ LANGUAGE plpgsql;

    RAISE NOTICE '%', funk();
END $$;

Я получаю сообщение "NODE_ID не существует".Есть ли способ получить доступ к внешней переменной в функции?

1 Ответ

0 голосов
/ 31 января 2019

Нет, это не сработает, потому что функция не имеет никакого отношения к вашему блоку DO.Это постоянный объект базы данных, который будет продолжать существовать в базе данных после завершения блока DO.

По сути, функция - это просто строка с телом функции (и некоторыми метаданными, см. pg_proc);в этом случае тело функции состоит из текста между открытием и закрытием $f$.Он интерпретируется обработчиком языка при запуске функции.

Единственные данные базы данных, на которые вы можете ссылаться в функции, - это другие постоянные объекты базы данных, и переменная в блоке DO не является одной из этих.

В PostgreSQL нет глобальных переменных, за исключением - в некотором смысле - параметров конфигурации.Вы можете получить к ним доступ с помощью команд SQL SET и SHOW и, что более удобно в коде, с помощью функций set_config и current_setting.

...