当前位置: 首页 > 面试题库 >

为MySQL中查询返回的每一行调用一个存储过程

谷德本
2023-03-14
问题内容

我想要一个有效的MySQL存储过程:

foreach id in (SELECT id FROM objects WHERE ... ) CALL testProc(id)

我想我只是想让MySQL回答这个问题,但我对光标的理解却不够好:如何为查询返回的每一行执行一次存储过程?


问题答案:

“循环”(for-each,while等)和“分支”(if-else,call等)等概念是 html" target="_blank">过程性的 ,在诸如SQL这样的 声明性
语言中不存在。通常,人们可以以声明的方式表达自己期望的结果,这将是解决此问题的正确方法。

例如,如果testProc要调用的过程使用给定的方法id作为另一个表的查找键,则可以(并且应该)JOIN将表简单地组合在一起,例如:

SELECT ...
FROM   objects JOIN other USING (id)
WHERE  ...

仅在极少见的情况下,您不能以声明的方式表达您的问题,然后才应诉诸程序地解决问题。存储 过程
是在MySQL中执行过程代码的唯一方法。因此,您要么需要修改现有的存储过程,以使其在循环内执行其当前逻辑,要么创建一个新的存储过程,以从循环内调用现有的存储过程:

CREATE PROCEDURE foo() BEGIN
  DECLARE done BOOLEAN DEFAULT FALSE;
  DECLARE _id BIGINT UNSIGNED;
  DECLARE cur CURSOR FOR SELECT id FROM objects WHERE ...;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := TRUE;

  OPEN cur;

  testLoop: LOOP
    FETCH cur INTO _id;
    IF done THEN
      LEAVE testLoop;
    END IF;
    CALL testProc(_id);
  END LOOP testLoop;

  CLOSE cur;
END


 类似资料:
  • 问题内容: 我进行了很多搜索,但找不到有用的答案: 我想通过用户给我一个开始和结束日期来列出用户定义的时间段的总计。从开始日期到开始日期之间的每次总计应该相加,并在每一天添加1天。因此最后一行给出了从开始到结束日期的总计。示例:-给定期间=开始2013-01-01,结束= 2013-01-31 所以我有一个查询谁计算所有天: 我有一个查询谁每天计算总数 现在将这两者结合起来很难得到我的最终结果。

  • 我有一个包含两个参数的存储过程。我可以在服务器管理工作室成功执行它。它向我显示了我所期望的结果。然而,它也返回一个返回值。 它增加了这一行, 我希望存储过程返回它在结果中显示给我的表,而不是返回值,因为我从MATLAB调用这个存储过程,它返回的都是true或false。 我需要在存储过程中指定它应该返回什么吗?如果是这样,我如何指定一个包含4列的表(varchar(10)、float、float、

  • 问题内容: 我希望将一列附加到我的表中,该列将是从顺序列表=到行数的随机数。 因此,如果我的表有 999行 ,则 数字1到999将被随机且唯一地分配 。 现在,我想到可以添加一个虚拟的TempRandomColumn = Rand(),然后对其进行排序,然后使用PHP依次添加数字。但这意味着999条MySQL语句。 有没有办法使用单个MySQL语句来做到这一点? 感谢您的指导。 问题答案:

  • 本文向大家介绍PHP调用MySQL存储过程并返回值的方法,包括了PHP调用MySQL存储过程并返回值的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php中调用执行mysql存储过程然后返回由存储过程返回的值,分享给大家供大家参考。具体分析如下: 调用存储过程的方法. a。如果存储过程有 IN/INOUT参数,声明一个变量,输入参数给存储过程,该变量是一对,一个php变量,也可以不必

  • 我不知道当我在Mysql中运行查询时,会出现此错误。 #1242-子查询返回超过1行 谁能帮我解决这个问题?

  • 问题内容: 我在存储过程中创建一个动态查询。我的存储过程如下: 当我尝试通过以下调用运行它时: 我收到以下错误消息: 错误代码:1054。“ where子句”中的未知列“ SPA” 我在没有where条件的情况下进行了测试,并且工作正常,但是在where条件不起作用的情况下,我尝试使用@和变量名一起使用,但仍然无法正常工作。 谢谢你的帮助。 问题答案: 您错过了条款中的引号。 尝试这样: 说明 :