postgresql - 如何使用自定义枚举输入调用此 Postgres 函数?

标签 postgresql function enums naming-conventions identifier

我希望这很简单,但我已经尝试了多种组合,但我无法让 PostgreSQL 接受它们。它声称没有匹配的函数,但列出的类型(如下例所示)显然与我定义的函数匹配。

                                     List of data types
 Schema |  Name  | Internal name | Size | Elements | Access privileges | Description
--------+--------+---------------+------+----------+-------------------+-------------
 public | levels | levels        | 4    | debug   +|                   |
        |        |               |      | info    +|                   |
        |        |               |      | warn    +|                   |
        |        |               |      | critical |                   |

CREATE FUNCTION public."logEvent"(IN in_type text,IN in_priority public.levels,IN in_message text)
    RETURNS void
    LANGUAGE 'sql'
    NOT LEAKPROOF 
AS $function$
INSERT INTO public.log (type,priority,message) VALUES (in_type, in_priority, in_message);
$function$;

失败的查询:

SELECT 1 FROM public.logEvent('test'::text,'debug'::public.levels,'test from sql prompt'::text);
ERROR:  function public.logevent(text, levels, text) does not exist
LINE 1: SELECT 1 FROM public.logEvent('test'::text,'debug'::public.l...
                      ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

另一个函数定义:我在尝试执行这个创建函数调用时遇到同样的错误:

CREATE FUNCTION public."logEvent"(IN in_type text, IN in_priority text, IN in_message text)
    RETURNS boolean
    LANGUAGE 'sql'
    NOT LEAKPROOF
AS $function$
SELECT public.logEvent( in_type, CAST(lower(in_priority) AS public.levels), in_message);
$function$;

最佳答案

您知道双引号标识符区分大小写吗?

CREATE FUNCTION public.<b>"logEvent"</b>

但是:

SELECT 1 FROM public.<b>logEvent</b>

这应该有效:

SELECT 1 FROM public."logEvent"('test', 'debug', 'test from sql prompt');

仅当重载函数存在歧义时才需要显式类型转换。

要么在 "logEvent" 的其余部分保留双引号,要么(更聪明地)使用不带引号(实际上是小写)的合法标识符。

关于postgresql - 如何使用自定义枚举输入调用此 Postgres 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39360132/

相关文章:

c - postgres 如何获取 char varchar 和 text 数据类型的列大小

postgresql - 是否需要在函数内设置statement_timeout?

css - Sass 中是否有替换函数/脚本来交换 CSS 属性?

java - 为什么 Java 8 中没有 BooleanConsumer?

c - 如何逐个字母地考虑字符串并将它们与 if 函数进行比较?

java - 枚举 : Did I just do something unwanted?

javascript - 映射类型不能声明属性或方法 - TypeScript

java - 从枚举名称的字符串文字返回枚举值列表

database - 如何将大文件导入 PostgreSQL?

postgresql - 如何简化这个复杂的查询?