GBase 8a
适配迁移
问答

存储过程循环创建问题

发表于2026-07-03 17:10:0531次浏览5个评论

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

【GBase版本】:9.5.3.099

【操作系统】:

【CPU】:

【问题描述】*:

有关loop的存储过程怎么创建

悬赏:10吉币
回答被发帖人采纳后可获得赏金

评论

登录后才可以发表评论
欧皇发表于 1个月前
正文图挂了
banjin发表于 1个月前
DELIMITER //
CREATE PROCEDURE proc_loop_demo()
BEGIN
DECLARE v_i INT DEFAULT 1;
-- 定义loop标签
my_loop: LOOP
-- 业务逻辑
SELECT CONCAT('当前值:', v_i);

-- 循环终止条件:i>5 退出
EXIT my_loop WHEN v_i > 5;

SET v_i = v_i + 1;
END LOOP my_loop;
END //
DELIMITER ;

-- 调用
CALL proc_loop_demo();
参考以下呢
欧皇发表于 1个月前
您那儿 能直接创建么?我这里报错呀
用户头像
liaosnet发表于 27天前
@欧皇:你这个是8a,需要转到8a mpp版块。
BYRAN发表于 16天前
一、报错原因
报错:Unknown system variable 'LOOP_LABLE',系统把循环标签当成了变量,一共 4 处核心错误:
错误 1:标签拼写错误
你写的是 LOOP_LABLE,正确单词是 LOOP_LABEL(label 是 a 在前 e 在后),拼写错导致识别异常。
错误 2:判断条件使用了不存在变量 var
入参是 v_counter,代码里 if var >5 then,var 未定义,应该用 v_counter。
错误 3:GBase 8a MPP 存储过程语法分隔符缺失
直接执行会把 ; 当成语句结束,必须先修改语句结束符 DELIMITER。
错误 4:循环逻辑本身有问题
当前代码一进循环就判断 v_counter>5,传入 1 的话永远不会执行 leave,会死循环。



二、 完整修改

-- 修改语句结束符为//,避免存储过程内;截断脚本
DELIMITER //

-- 如果存储过程存在先删除
DROP PROCEDURE IF EXISTS test_loop;

-- 创建存储过程
CREATE PROCEDURE test_loop
(IN v_counter INT)
BEGIN
-- 循环标签修正拼写:LABEL
LOOP_LABEL: LOOP
IF v_counter > 5 THEN
SET v_counter = v_counter + 1;
-- 跳出循环,标签拼写同步修正
LEAVE LOOP_LABEL;
END IF;
-- 自增,否则死循环
SET v_counter = v_counter + 1;
END LOOP LOOP_LABEL;

SELECT v_counter AS status;
END //

-- 恢复默认语句结束符;
DELIMITER ;

-- 调用测试
CALL test_loop(1);