“名称”类型的 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

我有其他表 customervendor 等的工作函数,但无法弄清楚 name 表的语法。我怀疑问题源于表名是non-reserved keyword。

我无权重命名 name 表,因为这是在生产中。

我需要什么语法才能完成这项工作?

【问题讨论】:

哇!在我尝试过的所有事情中,为什么我没有想到这一点?这样可行。让它成为一个答案,我会接受它。 【参考方案1】:

有一个名为 name 的内置数据类型(位于 pg_catalog)比您的表类型具有更高的优先级。

所以参数类型其实是pg_catalog.name

为避免歧义,您需要将参数声明为全限定名:public.name

【讨论】:

以上是关于“名称”类型的 PostgreSQL 函数参数存在问题的主要内容,如果未能解决你的问题,请参考以下文章

在 PostgreSQL 中使用自定义类型并将它们用作函数中的参数

PostgreSQL 9.3 触发函数以参数化名称插入表

没有运算符与给定名称和参数类型匹配。您可能需要添加显式类型转换。 -- Netbeans、Postgresql 8.4 和 Glassfish

如何在postgresql函数中转换输入参数类型

PostgreSQL配置参数track_commit_timestamp

PostgreSQL配置参数track_commit_timestamp