2012-03-13 22 views
8

¿Estoy loco o simplemente tonto?"la función no existe", pero realmente creo que sí

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. 

Aquí está la CREATE FUNCTION, he omitido la carne del código, pero que debería ser irrelevante:

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; 

Y sólo por diversión:

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; 

Esa función se parece como existe. ¿Qué podría estar perdiendo?

Esto se resuelve, la respuesta es: soy tonto. Había definido incorrectamente los argumentos originalmente, pero mi código estaba usando los correctos. Hubo un extra bigint que no tenía nada que hacer allí.

+1

Se puede publicar la declaración 'crear function'? –

+0

¿Ejecutaste ambos en la misma sesión? Mismo usuario? Misma ruta de búsqueda? –

+0

Sí, solo hay un usuario. search_path se establece en public, SHOW lo confirma. Voy a editar con CREATE FUNCTION – echtish

Respuesta

2

Bueno, algo es impar. Lo hice:

[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) 

¿Ha tenido otros problemas con esta base de datos? ¿Puedes copiarlo con dump/restore y probar esto en la nueva copia? Califica explícitamente el nombre de la función con la ayuda del esquema "público"? ¿Qué versión de PostgreSQL estás usando?

actualización función SQL También funcionó bien para mí usando:

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

Pude reproducir @echtish creando la función como sql sin 'returns record'. Luego vi tu muestra como plpgsql y dejé la mía y creé la tuya y funcionó. Luego abandoné el suyo y ahora no puedo reproducir el problema con la misma función con la que estaba reproduciendo el problema al principio. Estoy usando 9.1 en Fedora 16 –

+0

La única explicación sensata es que 'search_path' no incluye el esquema' public'. Apuesto a que 'select public.abuse_resolve ('30 ':: bigint);' funciona. –

+0

@Clodoaldo: No puedo reproducirlo usando una función de SQL (9.1, Debian) – araqnid

1

probar este sintaxis:

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

Gracias, pero no hay alegría. Aún así, 'ERROR: function abuse_resolve (bigint) no existe' – echtish

+0

-1' select from' no es necesario en este caso –

2

Si es posible y si es ese problema. Recomiendo el uso de

"set search_path = mainSchemaName, secondOnes" 

para establecer esquema correcto donde se crea la función o en un lugar donde usted lo llama especificar directamente el nombre de esquema

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

Esto es todo. aquí.Olvidé definir mi nombre de esquema antes de mi función y eso estaba causando que no funcionara. ¡Gracias! –

Cuestiones relacionadas