无法在postgresql中创建函数

gmxoilav  于 2022-11-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(280)
CREATE OR REPLACE FUNCTION normalize(input text, separator text DEFAULT '')
RETURNS text AS $$
BEGIN
    RETURN translate(lower(public.f_unaccent(input)), ' '',:-`´‘’_' , separator);
END
$$ LANGUAGE 'plpgsql' IMMUTABLE;

当我执行时,我得到以下错误。我尝试了dos2unix,但没有帮助
错误:在“(“行1或其附近有语法错误:CREATE OR REPLACE FUNCTION规范化(输入文本、分隔符t...

zpqajqem

zpqajqem1#

正如@Adrian所评论的,normalize在标准SQL中是reserved word。但是在Postgres 13之前,它一直是允许的,在Postgres 13中添加了一个同名的系统函数。
添加SQL函数NORMALIZE()以规范化Unicode字符串,添加IS NORMALIZED以检查规范化(Peter Eisentraut)
“正常化”将其状态更改为:
非保留(不能是函式或型别)
我建议:

CREATE OR REPLACE FUNCTION f_normalize (input text, separator text DEFAULT '')
  RETURNS text
  LANGUAGE sql IMMUTABLE PARALLEL SAFE STRICT
  BEGIN ATOMIC
SELECT lower(public.f_unaccent(translate(input, $$',:-`´‘’_$$, separator)));
END;

最重要的是,让它成为PARALLEL SAFE(因为它是),否则你可能会后悔。

STRICT,因为所有使用的函数本身都是严格的--假设对于你的f_unaccent()
BEGIN ATOMIC需要Postgres 14或更高版本。(否则请将其设置为常规SQL函数。)请参阅:

此外,由于translate()是最便宜的操作,我会首先应用它来获得微小的整体增益。
最后,如果您的f_unaccent()函数是like this函数,您可以将附加操作添加到单个函数中,而不是创建另一个 Package 器。

相关问题