2017-03-21 80 views
3

PL/pgSQL執行與執行有什麼區別?PL/pgSQL執行與執行

從手冊:

有時它是評估一個表達式或SELECT查詢但調用具有副作用,但沒有有用的結果值的函數當丟棄該結果,例如有用的。要在PL/pgSQL中執行此操作,請使用PERFORM語句。

但是,當我想是這樣的:

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

什麼也沒有發生。雖然這個查詢應該有副作用(創建表),並且結果可以被丟棄。

我覺得我得到1件事情吧:爲了運行功能,我可以使用執行:

perform pg_temp.addInheritance(foo); 
+1

'perform'替代'select'。它是select忽略返回,你不能'選擇'create table foo as(select 1)';' –

+0

換句話說,它不能對數據庫做任何改變? –

+1

它可以用同樣的方式選擇。不多不少。例如'select pg_create_restore_point('change to db');'或者從dblink_exec('local','create table ...')中選擇1作爲(i int)' –

回答

5

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)';有兩個步驟

  1. 評估表達'create table ' || some_var || '(a int)'
  2. 如果some_var是MYTAB例如,然後執行一個命令create table mytab(a int)

PERFORM語句用於函數調用,當功能不在賦值語句中使用。 EXECUTE用於評估動態SQL - 在運行時已知SQL格式的命令。

2

而且下一行docs you quote

此執行查詢,並丟棄結果。 將查詢寫入同一個 方式您可以編寫SQL SELECT命令,但用PERFORM替換關鍵字SELECT的初始 。

重點礦山

execute反過來執行動態查詢(上述相同文檔)