2016-08-05 92 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