我想实现的是一个存储过程,它返回一个表中所有缺少的id的记录集。 例如:MySQL存储过程的变量表名和检索丢失的记录
--------------------
| games |
--------------------
| id | game name |
--------------------
| 1 | first game |
| 2 | second game |
| 5 | fifth game |
| 10 | tenth game |
-------------------
这将导致:
----------
| result |
----------
| 3 |
| 4 |
| 6 |
| 7 |
| 8 |
| 9 |
----------
注意这里是可以处理多个表,所以我想只有一个需要维护的存储过程,所以表名应该动态添加。
我在存储过程中发现了几个关于预准备语句,参数和循环的教程,但是我没有得到该组合的工作方式。
我心里有应用的逻辑是:
- 表中获得的最高ID
- 遍历表,并检查迭代器存在的ID
- 如果不是,添加到结果集,并返回结果循环完成
此设置后是我走到这一步:
CREATE DEFINER=`root`@`localhost` PROCEDURE `get_missing_ids`(IN in_kind varchar(15), OUT out_result int)
BEGIN
DECLARE highest_id INT;
DECLARE i INT;
DECLARE check_id INT;
SET @highestid = CONCAT("(CALL get_highest_id('", in_kind, "',@id)");
PREPARE stmt1 FROM @highestid;
SET highest_id = (EXECUTE stmt1);
WHILE i < highest_id DO
SET @checkid = CONCAT("SELECT COUNT(*) FROM ", in_kind, " WHERE id = ", i, ")");
PREPARE stmt2 FROM @checkid;
SET check_id = (EXECUTE stmt2);
IF check_id = 0 THEN
SELECT i;
END IF;
END WHILE;
END
谁能解释我如何让这个组合工作?
你有什么到目前为止 – Drew
我投票关闭这一问题作为题外话,因为这里是我的规格,所以请做 – Drew
@Drew,我补充说,我现在有足够 – stijnpiron