【问题标题】:get an array output of a Stored Procedure in mysql在mysql中获取存储过程的数组输出
【发布时间】:2018-11-06 20:37:17
【问题描述】:

我创建了一个存储过程来计算每个技术人员的工作数量,使用该技术人员的 ID 和预期年份作为该存储过程的输入,但我坚持使用 . . . 如何在该过程中获得一组输出,以便 我可以稍后在我的 php 代码中使用它。 这是我的存储过程:

        DROP PROCEDURE `work_count`;
CREATE DEFINER=`root`@`localhost` PROCEDURE `work_count`(IN `id` INT, IN `yearInput` INT) NOT DETERMINISTIC NO SQL SQL SECURITY DEFINER
BEGIN 
    SET @x := 1; 
    WHILE @x<13 DO 
       SELECT COUNT(work.workType) 
       FROM work 
       WHERE year(workDate)=yearInput 
          AND work.technicianID = id 
          AND month(workDate)= @x; 
       SET @x := @x+1; 
    END WHILE; 
 END

【问题讨论】:

    标签: php mysql arrays stored-procedures output


    【解决方案1】:

    如果您正在执行多个查询,则需要创建一个临时表来保存中间结果,然后将 SELECT * FROM thattemporarytable 设置为您的过程中最后完成的事情之一。

    这样的……

    BEGIN
       DROP TEMPORARY TABLE IF EXISTS `blah` ( num INT );
       CREATE TEMPORARY TABLE `blah` ( num INT );
       SET @x := 1; 
       WHILE @x<13 DO 
          INSERT INTO blah (num)
          SELECT COUNT(work.workType) 
          FROM work 
          WHERE year(workDate)=yearInput 
                AND work.technicianID = id 
                AND month(workDate)= @x
          ; 
          SET @x := @x+1; 
       END WHILE; 
       SELECT * FROM blah;
       DROP TEMPORARY TABLE blah;
    END
    

    或者,如果您可以将其作为单个查询进行管理,则正常的选择应该可以工作:

    BEGIN
       SELECT COUNT(work.workType) 
       FROM work 
       WHERE year(workDate)=yearInput 
             AND work.technicianID = id 
             AND month(workDate) BETWEEN 1 AND 12
       ;
    END
    

    【讨论】:

    • 第二件事是如何在 php 中使用该结果 SELECT* FROM tbl_someTable 可以像平常一样使用 while ($row = ...fetch_assoc()){} 获取它
    • 如果在程序结束时不删除临时表,则可以在同一个数据库连接上使用(即临时表的范围);但这不是必需的。执行存储过程(甚至从 php)应该已经提供了该结果集;这就是 select * 的目的,即使是在 proc 中。
    【解决方案2】:

    我使用临时表将数据存储到其中,然后使用 select 语句将其发布并在过程结束时删除临时表

    BEGIN
    
    
      drop TABLE if exists `myDB`.`tbl_temp`;
      CREATE TABLE `myDB`.`tbl_temp` ( `countingWork` INT(11) NOT NULL ) ENGINE = InnoDB;   
      SET @x :=1;
      WHILE @x<=12 DO
          insert into `myDB`.`tbl_temp`
          SELECT COUNT(work.workType) 
          FROM work
          WHERE year(workDate)=yearInput 
                AND work.technicianID = id 
                AND month(workDate)= @x;
          SET @x = @x + 1;
      END WHILE;
      SELECT * from `myDB`.`tbl_temp`;
      drop TABLE `myDB`.`tbl_temp`;
    END  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-04
      • 1970-01-01
      相关资源
      最近更新 更多