无法在 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) 通常没有用,正如已评论的那样。见:

Any downsides of using data type "text" for storing strings?

但这不是问题所在。 不同的角色或缺少权限也可能不是问题,这会产生不同的错误消息。

您的电话:

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 中创建的函数:“函数...不存在”的主要内容,如果未能解决你的问题,请参考以下文章

在shell脚本执行sql语句为啥会报错

如何在shell中调SQLPLUS 执行SQL语句

如何在shell中调SQLPLUS 执行SQL语句

多节点火花集群上的 spark-shell 无法在远程工作节点上旋转执行程序

在Windows下生成的shell文件在上传到Linux上发现无法执行

text CordovaError:无法在设备上执行shell命令“input,keyevent,82”“