Выполнение PL/pgSQL против выполнения

В чем разница между выполнением и исполнением на PL/pgSQL?

Из руководства:

Иногда полезно оценивать выражение или запрос SELECT, но отбрасывать результат, например, при вызове функции, которая имеет побочные эффекты, но не имеет полезного значения результата. Для этого в PL/pgSQL используйте оператор PERFORM.

Но когда я пытаюсь что-то вроде:

perform 'create table foo as (select 1)';

Ничего не происходит. Хотя этот запрос должен иметь побочные эффекты (создание таблицы), и результат может быть отброшен.

Я думаю, что я прав 1: для запуска функций я могу использовать выполнить:

perform pg_temp.addInheritance(foo);

Ответ 1

PERFORM - это команда plpgsql, используемая для вызова функций void. PLpgSQL осторожен с бесполезными SELECT - SELECT без предложения INTO не допускается. Но иногда вам нужно вызывать функцию и вам не нужно сохранять результат (или функции не имеют никакого результата). Функция в SQL вызывается с помощью SELECT. Но это невозможно в PLpgSQL - так была введена команда PERFORM.

CREATE OR REPLACE FUNCTION foo()
RETURNS void AS $$
BEGIN
  RAISE NOTICE 'Hello from void function';
END;
$$ LANGUAGE plpgsql;

-- direct call from SQL
SELECT foo();

-- in PLpgSQL
DO $$
BEGIN
  SELECT foo(); -- is not allowed
  PERFORM foo(); -- is ok
END;
$$;

Операторы PERFORM выполняют параметр и забывают результат.

В вашем примере perform 'create table foo as (select 1)';

аналогично SELECT 'create table foo as (select 1)'. Возвращает строку "create table foo as (select 1)", и эта строка отбрасывается.

Оператор EXECUTE вычисляет выражение для получения строки. На следующем шаге эта строка выполняется.

Так что EXECUTE 'create table ' || some_var || '(a int)'; EXECUTE 'create table ' || some_var || '(a int)'; имеет два шага

  1. оценить выражение 'create table ' || some_var || '(a int)' 'create table ' || some_var || '(a int)'
  2. если some_var, например, mytab, то выполнить команду create table mytab(a int)

Оператор PERFORM используется для вызовов функций, когда функции не используются в операторе присваивания. EXECUTE используется для оценки динамического SQL - когда форма команды SQL известна во время выполнения.

Ответ 2

Далее следующая строка в docs вы указываете:

Выполняет запрос и отбрасывает результат. Записать запрос тем же вы должны написать команду SQL SELECT, но вместо ключевое слово SELECT с PERFORM.

Акцент на мине

execute, в свою очередь, выполняет динамический запрос (те же документы выше)