我已经在 MySQL Workbench 中执行了 MySQL 过程。问题是它生成了许多新的结果集,并且 GUI 客户端显示它(...很多次)-
我找到了解决方案,我可以使用它来代替 select 子句以避免生成结果集。它看起来像:
SELECT EXISTS(
SELECT ...
)
INTO @resultNm
不幸的是,它不能与 LIMIT 一起使用?,1 在哪里?是我的变量“i”。我也不能只使用“i”代替 %,因为我正在使用 MySQL 5.1(并且限制子句不能以其他方式完成)。所以我的问题 - 是否还有其他隐藏结果集的可能性?
CREATE PROCEDURE LOOPDOSSIERS(starter integer, finish integer)
BEGIN
DECLARE n INT DEFAULT 0;
DECLARE i INT DEFAULT 0;
DECLARE row_oid binary(16);
DECLARE row_str VARCHAR(256);
DECLARE row_old VARCHAR(256);
SET i=starter;
WHILE i<finish DO
-- SET row_str = ();
SET @row_str = 'select CAST(concat(d.prefixe_numero,d.numero) as CHAR) from courrier_concerne_dossier as x
join dossier as d on
d.oid = x.dossier_oid limit ?,1';
PREPARE stmt1 FROM @row_str;
EXECUTE stmt1 USING @i;
SET @row_oid = 'select x.courrier_oid
from courrier_concerne_dossier as x
join dossier as d on
d.oid = x.dossier_oid LIMIT ?,1';
PREPARE stmt2 FROM @row_oid;
EXECUTE stmt2 USING @i;
select dossiers_str from courrier_envoye where oid = row_oid into row_old;
update courrier_envoye set dossiers_str = CAST(CONCAT(row_str, " ", row_old) AS CHAR) where oid = row_oid;
SET i = i + 1;
END WHILE;
End;
;;
最佳答案
没有 ORDER BY 子句的 LIMIT 没有明确定义的行为。为了使您的参数以合理的方式工作,您需要按某种顺序进行排序。 starter 和 finish 变量目前意义不大,但目前还不清楚它们的用途。
我认为您可以使用 this answer 中的语法在单个查询中完成整个过程。 (也可能快得多)。这可能不适用于 LIMIT,但我强烈建议在 where 子句中使用某种范围而不是限制。
关于MySQL 生成许多新的结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22328104/