SQL Abfrage in SQL Funktion verpacken

Hallo,

Ich soll für eine Datenbank, die ähnlich eines sozialen Netzwerkes funktioniert, eine Funktion schreiben, die die Größe des Freundschaftsnetzwerkes berechnet, schreiben. Dabei sollen nur Freunde berücksichtigt werden, die einen Freundschaftsgrad über 8 haben.
Eine passende SQL Abfrage, die auch funktioniert habe ich bereits geschrieben:

SELECT COUNT(freundvon) AS anzahl
FROM istbefreundetmit
WHERE freundschaftsgrad>8 AND befreundetmit=1;

Wobei befreundetmit die ID des gefragten Freundes ist, dessen Netzwerkgröße berechnet wird. Jetzt soll ich daraus aber eine Funktion schreiben. Mein bisheriger Versuch sieht so aus:

CREATE OR REPLACE FUNCTION calculate_network(int) RETURNS int
as’
SELECT COUNT(freundvon) AS anzahl
FROM istbefreundetmit
WHERE freundschaftsgrad>8 AND befreundetmit=$1;
end;’
language ‚sql‘;

Das Problem ist nun, dass mir postgresql beim erstellen der Funktion sagt:
„return type mismatch in function declared to return integer“

Meine Frage: Warum ist das so? Die Count-Funktion sollte doch eigentlich einen int Wert ausgeben, welcher durch select an die Funktion zurück gegeben wird, oder nicht? Gibt es eine andere Möglichkeit die Funktion calculate_network(int) zu schreiben?

Vielen Dank schonmal im Voraus! (Ich habe leider von Datenbanken noch nicht allzuviel Ahnung …)

Liebe Grüße,
Munis

Hallo,
ich kenne mich in Postgresql nicht aus, mein Tip ist aber mal zu prüfen, ob der Wert des Ergebnisses die maximale Grösse von int überschreitet. BigInt verwenden ? Ansonsten mit der Fehlermeldung googeln.

Viele Grüsse

Jochen

Hallo Munis,
aus meiner Sicht liegt es daran, das Postgres nicht identifizieren kann, was zurück gegeben werden soll. Ich habe die Tabellen Struktur nicht, habe es aber mit einer anderen Tabelle ausprobiert:
CREATE OR REPLACE FUNCTION calculate_network(int) RETURNS int
as $$
BEGIN
RETURN(SELECT COUNT(freundvon) AS anzahl
FROM istbefreundetmit
WHERE freundschaftsgrad>8 AND befreundetmit=$1);
END;
$$
language ‚plpgsql‘;

Das solte funktionieren

Liebe Grüße,
Andreas

Hallo Andreas,

Jetzt funktioniert es und macht genau, was es sollte! Vielen, vielen Dank!

Liebe Grüße,
Munis

Hallo Munis,
trotz der Fehlermeldung
„return type mismatch in function declared to return integer“
habe ich den Eindruck, daß nur ein Syntaxfehler vorliegt, den man „mit dem Auge fast nicht sieht“ (z. B. Fehlendes Leezeichen oder etwas überflüssiges).
Mein Vorschlag:

CREATE OR REPLACE FUNCTION calculate_network(integer) RETURNS integer as ’
SELECT COUNT(freundvon) AS anzahl
FROM istbefreundetmit
WHERE freundschaftsgrad>8 AND befreundetmit=$1

language ‚sql‘;

  • Es darf nur :ein_ Semikolon ganz am Schluß stehen (das Statement selbst ohne „;“
  • Das „end;“ ist überflüssig (oder gar fehlerhaft, weiß ich jetzt nicht, habe schon jahrelang kein SQL geschrieben).

HTH
BF

Hallo Munis,

CREATE OR REPLACE FUNCTION calculate_network(int) RETURNS int
as ’
DECLARE
anzahl integer;
BEGIN
SELECT COUNT(freundvon) INTO anzahl
FROM istbefreundetmit
WHERE freundschaftsgrad>8 AND befreundetmit=$1;
RETURN anzahl;
END;’
language ‚plpgsql‘;

So sollte es klappen.

Viele Grüße
Holger