2016-03-18 100 views
5

我無法找到一個清楚的語法解釋來創建(和使用)僅用於函數內部計算的表。任何人都可以給我一個語法例子嗎?臨時表postgresql函數

從我發現,我已經嘗試了這一點(有和沒有@temp_table前):

CREATE FUNCTION test.myfunction() 
RETURNS SETOF test.out_table 
AS $$ 

DECLARE @temp_table TABLE 
( 
     id int, 
     value text 
) 
BEGIN 
INSERT INTO @temp_table 
     SELECT id, value 
     FROM test.another_table; 

INSERT INTO test.out_table 
     SELECT id, value 
     FROM @temp_table; 
RETURN END 
$$ LANGUAGE SQL; 

我得到:

ERROR: syntax error at or near "DECLARE" LINE 5: DECLARE @temp_table TABLE

-

我也試過建議使用CREATE TABLE方法here,這樣:

CREATE FUNCTION test.myfunction() 
RETURNS SETOF test.out_table 
AS $$ 

    CREATE TABLE temp_table AS 
     SELECT id, value 
     FROM test.another_table; 

    INSERT INTO test.out_table 
     SELECT id, value 
     FROM temp_table; 

$$ LANGUAGE SQL; 

而且我得到這個:

ERROR: relation "temp_table " does not exist LINE 11: FROM temp_table

(當然,我知道了temp_table不需要我在做什麼在上面的代碼,但是這不是問題的關鍵:) =>我要來理解語法,以得到它的工作)

+0

Postgres爲此使用臨時表。表變量是SQL Server的一項功能。 –

+0

在手冊中的哪裏找到語法'DECLARE @temp_table TABLE ...'? –

回答

8

適當的語法創建臨時表是

create temp table... 

,但你必須確保現有出來的功能之前,刪除臨時表。另外,我建議這樣的語法來代替:

CREATE TEMP TABLE IF NOT EXISTS temp_table AS 
    SELECT id, value 
    FROM test.another_table; 

因此,你的功能將是這樣的:

CREATE FUNCTION test.myfunction() 
RETURNS SETOF test.out_table 
AS $$ 

    CREATE TEMP TABLE IF NOT EXISTS temp_table AS 
     SELECT id, value 
     FROM test.another_table; 

    INSERT INTO test.out_table 
     SELECT id, value 
     FROM temp_table; 

DROP TABLE temp_table; 

$$ LANGUAGE SQL; 

但如果我能這麼好心,我想改寫這個功能,所以它更正確:

CREATE FUNCTION test.myfunction() 
RETURNS TABLE (id int, value varchar) -- change your datatype as needed 
AS $$ 
BEGIN; 
CREATE TEMP TABLE IF NOT EXISTS temp_table AS 
    SELECT id, value 
    FROM test.another_table; 

INSERT INTO test.out_table 
    SELECT id, value 
    FROM temp_table; 

DROP TABLE temp_table; 

RETURN QUERY 
SELECT id, value 
from temp_table; 

END; 
$$ LANGUAGE plpgsql; 

未經測試;讓我知道這是否失敗。

+0

明天我會測試它,並會讓你知道(並接受它,如果它的工作),在此期間,我只是想感謝你抽出時間:) –

+0

我得到一個語法錯誤,因爲CREATE '聲明。更確切地說,我得到以下結果:'錯誤:語法錯誤處於或接近「創建」'// '線路4:創建TEMP表格temp_mag_ref_compl AS' // '********** Erreur * *********'// '錯誤:語法錯誤處於或接近「創建」'// 'ÉtatSQL:42601' // 'Caractère:114' –

+0

是的,你是對的。我改變它添加「開始」;和「結束」;這應該防止語法錯誤。 – dizzystar