Abfragefehler pgpsql: Anfrage hat keinen Bestimmungsort f�r die Ergebnisdaten

Hallo,

ich bin Neuling in Sachen PostgreSQL. Davor hab ich mit MSSQL gearbeitet aber auch da steck ich nicht so tief drin.
Ich benutzte Postgres 9.1 auf einem Win7 Rechner. Als Tool benutze ich PGAdminIII.
Alternativ hab ich auch ein Postgre 8.3 auf Dabian6 laufen.
Bei beiden Systemen tritt der selbe Fehler auf.

Ich habe eine Tabelle “tbl_coretemp_cpu_info” erfolgreich angelegt und m�chte mittels einer function daraus Ergebnisse zur�ckliefern.
Als erste Stufe ein ganz ‘einfacher’ select quasi. Wenn man den select einzeln ausf�hrt funktioniert dieser auch (liefert ein Resultset ins Abfragefenster).

Das script f�r die function:
[INDENT]
CREATE OR REPLACE FUNCTION fn_coretemp_cpu_info_get()
RETURNS TABLE(cpu_name character varying, core_count integer, cpu_speed double precision) AS
$BODY$
BEGIN
SELECT sz_cpu_name, n_core_count, n_cpu_speed FROM tbl_coretemp_cpu_info;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
ROWS 1000;
ALTER FUNCTION fn_coretemp_cpu_info_get()
OWNER TO postgres;
[/INDENT]

Damit wird die function fehlerfrei erstellt. Wenn ich aber nun in einem Abfragefenster die function gefolgt aufrufe:
[INDENT]SELECT * FROM fn_coretemp_cpu_info_get();
[/INDENT]

Bekomm ich folgende Fehlermeldung:[INDENT]
FEHLER: Anfrage hat keinen Bestimmungsort f�r die Ergebnisdaten
HINT: Wenn Sie die Ergebnisse eines SELECT verwerfen wollen, verwenden Sie stattdessen PERFORM.
CONTEXT: PL/pgSQL-Funktion �fn_coretemp_cpu_info_get� Zeile 3 bei SQL-Anweisung


********** Fehler **********

FEHLER: Anfrage hat keinen Bestimmungsort f�r die Ergebnisdaten
SQL Status:42601
Hinweis:Wenn Sie die Ergebnisse eines SELECT verwerfen wollen, verwenden Sie stattdessen PERFORM.
Kontext:PL/pgSQL-Funktion �fn_coretemp_cpu_info_get� Zeile 3 bei SQL-Anweisung
[/INDENT]


gleicher effekt mit:
[INDENT]SELECT * FROM fn_coretemp_cpu_info_get();

[/INDENT]
und wenn ich das Schl�sselwort ‘perform’ benutze liefert er mir eine Syntaxfehlermeldung. Perform scheint ihm vollkommenunbekannt zu sein.
Wie kann ich PGAdmin dazu bewegen mir dieses Resultset anzuzeigen? In den Toturials die ich bisher gesehen hab geht das so. Auch google sagt nich wirklich viel brauchbares zu dem Fehler.

Des weiteren hab ich herausgefunden das wenn ich die Sprache wechsel (statt pgpsql, sql bei language angegeben) bzw. die function wie unten umschreibe funktioniert die Abfrage mit dem SELECT * FROM fn_coretemp…
Ich bekomme ein Resultset angezeigt. Wieso funktioniert es dort?[INDENT]
CREATE OR REPLACE FUNCTION fn_coretemp_cpu_info_get()
RETURNS TABLE(cpu_name character varying, core_count integer, cpu_speed double precision) AS
$BODY$
SELECT sz_cpu_name, n_core_count, n_cpu_speed FROM tbl_coretemp_cpu_info;
$BODY$
LANGUAGE sql VOLATILE
COST 100
ROWS 1000;
ALTER FUNCTION fn_coretemp_cpu_info_get()
OWNER TO postgres;
[/INDENT]

Ich denke es kann nur eine Kleinigkeit sein. Aber ich verzweifel daran schon halb…

mfg Robert

Finde den Unterschied!

test=*# select * from foo;
 id |   t
----+-------
  1 | text1
  2 | text2
  3 | text3
(3 rows)

test=*# create or replace function get_foo() returns table (id int, t text) as $$begin select * from foo;end;$$language plpgsql;
CREATE FUNCTION
test=*# select * from get_foo();
ERROR:  query has no destination for result data
HINT:  If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT:  PL/pgSQL function get_foo() line 1 at SQL statement
test=*# create or replace function get_foo() returns table (id int, t text) as $$begin return query select * from foo;end;$$language plpgsql;
CREATE FUNCTION
test=*# select * from get_foo();
 id |   t
----+-------
  1 | text1
  2 | text2
  3 | text3
(3 rows)

Andreas

Sauber… genau der Anstoß den ich gebraucht hab :slight_smile: und das auch noch umgehend… besser gings nicht!

CREATE OR REPLACE FUNCTION fn_coretemp_cpu_info_get()
RETURNS TABLE(cpu_name character varying, core_count integer, cpu_speed double precision) AS
$BODY$
BEGIN
RETURN QUERY
SELECT sz_cpu_name, n_core_count, n_cpu_speed FROM tbl_coretemp_cpu_info;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
ROWS 1000;
ALTER FUNCTION fn_coretemp_cpu_info_get()
OWNER TO postgres;


So gehts :slight_smile: Danke!