関数の内部計算のためだけにテーブルを作成(および使用)するための構文の明確な説明が見つかりません。誰かが私に構文例を教えてくれませんか?
私が見つけたものから、私はこれを試しました(@
の前に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は必要ないことを知っていますが、それは重要ではありません:) =>機能させるために構文を理解したいのです)
一時テーブルを作成するための適切な構文は次のとおりです。
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;
未テスト。これが失敗した場合はお知らせください。