«Функция не существует», но я действительно думаю, что это делает - PullRequest
11 голосов
/ 13 марта 2012

Я сумасшедший или просто тупой?

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.

Вот CREATE FUNCTION, я опустил смысл кода, но это не имеет значения:

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;

И только для хихиканья:

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;

Эта функция, кажется, существует.Что я мог упустить?

Это решено, ответ: я тупой.Первоначально я неправильно определил аргументы, но мой код использовал правильные.Был дополнительный bigint, который не имел никакого отношения к этому.

Ответы [ 3 ]

3 голосов
/ 13 марта 2012

Ну, что-то странное.Я сделал:

steve@steve@[local] =# create function abuse_resolve(inout __abuse_id bigint,
                               out __msg text) returns record language plpgsql as
                               $$ begin __msg = 'ok'; end; $$;
CREATE FUNCTION
steve@steve@[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

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

Были ли у вас другие проблемы с этой базой данных?Вы можете скопировать его с помощью dump / restore и попробовать это на новой копии?Помогает ли явное определение имени функции с помощью «публичной» схемы?Какую версию PostgreSQL вы используете?

обновление: функция sql Для меня это также работало нормально:

create function abuse_resolve(inout __abuse_id bigint, out __msg text)
  language sql as $$ select $1, 'ok'::text $$;
3 голосов
/ 02 апреля 2012

Если вы можете и если это проблема. Я рекомендую использовать

"set search_path = mainSchemaName, secondOnes" 

для установки правильной схемы, где создается функция или в месте, где вы ее вызываете, прямо указывается имя схемы

select schemaName.abuse_resolve('30'::bigint);
1 голос
/ 13 марта 2012

Попробуйте этот синтаксис:

SELECT * FROM abuse_resolve('30'::bigint);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...