"Функция не существует", но я действительно думаю, что это делает
Я сумасшедший или просто тупой?
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
там не было никакого дела.
4 ответа
Ну, что-то странное. Я сделал:
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 $$;
Если вы можете и если это проблема. Я рекомендую использовать
"set search_path = mainSchemaName, secondOnes"
установить правильную схему в месте создания функции или в месте, где вы ее вызываете, непосредственно указать имя схемы
select schemaName.abuse_resolve('30'::bigint);
Попробуйте этот синтаксис:
SELECT * FROM abuse_resolve('30'::bigint);
У меня было все, кроме использования схемы. Предоставление использования в схеме исправило это.