2016-03-18 9 views
5

関数の内部計算のためだけにテーブルを作成(および使用)する構文についての明確な説明が見つかりません。誰か私に文法例を教えてもらえますか?私が見つけたものを、私はこれ(ととtemp_table@なし)しようとしているから一時テーブルpostgresql関数

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; 

そして、私はこれを取得:私はしたい(もちろん、私はTEMP_TABLEは、私は上記のコードでやっている何のために必要ではないが、それはポイントではありません:) =承知している>

ERROR: relation "temp_table " does not exist LINE 11: FROM 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 'ステートメント。より正確には、私は次のようになります: 'ERROR:構文エラー"または "near"を作成する "// ' LINE 4:TEMP TABLEを作成するtemp_mag_ref_compl AS' // '' ********** Erreur * ********* '// 'エラー:「作成」「// 」のSQL文:42601' // 'Caractère:114' –

+0

のところで構文エラーが発生しました。私はそれを "begin;"を追加するように変更した。そして終わり;"それは構文エラーを防ぐはずです。 – dizzystar

関連する問題