web-dev-qa-db-ja.com

一時テーブル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;

私は得る:

エラー:「DECLARE」行またはその近くの構文エラー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"は存在しません行11:FROM temp_table

(明らかに、私は上のコードでやっていることにtemp_tableは必要ないことを知っていますが、それは重要ではありません:) =>機能させるために構文を理解したいのです)

10
François M.

一時テーブルを作成するための適切な構文は次のとおりです。

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;

未テスト。これが失敗した場合はお知らせください。

15
dizzystar