我尝试检查例程是否存在,使用以下查询:
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()
会产生该错误。
1条答案
按热度按时间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';
。