首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“函数不存在”,但我真的认为它存在。

“函数不存在”,但我真的认为它存在。
EN

Stack Overflow用户
提问于 2012-03-13 14:41:41
回答 4查看 26.3K关注 0票数 15

我是疯了还是傻乎乎的?

代码语言:javascript
复制
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,我省略了代码的主要部分,但这应该是无关紧要的:

代码语言:javascript
复制
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;

只是为了让你咯咯笑:

代码语言:javascript
复制
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不应该出现在那里。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-03-13 19:48:34

好吧,有件事很奇怪。我做到了:

代码语言:javascript
复制
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复制它,然后在新的副本上尝试此操作吗?使用"public“模式显式限定函数名是否有帮助?您使用的是哪个版本的PostgreSQL?

更新: sql函数它对我来说也很好用,使用:

代码语言:javascript
复制
create function abuse_resolve(inout __abuse_id bigint, out __msg text)
  language sql as $$ select $1, 'ok'::text $$;
票数 4
EN

Stack Overflow用户

发布于 2012-04-02 15:59:06

如果可以,如果这是问题所在。我推荐使用

代码语言:javascript
复制
"set search_path = mainSchemaName, secondOnes" 

要在创建函数的位置或直接调用函数的位置设置正确的模式,请指定模式名称

代码语言:javascript
复制
select schemaName.abuse_resolve('30'::bigint);
票数 3
EN

Stack Overflow用户

发布于 2012-03-13 14:47:11

尝试以下语法:

代码语言:javascript
复制
SELECT * FROM abuse_resolve('30'::bigint);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9679418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档