2016-08-05 94 views
0

如果我的PostgreSQL 9.4.8運行下面的語句,我收到此錯誤信息的列名: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.

但是,爲什麼?從RETURNS知道正確的類型VARCHAR(20),那麼爲什麼沒有隱含的字符串類型,如'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非常好,如果你想把這個評論變成答案,我會接受它。 Thx無論如何。 – Drux

回答

1

考慮簡單的例子:

postgres=# create function foofunc() returns table(a int, b text) language sql as $$ select 1, 'a'::text $$; 
postgres=# select foofunc(); 
╔═════════╗ 
║ foofunc ║ 
╠═════════╣ 
║ (1,a) ║ 
╚═════════╝ 

當稱爲在列/可變上下文功能它返回所指定的返回類型的單個值。這是錯誤的來源:視圖的select只返回一列。

但是,如果函數調用表中的情況下則返回像一個真正的表中的值:

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

所以,你應該使用,當你創建視圖的第二種方法:

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