PostgreSQL имеет анонимные блоки DO, подробно объясненные здесь https://www.postgresql.org/docs/current/sql-do.html.
Это ясно указывает на то, что кодовый блок обрабатывается так, как если бы он был телом функции без параметров, возвращая void .Он анализируется и выполняется один раз.
Мне было интересно, есть ли способ выполнить блок DO без параметров, но возвращая тип динамически?
Следующий пример объяснит мое требование.Я хочу указать, что мое использование plpgsql является только примером!Это может быть любой LANGUAGE
в среде PostgreSQL
DO $$
BEGIN
Return SELECT table_schema, table_name FROM information_schema.tables
WHERE table_type = 'VIEW' AND table_schema = 'public'
END$$ LANGUAGE plpgsql;
ERROR: RETURN cannot have a parameter in function returning void
Прежде чем кто-либо переходит к разделу с ответами и объясняет, что я спрашиваю о противоречии, я хочу продолжить свою историю со следующим.PostgreSQL предоставляет CREATE LANGUAGE
функцию https://www.postgresql.org/docs/current/sql-createlanguage.html. Если мы посмотрим на параметр inline
, он скажет:
INLINE inline_handler
inline_handler - это имяранее зарегистрированная функция, которая будет вызываться для выполнения блока анонимного кода (команда DO) на этом языке.Если функция inline_handler не указана, язык не поддерживает блоки анонимного кода.Функция обработчика должна принимать один аргумент типа internal, который будет внутренним представлением команды DO, и он будет обычно возвращать void. Возвращаемое значение обработчика игнорируется.
Обычно возвращаютvoid
Возвращает ли обычно void , подразумевает ли это сценарий, в котором можно использовать блок DO
для возврата чего-то другого, кроме void?
Если естьэто метод для достижения анонимного выполнения кода, но без блока DO и с пользовательским типом возврата, мне было бы интересно.
Обратите внимание на тег internals вопроса: это вопрос о том, каквсе работает.