よりも多くの列名を指定し、私は、このエラーメッセージが表示されます:CREATE VIEWが列
CREATE VIEW specifies more column names than columns.
しかし、なぜ? f1
は5列のテーブルを返すのではなく、v1
に5列もあるべきではないでしょうか?私が最初にSELECT
の文からキャストを削除した場合にも、私は、このエラーメッセージが表示されます:
Final statement returns unknown instead of character varying at column 1.
しかし、なぜ?正しいタイプVARCHAR(20)
はRETURNS
から知られています。なぜ、'a'
のような暗黙の文字列のキャストはありませんか?カラム/変数コンテキストで呼び出された関数は、指定復帰タイプの単一の値を返す
postgres=# create function foofunc() returns table(a int, b text) language sql as $$ select 1, 'a'::text $$;
postgres=# select foofunc();
╔═════════╗
║ foofunc ║
╠═════════╣
║ (1,a) ║
╚═════════╝
:
CREATE OR REPLACE FUNCTION f1 (a1 INTEGER, a2 INTEGER)
RETURNS TABLE (c1 VARCHAR(20), c2 VARCHAR(20), c3 INTEGER, c4 VARCHAR(20), c5 VARCHAR(128))
AS $$
SELECT 'a'::VARCHAR(20), 'b'::VARCHAR(20), 1::INTEGER, 'c'::VARCHAR(20), 'd'::VARCHAR(128);
$$ LANGUAGE SQL;
CREATE VIEW v1 (c1, c2, c3, c4, c5)
AS SELECT f1 (1, 2);
'テーブルのコンテキストで呼び出された関数は、それが真の表のような値を返す場合は
... select * from f1(1,2); 'あなたのバリアントは' record'型の単一の列を返します(ビューを作成せずに試してみてください)。 – Abelisto
@Abelisto Excellent、このコメントを答えに変えたいなら、私はそれを受け入れます。どんな場合でもThx。 – Drux