PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

SQL-Status:42883, Keine Funktion stimmt mit dem angegebenen Namen und den Argumenttypen überein. Aber diese Funktion existiert tatsächlich

Höchstwahrscheinlich eine Frage von Schema vs. Schema search_path . Die Funktion wird im Standardschema des erstellenden Benutzers erstellt. Wenn das nicht im search_path steht des aktuellen Benutzers, es ist nicht sichtbar.

Einzelheiten:

Typischerweise erstellen Sie öffentliche Funktionen im Schema public und dieses Schema in jedem search_path haben .

CREATE OR REPLACE FUNCTION public.fun_validatepost(integer, integer)
  RETURNS integer AS
$BODY$
...
$BODY$ LANGUAGE plpgsql;
ALTER FUNCTION public.fun_validatepost(integer, integer) OWNER TO postgres;

Schema-Qualifizierung wird nur benötigt, wenn public ist sowieso nicht das Standardschema.

Auch Ihr GRANT Befehle machen keinen Sinn. Die EXECUTE Das Privileg für Funktionen wird public gewährt standardmäßig. Und sobald Sie public gewähren , müssen Sie anderen Benutzern nicht gewährt werden. Vor allem nicht zu postgres , das ist der OWNER sowieso und auch ein Superuser. Das Handbuch:

Sie müssen USAGE gewähren auf dem SCHEMA wo die Funktion erstellt wird. Die public Schema gewährt USAGE zu public (jeder) standardmäßig.

Neben 1

Umwandlung in integer ändert hier nichts, da ein numerisches Literal ohne Dezimalpunkt automatisch in Integer umgewandelt wird. Details zu Konstanten im Handbuch.

Beiseite 2

Erwägen Sie dringend, auf eine aktuelle Version von Postgres zu aktualisieren. Ihre Software ist völlig veraltet.