function return table

Hallo!

ich kämpfe mal wieder mit functions.
Die folgende function liefert mir als Ergebnis eine Spalte(statt 4) in der alle Felder mit Komma getrennt stehen und in “(” und “)” ein gefasst sind.

CREATE OR REPLACE FUNCTION fktmitarbeiter_kombi(IN adressnr integer)
  RETURNS TABLE(stma text, sttel text, stmfax text, stafax text) AS
$BODY$
Declare
	IntAdressNr alias for $1;
Begin
	RETURN QUERY
	SELECT 
		"tblMitarbeiter"."Anrede" + ' ' + "tblMitarbeiter"."Nachname" AS MA,
		"tblAdressenkopf"."Vorwahl" + '/' + "tblMitarbeiter"."DW" AS Tel,
		"tblMitarbeiter"."Fax"::text AS mFax,
		"tblAdressenkopf"."Fax"::text AS aFax
	FROM 
		public."tblAdressenkopf" 
		INNER JOIN public."tblMitarbeiter" ON "tblAdressenkopf"."AdressNr" = "tblMitarbeiter"."AdressNr" 
	WHERE 
		"tblAdressenkopf"."AdressNr"=IntAdressNr
	ORDER BY "tblMitarbeiter"."Nachname";
end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100
  ROWS 1000;
ALTER FUNCTION fktmitarbeiter_kombi(integer)
  OWNER TO master;

z. B.
“(“Herr Breuer”,4971-115)”
“(“Herr Dieter Leonhardt”,0341/4971-200,4971-115)”
“(“Herr Hans Frey”,0341/4971-332,4971-115,4971-115)”
“(“Herr Haupt”,4971-115)”
“(“Herr Herzog”,0341/4971-332,4971-115,4971-115)”
“(“Herr Keyser”,4971-115)”
“(“Herr Dr. König”,0341/4971-258,4971-350,4971-115)”

Wie erreiche ich eine Rückgabe wie ein View, mit Zeilen und Spalten?
Gruß Mafi

Und ich mit Deinen + - Zeichen, das sieht mir syntaktisch falsch aus. Wie rufst Du das auf?

Demo:

test=# select * from bla;
 id | name  | sortpos | sort2
----+-------+---------+-------
  1 | test  |       1 |
  2 | test2 |       2 |     2
(2 rows)

test=*# create or replace function xxx() returns table (out_id int, out_name text) as $$begin return query select id, name from bla; end;$$language plpgsql;
CREATE FUNCTION
test=*# select * from xxx();
 out_id | out_name
--------+----------
      1 | test
      2 | test2
(2 rows)

Hallo akretschmer,

Das mit den “+” könnte auch “&” zum “addieren” von Texten sein(so kenne ich es von Access).
z.B Feld: Anrede und " " und Feld: Nachname ergibt dann “Herr XYZ” als MA das funktioniert ja problemlos.

Mein Problem ist die Ausgabe von nur einer Spalte statt 4.

Aufruf

select fktmitarbeiter_kombi(913);

Gruß Mafi

Das + kennt PG aber so nicht, PG ist nicht Access. Und der Aufruf ist falsch, Demo:

test=*# select  xxx();
    xxx
-----------
 (1,test)
 (2,test2)
(2 rows)

test=*# select * from xxx();
 out_id | out_name
--------+----------
      1 | test
      2 | test2
(2 rows)

Hallo akretschmer,

ich mach das alles mit pgAdmin.
Der Aufruf ist ok! Es werden ja Daten geliefert!
Das mit dem “+” funkioniert, steht aber “&” gibts Fehler:

FEHLER:  Operator existiert nicht: character varying & unknown
LINE 2:   "tblMitarbeiter"."Anrede" & ' ' & "tblMitarbeiter"."Nachna...
                                    ^
HINT:  Kein Operator stimmt mit dem angegebenen Namen und den Argumenttypen überein. Sie müssen möglicherweise ausdrückliche Typumwandlungen hinzufügen.
QUERY:  SELECT 
		"tblMitarbeiter"."Anrede" & ' ' & "tblMitarbeiter"."Nachname" AS MA,
		"tblAdressenkopf"."Vorwahl" & '/' & "tblMitarbeiter"."DW" AS Tel,
		"tblMitarbeiter"."Fax"::text AS mFax,
		"tblAdressenkopf"."Fax"::text AS aFax
	FROM 
		public."tblAdressenkopf" 
		INNER JOIN public."tblMitarbeiter" ON "tblAdressenkopf"."AdressNr" = "tblMitarbeiter"."AdressNr" 
	WHERE 
		"tblAdressenkopf"."AdressNr"=IntAdressNr
	ORDER BY "tblMitarbeiter"."Nachname"
CONTEXT:  PL/pgSQL function "fktmitarbeiter_kombi" line 5 at RETURN QUERY
********** Fehler **********

wenn ich das mit dem zusammengesetzen Text weg lasse, ändert das nichts an der 1-spaltigen Ausgabe.

"(Breuer,,,4971-115)"
"("Dieter Leonhardt",4971-200,,4971-115)"
"("Hans Frey",4971-332,4971-115,4971-115)"
"(Haupt,,,4971-115)"
"(Herzog,4971-332,4971-115,4971-115)"
"(Keyser,,,4971-115)"
"(König,4971-258,4971-350,4971-115)"
"(Krause,,,4971-115)"

Mach bitte die Augen mal auf.

Das mit dem “+” funkioniert, steht aber “&” gibts Fehler:

FEHLER: Operator existiert nicht: character varying & unknown[/quote]

Der korrekte Operator wäre ||, siehe PostgreSQL: Documentation: 9.3: String Functions and Operators

>

Hallo akretschmer,

Danke für den Hinweis aber mit “||” wirds auch nicht besser.

Doch das ist der “Nebenkriegsschauplatz”.

Die Select-Anweisung liefert in einer View das korrekte Ergebnis.
Aber die Funktion eben nicht.



test=*# select  xxx();
test=*# select * from xxx();

Aufgabe: finde den Unterschied!

Hallo akretschmer,

Warum denn so kompliziert, sag doch gleich das der Trottel das “* from” beim Aufruf vergessen hat!

Danke!