“名称”类型的 PostgreSQL 函数参数存在问题
Posted
技术标签:
【中文标题】“名称”类型的 PostgreSQL 函数参数存在问题【英文标题】:Problem with PostgreSQL function parameter of type "name" 【发布时间】:2021-11-26 15:05:16 【问题描述】:我正在编写一些 PostgreSQL 函数来编译一个名为 name
的表中记录的搜索词列表。由于搜索词来自name
表的多个列以及其他表的多个列,因此一个简单的生成列是不够的。
这是该函数的简化版本。
CREATE OR REPLACE FUNCTION compile_name_search_terms(n name) RETURNS text AS $$
BEGIN
return n.id || ' ' ||
COALESCE(n.full_name, '') || ' ' ||
COALESCE(n.phone, '') || ' ' ||
regexp_replace(COALESCE(n.phone, ''), '[\(\)-]', '', 'g');
END
$$ LANGUAGE plpgsql;
尝试执行
SELECT id, compile_name_search_terms(t) FROM name AS t;
抛出错误
ERROR: function compile_name_search_terms(public.name) does not exist
LINE 1: SELECT id, compile_name_search_terms(t) FROM name AS t;
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
SQL state: 42883
Character: 12
我有其他表 customer
、vendor
等的工作函数,但无法弄清楚 name
表的语法。我怀疑问题源于表名是non-reserved keyword。
我无权重命名 name
表,因为这是在生产中。
我需要什么语法才能完成这项工作?
【问题讨论】:
哇!在我尝试过的所有事情中,为什么我没有想到这一点?这样可行。让它成为一个答案,我会接受它。 【参考方案1】:有一个名为 name 的内置数据类型(位于 pg_catalog
)比您的表类型具有更高的优先级。
所以参数类型其实是pg_catalog.name
。
为避免歧义,您需要将参数声明为全限定名:public.name
【讨论】:
以上是关于“名称”类型的 PostgreSQL 函数参数存在问题的主要内容,如果未能解决你的问题,请参考以下文章
在 PostgreSQL 中使用自定义类型并将它们用作函数中的参数
没有运算符与给定名称和参数类型匹配。您可能需要添加显式类型转换。 -- Netbeans、Postgresql 8.4 和 Glassfish