Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 循环中有一个FETCH。循环之前有一个初始获取,因此我们可以处理第一行的特殊情况。我被插入的弄糊涂了,在操作代码中,它正在做一个插入。。。选择endDateTable中每一行的,并对每一行执行该操作。我觉得这不太合适。在我看来,它的目的只是为了获得最高的修_Mysql_Loops_Variables_Stored Procedures_Prepared Statement - Fatal编程技术网

Mysql 循环中有一个FETCH。循环之前有一个初始获取,因此我们可以处理第一行的特殊情况。我被插入的弄糊涂了,在操作代码中,它正在做一个插入。。。选择endDateTable中每一行的,并对每一行执行该操作。我觉得这不太合适。在我看来,它的目的只是为了获得最高的修

Mysql 循环中有一个FETCH。循环之前有一个初始获取,因此我们可以处理第一行的特殊情况。我被插入的弄糊涂了,在操作代码中,它正在做一个插入。。。选择endDateTable中每一行的,并对每一行执行该操作。我觉得这不太合适。在我看来,它的目的只是为了获得最高的修,mysql,loops,variables,stored-procedures,prepared-statement,Mysql,Loops,Variables,Stored Procedures,Prepared Statement,循环中有一个FETCH。循环之前有一个初始获取,因此我们可以处理第一行的特殊情况。我被插入的弄糊涂了,在操作代码中,它正在做一个插入。。。选择endDateTable中每一行的,并对每一行执行该操作。我觉得这不太合适。在我看来,它的目的只是为了获得最高的修订号,但我只是猜测。是的,如果我们想要finalTable中有多行,我们可以在循环中插入。再说一次,我甚至不清楚为什么我们需要一个循环,为什么不在一个SQL语句中这样做呢?原始代码在每次获取后都会进行一次插入,先有条件地递增@revisionN


循环中有一个
FETCH
。循环之前有一个初始获取,因此我们可以处理第一行的特殊情况。我被插入的
弄糊涂了,在操作代码中,它正在做一个
插入。。。选择endDateTable中每一行的
,并对每一行执行该操作。我觉得这不太合适。在我看来,它的目的只是为了获得最高的修订号,但我只是猜测。是的,如果我们想要finalTable中有多行,我们可以在循环中插入
。再说一次,我甚至不清楚为什么我们需要一个循环,为什么不在一个SQL语句中这样做呢?原始代码在每次获取后都会进行一次插入,先有条件地递增
@revisionNum
。据我所知,目的是为
endDateTable
中的每一行获取一行,而
RevisionNum
的值在每一行中都会发生变化。OP code在每次提取后都会执行insert,它会执行
insert。。。选择。。。从endDateTable
进行每次提取。插入n行的n个副本。是的,我们可以将
INSERT
移动到循环中,这样就可以为获取的每一行执行一次。
BEGIN

 DECLARE _currentEndDate DATETIME DEFAULT now();
 DECLARE _priorEndDate DATETIME DEFAULT now();

 SET @ResultsCount = (SELECT COUNT(*) FROM mainTable);

 SET @j = 0;
    WHILE @j < @ResultsCount DO

        SET @revisionNum = 0;

        /*CURRENT END DATE*/
        SET @appResultQueryCurrent = CONCAT('
            SELECT 
                end_date
            INTO _currentEndDate
            FROM endDateTable 
            LIMIT ', @j, ', 1'
        );      

        PREPARE currentQueryStmt FROM @appResultQueryCurrent;
        EXECUTE currentQueryStmt;

        /*PREVIOUS END DATE*/
        SET @appResultQueryPrior = CONCAT('
            SELECT
                end_date
            INTO _priorAppEndDate
            FROM endDateTable
            LIMIT ', IF(@j = 0, 0, @j - 1), ', 1'
        );

        PREPARE priorQueryStmt FROM @appResultQueryPrior;
        EXECUTE priorQueryStmt; 

        SET @revisionNum = IF(
                @j = 0 OR (_currentEndDate = _priorEndDate),
                @revisionNum,
                IF(
                    _currentEndDate != _priorEndDate,
                    @revisionNum + 1,
                    @revisionNum
                )
            );

        INSERT INTO finalTable (RevisionNum)
        SELECT 
            @revisionNum AS RevisionNum 
        FROM endDateTable;

    SET @j = @j +1;

 END WHILE;

END $$
INSERT INTO finalTable (RevisionNum, otherColumn)
SELECT revision, otherColumn
FROM (
    SELECT IF(end_date = @prev_end_date, @revision, @revision := @revision + 1) AS revision,
            @prev_end_date := end_date,
            otherColumn
    FROM endDateTable
    CROSS JOIN (SELECT @prev_end_date := NULL, @revision := -1) AS vars
    ORDER BY id) AS x
BEGIN
  DECLARE ld_current_end_date  DATETIME;
  DECLARE ld_prior_end_date    DATETIME;
  DECLARE li_done              INT;
  DECLARE li_revision_num      INT;
  DECLARE lcsr_end_date CURSOR FOR SELECT t.end_date FROM `endDateTable` t ORDER BY NULL;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET li_done = TRUE;
  SET li_done = FALSE;
  SET li_revision_num = 0;
  OPEN lcsr_end_date;
  FETCH lcsr_end_date INTO ld_current_end_date;
  SET ld_prior_end_date = ld_current_end_date;
  WHILE NOT li_done DO
    SET li_revision_num = li_revision_num + IF( ld_current_end_date <=> ld_prior_end_date ,0,1);
    SET ld_prior_end_date := ld_current_end_date;
    FETCH lcsr_end_date INTO ld_current_end_date;
  END WHILE;
  CLOSE lcsr_end_date;
  INSERT INTO `finalTable` (revisionnum) VALUES (li_revision_num);
END $$