我遇到了 PL/pgSQL 函数的问题,它根据条件返回不同的数据类型,并导致类型不匹配错误。这是该函数的简化版本:
CREATE OR REPLACE FUNCTION public.test(lever int)
RETURNS VARCHAR
LANGUAGE plpgsql
AS $function$
DECLARE
_new_record RECORD;
BEGIN
-- Evaluating the random condition and returning different strings
IF (lever = 0) THEN
SELECT * FROM
(VALUES(uuid_generate_anura()))x(id)
INTO _new_record;
ELSE
SELECT * FROM
(VALUES(10))x(id)
INTO _new_record;
END IF;
RETURN pg_typeof(_new_record.id)::varchar;
END;
$function$;
请注意,这是我的完整函数的非常简化的版本。我有兴趣了解为什么以及如何解决它。
当使用 调用此函数时lever = 0
,它会正确返回文本uuid
。然而,当用 with 调用它lever = 1
来强制ELSE
执行该语句时,它会抛出一个错误:
postgres=# select test(0);
test
------
uuid
(1 row)
postgres=# select test(1);
ERROR: type of parameter 4 (integer) does not match that when preparing the plan (uuid)
CONTEXT: PL/pgSQL function test(integer) line 15 at RETURN
无论数据类型如何,ELSE
块总是会失败。