web-dev-qa-db-ja.com

SELECT .. INTOでPL / pgSQLにテーブルを作成します

SELECT INTOを使用して、関数の1つで一時テーブルを作成したい。 SELECT INTOはSQLで機能しますが、PL/pgSQLでは機能しません。

次のステートメントは、mytableというテーブルを作成します(orig_tableがリレーションとして存在する場合):

SELECT *
INTO TEMP TABLE mytable
FROM orig_table;

しかし、この関数をPostgreSQLに入れると、エラーが発生します:ERROR: "temp" is not a known variable

CREATE OR REPLACE FUNCTION whatever()
RETURNS void AS $$
BEGIN
    SELECT *
    INTO TEMP TABLE mytable
    FROM orig_table;
END; $$ LANGUAGE plpgsql;

PL/pgSQL内でSELECT INTO型の変数recordを使用できますが、そのレコードからデータを取得するときに構造を定義する必要があります。 SELECT INTOは本当にシンプルです-SELECTクエリと同じ構造のテーブルを自動的に作成します。これが関数内で機能しない理由について誰にも説明がありますか?

SELECT INTOは、宣言した変数を選択できるため、PL/pgSQLでは異なる動作をするようです。ただし、一時テーブル構造を宣言したくありません。 SQLの場合と同じように、構造を自動的に作成するだけでいいのですが。

28
nnyby

試して

CREATE TEMP TABLE mytable AS
SELECT *
FROM orig_table;

http://www.postgresql.org/docs/current/static/sql-selectinto.html

CREATE TABLE ASは、機能的にはSELECT INTOに似ています。この形式のSELECT INTOは、INTO句の解釈が異なるため、ECPGまたはPL/pgSQLでは使用できないため、CREATE TABLE ASが推奨される構文です。さらに、CREATE TABLE ASは、SELECT INTOによって提供される機能のスーパーセットを提供します。

46
Kuberchaun