PERFORM
是用於空隙函數的調用PLPGSQL命令。 PLpgSQL注意無用的SELECT
語句 - SELECT
沒有INTO
子句是不允許的。但有時你需要調用一個函數,而且你不需要存儲結果(或者函數沒有任何結果)。聲明中調用SQL
中的函數。但在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)';
有兩個步驟
- 評估表達
'create table ' || some_var || '(a int)'
- 如果
some_var
是MYTAB例如,然後執行一個命令create table mytab(a int)
的PERFORM
語句用於函數調用,當功能不在賦值語句中使用。 EXECUTE
用於評估動態SQL - 在運行時已知SQL格式的命令。
'perform'替代'select'。它是select忽略返回,你不能'選擇'create table foo as(select 1)';' –
換句話說,它不能對數據庫做任何改變? –
它可以用同樣的方式選擇。不多不少。例如'select pg_create_restore_point('change to db');'或者從dblink_exec('local','create table ...')中選擇1作爲(i int)' –