PostgreSQL-Fehler: function does not exist
ERROR: function round(double precision, integer) does not exist
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
Die Meldung ist auf eine Weise präzise, die leicht falsch gelesen wird: PostgreSQL sagt nicht "round existiert nicht" — es sagt, es existiert kein round, das (double precision, integer) nimmt. Die Funktion ist meist da, mit einer anderen Signatur, und der HINT über explizite Casts ist häufiger als nicht die eigentliche Lösung.
Was dieser Fehler bedeutet
PostgreSQL löst Funktionen nach Name und Argumenttypen auf (Overloading), mit begrenztem impliziten Casting. Das Beispiel ist der kanonische Fall: das zweiargumentige round() existiert für numeric, nicht für double precision — daher schlägt round(x, 2) auf einer Float-Spalte fehl, bis Sie casten. Derselbe Mechanismus erzeugt operator does not exist: text = integer für Vergleiche zwischen nicht zusammenpassenden Typen.
Häufige Ursachen
- Argumenttyp-Mismatch mit einer bestehenden Funktion — das round-Beispiel, oder benutzerdefinierte Funktionen, die mit den falschen Typen aufgerufen werden.
- Die Erweiterung ist nicht installiert:
uuid_generate_v4()brauchtuuid-ossp(obwohl modernes PostgreSQLgen_random_uuid()eingebaut hat — PostgreSQL 13+),ll_to_earth()brauchtearthdistance, und so weiter. - Installiert in einem Schema, das nicht auf
search_pathsteht — häufig, wenn Erweiterungen in einem dedizierten Schema wieextensionsleben. - Andere Umgebung: die Funktion oder Erweiterung existiert in Produktion, aber nicht in der Testdatenbank.
So diagnostizieren Sie ihn
\df round -- verfügbare Signaturen nach Name
\dx -- installierte Erweiterungen
-- Existiert die Funktion irgendwo außerhalb von search_path?
SELECT n.nspname, p.proname
FROM pg_proc p JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE p.proname = 'uuid_generate_v4';
So beheben Sie ihn
- Typ-Mismatch → casten Sie das Argument:
round(x::numeric, 2). Für Operatoren: vergleichen Sie kompatible Typen und casten Sie nach Möglichkeit die konstante Seite, damit Indizes auf der Spalte nutzbar bleiben. - Fehlende Erweiterung →
CREATE EXTENSION "uuid-ossp";(pro Datenbank, benötigt entsprechende Rechte) — oder bevorzugen Sie das eingebautegen_random_uuid()ab PostgreSQL 13+. - Schema → qualifizieren Sie den Aufruf (
extensions.uuid_generate_v4()) oder fügen Sie das Schema demsearch_pathauf Rollen-/Datenbankebene hinzu.
🔍
Dieselbe Auflösungsmaschinerie, Tabellen-Edition: relation does not exist.
