无法在 sql shell 上执行在 pgAdmin 中创建的函数:“函数...不存在”
Posted
技术标签:
【中文标题】无法在 sql shell 上执行在 pgAdmin 中创建的函数:“函数...不存在”【英文标题】:Can't execute function created in pgAdmin on sql shell: "function ... does not exist" 【发布时间】:2021-09-12 06:53:21 【问题描述】:以下是我得到的错误:
postgres=# select bcount('Deccan');
ERROR: function bcount(unknown) does not exist
LINE 1: select bcount('Deccan');
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
以下是我在 pgAdmin 中的程序:
create function bcount(brname char(30)) returns int as $$
declare
total_no int;
begin
select count(cno) into total_no from Branch,Ternary where Branch.bid=Ternary.bid and br_name=brname;
return total_no;
end;
$$
language plpgsql
【问题讨论】:
使用text
而不是char(30)
作为参数类型。永远不要使用胖 char
。
我已将数据类型更改为“文本”,但仍然无法正常工作。
函数定义和选择执行是否选择同一个数据库?
那么你有答案了吗?
【参考方案1】:
char(30)
通常没有用,正如已评论的那样。见:
但这不是问题所在。 不同的角色或缺少权限也可能不是问题,这会产生不同的错误消息。
您的电话:
select bcount('Deccan');
... 使用无类型字符串常量作为参数将被强制转换为类型,只要在 search_path
中找到该名称的 任何 函数。
说到这里,你的 pgAdmin 环境中的search_path
是什么?换句话说,你的函数是在什么schema中创建的?检查:
SELECT pronamespace::regnamespace AS schema, proname
, pg_get_functiondef(oid)
FROM pg_proc
WHERE proname = 'bcount';
你的 psql 环境中的search_path
是什么?是否包含函数的架构?
SHOW search_path;
见:
How does the search_path influence identifier resolution and the "current schema"要么是这样,要么你连接到了错误的数据库。一个 Postgres 数据库集群由任意数量的数据库组成。如果您没有连接到特定的数据库,您最终可能会进入名为“postgres”的默认维护数据库。在 psql 中,切换:
\c my_database
或者您完全连接到错误的数据库集群。
【讨论】:
以上是关于无法在 sql shell 上执行在 pgAdmin 中创建的函数:“函数...不存在”的主要内容,如果未能解决你的问题,请参考以下文章
多节点火花集群上的 spark-shell 无法在远程工作节点上旋转执行程序