2016-08-05 22 views
0

よりも多くの列名を指定し、私は、このエラーメッセージが表示されます: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); 
+2

'テーブルのコンテキストで呼び出された関数は、それが真の表のような値を返す場合は

... select * from f1(1,2); 'あなたのバリアントは' record'型の単一の列を返します(ビューを作成せずに試してみてください)。 – Abelisto

+0

@Abelisto Excellent、このコメントを答えに変えたいなら、私はそれを受け入れます。どんな場合でもThx。 – Drux

答えて

1

は、単純な例を考えます。エラーの原因は次のとおりです。ビューのselectは1つの列しか返しません。

postgres=# select * from foofunc(); 
╔═══╤═══╗ 
║ a │ b ║ 
╠═══╪═══╣ 
║ 1 │ a ║ 
╚═══╧═══╝ 

ですから、あなたがビューを作成するときに、第2のアプローチを使用するようにすべきである:

CREATE VIEW v1 (c1, c2, c3, c4, c5) AS 
    SELECT * FROM f1 (1, 2); 
+0

Thx&FYI:[フォローアップ](http://stackoverflow.com/questions/38794976/error-column-specified-more-than-once)の質問を投稿しました。 – Drux

関連する問題