为何SYSTEM$WAIT传数值正常,传入uniform函数调用却报错?
解决SYSTEM$WAIT传入函数参数报错的问题
核心原因
SYSTEM$WAIT的time参数要求传入字面量常量(比如直接写1、5这类固定数值),它在SQL语法解析阶段就会校验参数是否为常量值,不支持接收需要在执行阶段动态计算的表达式或函数调用。
虽然uniform(1, 10, random())的返回值类型是INTEGER,和直接传入1的类型一致,但它是一个需要运行时计算的表达式,不符合SYSTEM$WAIT对参数的常量要求,因此会抛出invalid value [UNIFORM(1, 10, RANDOM())] for parameter 'time'的错误。
解决方案
如果需要实现等待随机时长的效果,得先把随机值计算出来,再传递给SYSTEM$WAIT,比如用以下两种方式:
方式一:使用存储过程
CREATE OR REPLACE PROCEDURE wait_random_duration() RETURNS VARCHAR LANGUAGE SQL AS $$ DECLARE random_time INTEGER; BEGIN -- 先计算随机时长 SELECT uniform(1, 10, random()) INTO random_time; -- 将计算好的常量值传入SYSTEM$WAIT CALL SYSTEM$WAIT(random_time); RETURN 'Waited ' || random_time || ' seconds'; END; $$; -- 调用存储过程 CALL wait_random_duration();
方式二:使用脚本变量(以SnowSQL客户端为例)
SET random_time = (SELECT uniform(1, 10, random())); CALL SYSTEM$WAIT($random_time);
内容的提问来源于stack exchange,提问作者MrLoon
相关产品推荐
相关产品推荐

