使用EXISTS()函数的MariaDB查询在函数体内部不起作用

wqsoz72f  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(252)

我尝试检查例程是否存在,使用以下查询:

select exists(select 1 from information_schema.ROUTINES where ROUTINE_NAME = $name_of_routine);

它可以工作。所以我把它封装在一个函数中:

create
    definer = MES_DHSol@`%` function fn_routine_exists($name_of_routine varchar(64)) returns tinyint(1)
begin
    return exists(select 1 from information_schema.ROUTINES where ROUTINE_NAME = $name_of_routine);
end;

所以我可以这样使用它:

select fn_routine_exists('sp_result');

然而,它给我带来了一个错误:

[22003][1264] Out of range value for column 'CHARACTER_MAXIMUM_LENGTH' at row 1

解决方法

我已经让它工作了,没有使用EXISTS()

create
    definer = MES_DHSol@`%` function fn_routine_exists($name_of_routine varchar(64)) returns tinyint(1)
begin
    declare v_exists tinyint(1) default false;

    select true
    from information_schema.ROUTINES
    where ROUTINE_NAME = $name_of_routine
    into v_exists;

    return v_exists;
end;

仍然想知道为什么在函数内部使用EXISTS()会产生该错误。

xzabzqsa

xzabzqsa1#

这听起来像一个错误。
您有一些过程/函数返回的information_schema.ROUTINES CHARACTER_MAXIMUM_LENGTH字段的值超过了2G,但不知何故,这只在例程中触发。
我无法在最新的10.3、10.4或10.6上使用返回longblob的函数重现此问题(它应该有4G的结果,但它被截断了)。
请创建new bug report,包括MariaDB版本和sp_result的函数头,如果可能,还包括select * from information_schema.ROUTINES where ROUTINE_NAME='sp_result';

相关问题