PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Stan SQL:42883, Żadna funkcja nie pasuje do podanej nazwy i typów argumentów. Ale ta funkcja faktycznie istnieje

Najprawdopodobniej kwestia schematu a schematu search_path . Funkcja jest tworzona w domyślnym schemacie użytkownika tworzącego. Jeśli nie ma tego w search_path bieżącego użytkownika, nie jest widoczny.

Szczegóły:

Zazwyczaj tworzysz funkcje publiczne w schemacie public i mieć ten schemat w każdej search_path .

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;

Kwalifikacja schematu jest potrzebna tylko wtedy, gdy public i tak nie jest domyślnym schematem.

Również Twój GRANT polecenia nie mają sensu. EXECUTE uprawnienia do funkcji są przyznawane public domyślnie. A kiedy przyznasz do public , nie ma potrzeby przyznawania uprawnień innym użytkownikom. Szczególnie nie do postgres , czyli OWNER w każdym razie i superużytkownika. Podręcznik:

Musisz przyznać USAGE na SCHEMA gdzie tworzona jest funkcja. public schemat przyznaje USAGE do public (wszyscy) domyślnie.

Na bok 1

Rzutowanie na integer nie zmienia niczego tutaj, ponieważ literał numeryczny bez kropki dziesiętnej jest automatycznie przekształcany w liczbę całkowitą. Szczegóły dotyczące stałych w podręczniku.

Na bok 2

Pilnie rozważ aktualizację do aktualnej wersji Postgresa. Twoje oprogramowanie jest całkowicie nieaktualne.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zapisać dane z przecinkiem zmieniającym się, które przechodzi przez wyzwalacz?

  2. Zresetuj licznik identyfikatorów po usunięciu tabeli()

  3. Jak sprawdzić, która funkcja używa typu?

  4. PostgreSQL uzyskaj i zwolnij LOCK wewnątrz zapisanej funkcji

  5. Pobierz rekordy, które są niezerowe po przecinku w PostgreSQL