mysql切片遍历_mysql 12,23,4 list 的遍历处理

如下面的遍历

CREATE DEFINER = 'root'@'localhost'

PROCEDURE zita_wms.DeliveryOrderUtil_ConfirmByList(

OUT confirmed_no_ INT,

OUT not_confirmed_no_ INT,

IN company_id_ INT,

IN order_list_ VARCHAR(20000), -- 12,23,4

IN user_id_ VARCHAR(40) )

BEGIN

DECLARE order_id_ INT;

DECLARE is_confirmed_ INT;

DECLARE get_list CURSOR FOR

SELECT d.id

FROM delivery_order d, sys_array_tab a

WHERE d.id = a.content

AND d.logistics_company_id = company_id_;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET order_id_ = NULL;

SET confirmed_no_ = 0 ;

SET not_confirmed_no_ = 0 ;

CALL sys_array(order_list_, ',');

OPEN get_list;

order_list: LOOP

FETCH get_list INTO order_id_;

IF order_id_ IS NULL THEN

LEAVE order_list;

END IF;

--

CALL DeliveryOrderUtil_Confirm(is_confirmed_ , order_id_, user_id_ );

IF is_confirmed_ = 1 THEN -- 1:确认成功 0:确认失败

SET confirmed_no_ = confirmed_no_ + 1 ;

ELSE

SET not_confirmed_no_ = not_confirmed_no_ + 1 ;

END IF;

COMMIT; -- 业务需求, 确认一个订单就提交一个

END LOOP;

CLOSE get_list;

END

对应工具类, 创建临时表,删除数据,遍历数据插入

CREATE DEFINER = 'root'@'localhost'

PROCEDURE zita_wms.sys_array(IN content_ VARCHAR(20000), IN separate_ VARCHAR(1))

BEGIN

SET @i_ := 1;

SET @count_ := CHAR_LENGTH(content_) - CHAR_LENGTH(REPLACE(content_, separate_,'')) + 1;

SET @tmp_ := '';

-- DROP temporary table if exists sys_array_tab;

CREATE TEMPORARY TABLE IF NOT EXISTS sys_array_tab( seq_no INT(11),

content VARCHAR(2000) );

DELETE FROM sys_array_tab;

WHILE @i_ <= @count_ DO

SET @tmp_ := SUBSTRING_INDEX(SUBSTRING_INDEX(content_,separate_,@i_),separate_,-1);

INSERT INTO sys_array_tab(seq_no, content)

VALUES( @i_, @tmp_ );

SET @i_ := @i_ + 1;

END WHILE;

END

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在MySQL中,没有直接的foreach遍历list的方法。但是,你可以使用循环语句(如while或者for)和游标(cursor)来实现类似的功能。具体实现方法如下: 1. 创建一个存储list的表格,例如: CREATE TABLE my_list ( id INT PRIMARY KEY AUTO_INCREMENT, value VARCHAR(255) ); 2. 向表格中插入list中的元素,例如: INSERT INTO my_list (value) VALUES ('a'), ('b'), ('c'); 3. 创建一个游标,例如: DECLARE cur CURSOR FOR SELECT value FROM my_list; 4. 打开游标,例如: OPEN cur; 5. 使用循环语句遍历游标中的元素,例如: DECLARE done INT DEFAULT FALSE; DECLARE val VARCHAR(255); WHILE NOT done DO FETCH cur INTO val; IF NOT done THEN -- 在这里对val进行操作 SELECT val; END IF; END WHILE; 6. 关闭游标,例如: CLOSE cur; 注意:使用游标可能会影响性能,因此应该尽量避免在大型数据集上使用。如果可能的话,应该尝试使用其他方法来处理数据。 ### 回答2: 在MySQL中,我们通常使用循环来遍历数据,而foreach是一种循环方式,它可以用于遍历列表(list)或数组(array)中的数据。 在MySQL中,我们可以使用以下语法来使用foreach循环来遍历列表: ``` DECLARE list VARCHAR(255) DEFAULT '1,2,3,4,5'; DECLARE i INT DEFAULT 0; DECLARE item VARCHAR(10); DECLARE list_array TEXT; SET list_array = CONCAT('[', REPLACE(list, ',', '\',\''), ']'); SET list_array = CONCAT(list_array, '[0]'); SET @list_count = LENGTH(list_array) - LENGTH(REPLACE(list_array, ',', '')) + 1; WHILE i < @list_count DO SET i = i + 1; SET item = TRIM(BOTH '"' FROM REPLACE(SUBSTRING(SUBSTRING_INDEX(list_array, ',', i), LENGTH(SUBSTRING_INDEX(list_array, ',', i - 1)) + 1), '\\', '')); SELECT item; END WHILE; ``` 在上面的示例中,首先我们定义了一个变量list,并将其初始化为“1,2,3,4,5”。然后我们定义了三个变量:i,item和list_array。 接下来,我们使用CONCAT函数和REPLACE函数将列表转换为数组,并初始化list_array变量。然后我们继续使用CONCAT函数将数组的长度增加1个,并将其存储在变量@list_count中。 在之后的循环中,我们使用WHILE循环来遍历数组。在每次循环迭代中,我们使用SUBSTRING_INDEX函数获取到当前项的值,并将其存储在变量item中。最后,我们使用SELECT语句来输出item的值。 该循环会遍历列表中的每个元素,分别输出它们的值。该循环可以在MySQL中使用,用于遍历列表或数组,以实现数据的动态操作和处理。 ### 回答3: 在 MySQL 中,没有 `foreach` 循环语句来遍历列表。 MySQL 是一个关系数据库管理系统(RDBMS),用于存储、管理和检索数据。虽然 MySQL 支持存储过程或函数,但它不支持在存储过程或函数中使用 `foreach` 循环语句。但是,MySQL 提供了一些其他语句和功能来处理列表。以下是 MySQL处理列表的几种方式: 1. 使用 `SELECT` 语句来获取列表,在查询结果中使用 `GROUP BY` 子句、`HAVING` 子句来筛选和聚合列表中的数据。 2. 使用 `LOOP` 语句在一个存储过程或函数中循环处理查询结果。这个语句需要计数器和终止条件。 3. 使用 `WHILE` 语句在一个存储过程或函数中循环处理查询结果。这个语句需要计数器和终止条件。 4. 使用 `CURSOR` 语句在一个存储过程或函数中循环处理查询结果。这个语句需要有一个 `SELECT` 语句和一个 `FETCH` 语句。它会返回一个指向记录集中下一行的指针。可以使用 `WHILE` 循环语句来处理每一行中的数据。 5. 使用 `DECLARE` 语句和用户定义变量来存储列表中的数据。可以使用 `SET` 语句来赋值。可以使用 `IF`、`CASE` 来判断变量的值和根据条件执行逻辑。 总结来说,在 MySQL遍历列表需要使用一些与 `foreach` 不同的语句和功能。需要结合实际应用场景和数据进行选择。同时,建议将复杂的数据处理逻辑集成到存储过程或函数中,以提高代码的可维护性和灵活性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值