2

我正在尝试在我的数据库上运行内联查询 - 已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
4

1 回答 1

2

正如怀疑的那样,扩展架构从search_path. 在此相关答案中阅读有关如何设置架构搜索路径的信息:

似乎您的客户端设置 search_path = dbo为连接,这似乎配置错​​误。dbo是我们在 SQL Server 中看到的很多东西(这里曾经是默认架构还是现在仍然是?),对于 Postgres 来说非常不典型。不知道你是怎么到那里的。

一种替代方法是将扩展也安装到dbo架构中:

您甚至可以将(大多数)扩展移动到不同的架构

ALTER EXTENSION citext SET SCHEMA dbo;

但我建议将扩展安装到专用架构并将其包含在search_path.

plpgsql无论如何不要管。它是默认安装的,应该保留在pg_catalog.

search_path一种或另一种方式,用不同的设置清理混乱。


至于第二个问题:这是由Function Type Resolution的规则指导的。该调用无法解析,因为citext没有隐式转换为text.

有关的

于 2016-09-01T02:46:57.297 回答