当前位置: 首页 > 知识库问答 >
问题:

plpgsql:没有与给定名称和参数类型匹配的函数。您可能需要添加显式类型转换

桑飞语
2023-03-14

我使用DBEaver在PostgreSQL中创建了一个存储过程。我正试图通过从DBeaver调用过程将数据插入到表中。但这给了我一个错误

SQL错误[42883]:错误:函数public.proc_insert_test(integer,unknown,unknown,unknown,unknown,unknown,timestamp with time zone,integer,integer,integer,timestamp with time zone)不存在提示:没有与给定名称和参数类型匹配的函数。您可能需要添加显式类型转换。职位:8

程序:

CREATE OR REPLACE FUNCTION public.proc_insert_test(p_brndcode integer, 
                                                p_brndname varchar(100), 
                                                p_brndsname varchar(100), 
                                                p_prdtype char(1),
                                                p_discontinue char(1),
                                                p_crddate date,
                                                p_status integer,
                                                p_recstat integer,
                                                p_brndgrpseqno integer,
                                                p_wefrom date)
RETURNS char 
LANGUAGE plpgsql
AS $body$
BEGIN
    Insert into arc_mmstbrndgroup(brndcode, brndname, brndsname, prdtype, discontinue, crddate, status, recstat, brndgrpseqno, wefrom) 
    values(p_brndcode, p_brndname, p_brndsname, p_prdtype, p_discontinue, p_crddate, p_status, p_recstat, p_brndgrpseqno, p_wefrom);
END;
$body$
;

调用过程:

select public.proc_insert_test(123, 'Test2', 'Test2', 'T', 'T', now(), 1, 9, 1234, now());

问题可能是什么?

我对此完全陌生。

select public.proc_insert_test(123, 'Test2'::varchar(100), 'Test2'::varchar(100), 'T'::char(1), 'T'::char(1), now(), 1, 9, 1234, now());

SQL错误[42883]:错误:函数public.proc_insert_test(integer,character variing,character,character,timestamp with time zone,integer,integer,integer,timestamp with time zone)不存在提示:没有与给定名称和参数类型匹配的函数。您可能需要添加显式类型转换。职位:8

共有1个答案

太叔经赋
2023-03-14

Postgres不允许将时间戳隐式转换为日期数据类型。注意-Postgresdate类型与Oracle的date类型不同。

 CREATE OR REPLACE FUNCTION public.test(v date)
  RETURNS void
  LANGUAGE plpgsql
 AS $function$
 BEGIN
   RAISE NOTICE '%', v;
 END;
 $function$

postgres=# SELECT test(now());
ERROR:  function test(timestamp with time zone) does not exist
LINE 1: SELECT test(now());
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
postgres=# SELECT test(current_date);
NOTICE:  2019-11-14
+------+
| test |
+------+
|      |
+------+
(1 row)

postgres=# SELECT test(now()::date);
NOTICE:  2019-11-14
+------+
| test |
+------+
|      |
+------+
(1 row)

timestampnow()函数的结果类型)到date的转换正在丢失转换。默认情况下不允许。因此您应该强制执行它(通过显式强制转换),或者您应该使用返回date类型的伪常量current_date,并且不需要任何转换。

 类似资料: