komplettes Ergebnis in einer Spalte

Hallo an alle,

ich habe hier ein Phänomen vor mir was ich mich überhaupt nicht erklären kann.

CREATE  OR REPLACE FUNCTION Test (Integer) RETURNS SETOF "Messwert" AS'
	
	SELECT "Fuehler_1","Timestamp" FROM "Messwert" where "Wert" = $1;
	
	/*
	SELECT * FROM "Messwert" where "Wert" = $1;
	*/
'LANGUAGE sql;

Ich erhalte stets als Ausgabe immer nur eine Tabelle wo alle Werte aus Fuehler_1 und Timestamp drinstehen. Warum? ich müstte doch 2 Spalten als Ergebnis erhalten oder? Ich habe das Verhalten ob bei Select * oder beim direkten benennen aller Spalten.

Vermutlich verwendest Du

select test(42)

Da die Funktion aber ein Set zurückgibt, musst Du sie wie eine Tabelle verwenden:

select * from test(42);

Kleiner Tipp am Rande: vermeide die doppelten Anführungsstriche in SQL - das bringt auf lange Sicht mehr Ärger als Nutzen.

Danke Castorp danke für die sehr schnelle Antwort. Aber ich versteh sie leider nicht ganz. Wenn ich dich richtig verstehe sollte ich nicht die Kurzschreibweise von Select test(42) nutzen sondern Select * from test(42) aber was sagt mir das genau? ich kenne nur den Aufruf Select * from test where … = 42 das wiederum würde doch dem entsprechen was ich oben geschrieben habe oder?

Das mit den Anführungsstrichen ist auch so eine Sache. Bei meinen Abfragen klappt nichts wenn nicht die Tabellenbezeichnungen (egal ob Umlaute oder Sonderzeichen enthalten sind) in Anführungsstrichen gesetzt sind. Ich vermute das ist irgendeine Einstellung aber ich habe noch nichts gefunden und mir die Finger schon wund gegoogelt.

neben dem von castorp gesagtem: was hat denn die Tabelle “Messwert” für einen Aufbau? Wenn Du SETOF “Messwert” definierst, dann sollte da auch dieser Tabellentyp rauskommen. Du hast im Select aber nur 2 Spalten Fuehler_1 und Timestamp, es gibt aber auch noch Wert, siehe Where-Condition. Das paßt nicht ganz zusammen.

Und ja: Du solltest den Body von Funktionen mit Dollarquoting behandeln, die ’ sind sowas von altmodisch …

Du meinst den Funktionsaufruf! Sorry! jetzt habe ich es gerafft! Aber kannst du vielleicht noch etwas zu den Anführungsstrichen sagen?

Um mal etwas verwirrung zu stiften…

test=*# create table foo (c1 int, c2 int, c3 int);
CREATE TABLE
test=*# create or replace function get_foo(int) returns setof foo as $$select c1, c2, c3 from foo where c3 = $1; $$language sql;
CREATE FUNCTION
test=*# insert into foo values (1,2,3);
INSERT 0 1
test=*# insert into foo values (4,5,6);
INSERT 0 1
test=*# insert into foo values (11,22,3);
INSERT 0 1
test=*# select * from get_foo(3);
 c1 | c2 | c3 
----+----+----
  1 |  2 |  3
 11 | 22 |  3
(2 Zeilen)

test=*# create or replace function get_foo(int) returns setof foo as $$select c1, c2 from foo where c3 = $1; $$language sql;
FEHLER:  Rückgabetyp von Funktion stimmt nicht überein; deklariert als foo
DETAIL:  Die letzte Anweisung gibt zu wenige Spalten zurück.
KONTEXT:  SQL-Funktion »get_foo«
test=*#

Die " mußt Du verwenden, weil Du klugerweise Tabellen und Spalten mit Großbuchstaben angelegt hast.

@akretschmer ihr macht mich hier fertig. Das geht ja wie das Bretzel backen hier! WOW!
Kannst du mir das mit dem Dollarquoting zeigen? bzw. einen link geben wo ich das nachlesen kann? ich finde immer nur diese Variante mit den ’ ’ und altmodisch will ich doch nicht bleiben!
Das mit dem Groß- und Kleinschreiben habe ich jetzt verstanden! danke dir!

@castorp ja Asche auf mein Haupt aber manche sollen auch wirklich so heißen! aber ich habe es jetzt gerafft!

@castorp: du hast meinen nicht vorhandenen Smily übersehen

@tutter: sieh mir in die Augen, ähm, den Code. $$ body $$. Das vereinfacht dann das gequote von z.B. Strings im Body gewaltig.

Jungs ihr seit Spitze. ich hätte gleich noch ein paar weitere Fragen g aber die formuliere ich in einem anderen Thread neu. Ich bin noch neu im Thema Postgresql aber so macht lernen Spaß! Danke für eure Hilfe!