2016-08-05 6 views
0

gibt Wenn ich die folgenden Anweisungen in PostgreSQL 9.4.8 laufen, bekomme ich diese Fehlermeldung:CREATE VIEW mehr Spaltennamen als Spalten

CREATE VIEW specifies more column names than columns.

Aber warum? Gibt f1 keine Tabelle mit 5 Spalten zurück und sollte v1 nicht auch 5 Spalten haben? Auch, wenn ich die Würfe aus der ersten SELECT Anweisung entfernen, ich diese Fehlermeldung:

Final statement returns unknown instead of character varying at column 1.

Aber warum? Der richtige Typ VARCHAR(20) ist von RETURNS bekannt. Warum gibt es also keine implizite Umwandlung von Strings wie '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); 'Ihre Variante gibt die einzelne Spalte des' record'-Typs zurück (einfach ausprobieren, ohne eine View zu erstellen). – Abelisto

+0

@Abelisto Ausgezeichnet, wenn Sie diesen Kommentar in eine Antwort verwandeln wollen, werde ich es akzeptieren. Thx auf jeden Fall. – Drux

Antwort

1

Betrachten Sie das einfache Beispiel:

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

Wenn eine Funktion in der Spalte/Variable Kontext nannte es den einzigen Wert des zurückkehrenden Typs angegeben zurück. Hier ist die Quelle des Fehlers: Die select der Ansicht gibt nur eine Spalte zurück.

jedoch, wenn die Funktion in der Tabelle Kontext aufgerufen dann gibt es die Werte wie eine echte Tabelle:

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

So sollten Sie den zweiten Ansatz verwenden, wenn Sie die Ansicht zu erstellen:

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

Thx & FYI: Ich habe eine [Follow-up] (http://stackoverflow.com/questions/38794976/error-column-specified-more-than-once) Frage gestellt. – Drux