sql >> Databáze >  >> RDS >> PostgreSQL

Stav SQL:42883, Zadanému názvu a typům argumentů neodpovídá žádná funkce. Ale tato funkce skutečně existuje

Nejpravděpodobněji je to otázka schématu vs. schéma search_path . Funkce je vytvořena ve výchozím schématu vytvářejícího uživatele. Pokud to není v search_path aktuálního uživatele, není vidět.

Podrobnosti:

Obvykle byste vytvořili veřejné funkce ve schématu public a mít toto schéma v každé 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;

Kvalifikace schématu je nutná pouze v případě, že je public stejně není výchozí schéma.

Také váš GRANT příkazy nedávají smysl. EXECUTE oprávnění pro funkce je uděleno public ve výchozím stavu. A jakmile udělíte public , není třeba udělovat dalším uživatelům. Zvláště ne na postgres , což je OWNER stejně a superuživatel taky. Příručka:

Musíte udělit USAGE na SCHEMA kde je funkce vytvořena. public schéma uděluje USAGE public (všichni) ve výchozím nastavení.

Stranou 1

Odesílání do integer zde nic nemění, protože číselný literál bez desetinné čárky je automaticky vynucen na celé číslo. Podrobnosti o konstantách v příručce.

Stranou 2

Urychleně zvažte aktualizaci na aktuální verzi Postgresu. Váš software je zcela zastaralý.




  1. Jak napsat politiku v Oracle SQL, která omezuje přístup k tabulce pro nevlastníky?

  2. Vyhledání a odstranění ne-ASCII znaků z Oracle Varchar2

  3. Chyba při aktualizaci databáze MySQL:DUPLIKÁT VÝCHOZÍ ZÁZNAM PRO PRIMÁRNÍ KLÍČ ='0'

  4. ukládání dat do databáze pomocí editace textu a tlačítka