MySQL 生成许多新的结果集

标签 mysql sql

我已经在 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/

相关文章:

mysql - 在 MySQL 中对两个表中的数据进行分组

asp.net - 从两个数据库表动态创建一个表并绑定(bind)到转发器

mysql - SQL初学者创建表时出错

sql - 传递整个 WHERE 子句的 SQL 存储过程

java - 使用准备好的语句的动态列名 + 包含变量的 sql 查询

php - 在 Symfony2 (Doctrine) 和 MySQL 中启用微秒

MySQL 条件 JOIN 使用 CASE Stmt

sql - LISTAGG函数: "result of string concatenation is too long"

mysql - 执行此查询的更好方法

sql - SQL注入(inject)攻击后更新所有SQL Server列