Ответ 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)';
имеет два шага
- оценить выражение
'create table ' || some_var || '(a int)'
'create table ' || some_var || '(a int)'
- если
some_var
, например, mytab, то выполнить командуcreate table mytab(a int)
Оператор PERFORM
используется для вызовов функций, когда функции не используются в операторе присваивания. EXECUTE
используется для оценки динамического SQL - когда форма команды SQL известна во время выполнения.