我正在尝试在我的数据库上运行内联查询 - 该数据库安装了 citext
扩展(使用 CREATE EXTENSION
) - 但执行的查询不断抛出此错误调用函数时出错:
type "citext" does not exist
DO
LANGUAGE plpgsql
$$
DECLARE
_id INT;
BEGIN
SELECT * FROM "dbo"."MyFunction"(_id, 'some value'::citext);
END;
$$;
如果我省略 ::citext
转换,它会显示:
function dbo.MyFunction(integer, unknown) does not exist. You might need to add explicit type casts.
添加了 citext
扩展,它是架构的一部分,可与其他查询一起使用。这种情况不断出现 - 是什么原因导致的?
编辑: 安装的扩展:
extname | nspname
----------+-----------
plpgsql | pg_catalog
citext | public
uuid-ossp | public
搜索路径:
show search_path;
search_path
-----------
dbo
最佳答案
正如怀疑的那样,search_path
中缺少扩展架构。在此相关答案中阅读如何设置架构搜索路径:
您的客户端似乎在连接上设置了 search_path = dbo
,这似乎配置错误。 dbo
是我们在 SQL Server 中经常看到的东西(曾经是这里的默认模式,或者仍然是?),对于 Postgres 来说非常不典型。不知道你是怎么到达那里的。
另一种选择是将扩展安装到 dbo
架构中:
您甚至可以 move (most) extensions to a different schema :
ALTER EXTENSION citext SET SCHEMA dbo;
但我建议安装专用架构的扩展并将其包含在 search_path
中。
无论如何,不要打扰plpgsql
。它是默认安装的,并且应该保留在 pg_catalog
中。
无论如何,使用不同的 search_path
设置来清理困惑。
关于第二个问题:遵循Function Type Resolution的规则。 。无法解析调用,因为 citext
没有隐式转换为 text
。
相关
关于postgresql - 附加模块 citext 已安装,但未找到类型 "citext"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39261729/