2012-03-13 14 views
8

Czy jestem szalony czy po prostu głupi?"funkcja nie istnieje", ale naprawdę myślę, że to

dev=# \df abuse_resolve 
List of functions 
-[ RECORD 1 ]-------+------------------------------------------------------------------------------------------------------------------------------------ 
Schema    | public 
Name    | abuse_resolve 
Result data type | record 
Argument data types | INOUT __abuse_id bigint, OUT __msg character varying 
Type    | normal 

dev=# select abuse_resolve('30'::bigint); 
ERROR: function abuse_resolve(bigint) does not exist 
LINE 1: select abuse_resolve('30'::bigint); 
      ^
HINT: No function matches the given name and argument types. You might need to add explicit type casts. 

Oto CREATE FUNCTION, mam pominąć mięso kodu, ale to powinno być bez znaczenia:

CREATE OR REPLACE FUNCTION abuse_resolve(INOUT __abuse_id bigint, OUT __msg character varying) RETURNS record AS $_$ 
DECLARE 
    __abuse_status VARCHAR; 
BEGIN 
...snip... 
    UPDATE abuse SET abuse_status = __abuse_status, 
         edate = now(), 
         closed_on = now() 
       WHERE abuse_id  = __abuse_id; 
    __msg = 'SUCCESS'; 
END; 
$_$ LANGUAGE plpgsql SECURITY DEFINER; 

I właśnie dla chichotów:

GRANT ALL ON FUNCTION abuse_resolve(INOUT __abuse_id, OUT __msg character varying) TO PUBLIC; 
GRANT ALL ON FUNCTION abuse_resolve(INOUT __abuse_id, OUT __msg character varying) TO myuser; 

Funkcja ta wydaje się istnieje. Czego mógłbym zabraknąć?

To rozwiązuje się, odpowiedź brzmi: Jestem głupi. Nieumiejętnie zdefiniowałem argumenty, ale mój kod korzystał z poprawnych. Był dodatkowy obiekt, który nie miał żadnego interesu.

+1

można opublikować 'utworzyć oświadczenie zakresie funkcji? –

+0

Czy wykonałeś obie w tej samej sesji? Ten sam użytkownik? Ta sama ścieżka wyszukiwania? –

+0

Tak, jest tylko jeden użytkownik. search_path jest ustawiona na public, SHOW potwierdza to. Będę edytować za pomocą CREATE FUNCTION – echtish

Odpowiedz

2

No, coś jest dziwne. Zrobiłem:

[email protected]@[local] =# create function abuse_resolve(inout __abuse_id bigint, 
           out __msg text) returns record language plpgsql as 
           $$ begin __msg = 'ok'; end; $$; 
CREATE FUNCTION 
[email protected]@[local] =# \df abuse_resolve 
List of functions 
-[ RECORD 1 ]-------+---------------------------------------- 
Schema    | so9679418 
Name    | abuse_resolve 
Result data type | record 
Argument data types | INOUT __abuse_id bigint, OUT __msg text 
Type    | normal 

[email protected]@[local] =# select abuse_resolve('30'::bigint); 
-[ RECORD 1 ]-+-------- 
abuse_resolve | (30,ok) 

Miałeś jakieś inne problemy z tej bazy danych? Czy możesz skopiować go za pomocą dump/restore i wypróbować to na nowej kopii? Czy jawnie kwalifikuje się nazwa funkcji za pomocą schematu "publicznego"? Którą wersję PostgreSQL używasz?

zmiana: SQL funkcja również pracował w porządku dla mnie, używając:

create function abuse_resolve(inout __abuse_id bigint, out __msg text) 
    language sql as $$ select $1, 'ok'::text $$; 
+0

Udało mi się odtworzyć @echtish tworząc funkcję jako sql bez 'zwraca rekord'. Wtedy zobaczyłem twoją próbkę jako plpgsql i upuściłem swój własny i stworzyłem twoje i zadziałało. Potem upuściłeś swoje i teraz nie mogę już odtworzyć problemu z tą samą funkcją, z jaką początkowo odtwarzałem problem. Używam 9.1 w Fedorze 16 –

+0

Jedynym rozsądnym wyjaśnieniem jest to, że 'search_path' nie zawiera schematu' public'. Założę się, że 'select public.abuse_resolve ('30 ':: bigint);' works. –

+0

@Clodoaldo: Nie mogę odtworzyć go za pomocą funkcji SQL (9.1, Debian) – araqnid

1

Spróbuj składnię:

SELECT * FROM abuse_resolve('30'::bigint); 
+0

Dzięki, ale bez radości. Nadal "BŁĄD: funkcja abuse_resolve (bigint) nie istnieje" – echtish

+0

-1 'wybierz z' nie jest konieczne w tym przypadku –

2

Jeśli możesz, a jeśli jest to problem. Polecam używać

"set search_path = mainSchemaName, secondOnes" 

ustawić prawidłowy schemat gdzie funkcja jest tworzona lub w miejscu, gdzie można nazwać to bezpośrednio określić nazwę schematu

select schemaName.abuse_resolve('30'::bigint); 
+0

To jest to. tutaj.Zapomniałem zdefiniować swoją nazwę schematu przed moją funkcją i to powodowało, że nie działała. Dzięki! –

Powiązane problemy