PostgreSQL: тип void retun анонимного блока DO - PullRequest
1 голос
/ 10 июля 2019

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 вопроса: это вопрос о том, каквсе работает.

1 Ответ

0 голосов
/ 10 июля 2019

Вы не можете вернуть результаты с DO.

Ближайшим эквивалентом будет создание функции в схеме pg_temp, которая затем будет временной функцией и автоматически удаляется при завершении сеанса базы данных.

...