Хранимый цикл вложенных курсоров хранимой процедуры в MySQL не выполняет все результаты - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь использовать внешний цикл с вложенным циклом для доступа ко всем категориям, а затем с использованием этого TaxID. Я запрашиваю посты из этого налога, чтобы я мог назначить им рейтинг в соответствии с их размещением в категории.

Но я сталкиваюсь с проблемой, заключающейся в том, что внутренний цикл «RankingLoop» получает доступ только ко всем результатам публикации одного taxID, затем завершает цикл и не выполняет цикл для публикации другой категории, если я использую Repeat вместо RankingLoop, а затем первую записькаждого цикла TaxID становятся доступными.Может ли какой-либо орган помочь объяснить проблему в моем коде?

Спасибо заранее за помощь.

DELIMITER $$
CREATE PROCEDURE  Catranking__()
    Begin
        Declare txID INT; Declare txmaxcount INT; 
        Declare txCount CURSOR FOR SELECT max(term_taxonomy_id) FROM `wp_term_taxonomy` where taxonomy = 'category' and count > 0;
        Declare taxonomyIDS CURSOR FOR SELECT term_taxonomy_id FROM `wp_term_taxonomy` where taxonomy = 'category' and count > 0;
        open taxonomyIDS; open txCount;
        FETCH txCount into txmaxcount;
        loop_label: LOOP 
            FETCH taxonomyIDS into txID;
            if txID < (txmaxcount+1) then set @rank=0;
                categorywisePostSorting: begin
                    DECLARE Vranking INT;
                    DECLARE VPOSTID INT;             
                    Declare RankingArray CURSOR FOR select @rank:=@rank+1 as ranking,  POSTID FROM   RankingView WHERE  term_id = txID order by claimedProducts desc, commentcount desc, pageviews desc;                        
                    open RankingArray;
                    RankingLoop : Loop 
                        FETCH RankingArray into Vranking, VPOSTID;
                        select VPOSTID;
                    end Loop RankingLoop;
                    close RankingArray; 
                END categorywisePostSorting;
            end if;
        END LOOP loop_label;
        close taxonomyIDS; close txCount;
    END$$
DELIMITER ;

1 Ответ

0 голосов
/ 31 июля 2019

Поскольку существует неизвестная логика, измененная, как показано ниже,

DELIMITER $$
CREATE PROCEDURE  Catranking__()
BEGIN
        DECLARE txmaxcount INT;
        DECLARE txID INT; 
        DECLARE done1 BOOLEAN DEFAULT FALSE;
        # assuming `count`  is column name so instead of cursor we can use a local var
        #Declare txCount CURSOR FOR SELECT max(term_taxonomy_id) FROM `wp_term_taxonomy` where taxonomy = 'category' and count > 0; -- "count" is illegal here(whether its column name or count(*))... so check from ur side
        DECLARE taxonomyIDS CURSOR FOR SELECT term_taxonomy_id FROM `wp_term_taxonomy` WHERE taxonomy = 'category' AND count > 0; -- same count issue

        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done1=TRUE;

SELECT 
    MAX(term_taxonomy_id)
INTO txmaxcount FROM
    `wp_term_taxonomy`
WHERE
    taxonomy = 'category' AND `count` > 0;

        OPEN taxonomyIDS;
        TAXONOMYIDS_LOOP: LOOP

            FETCH taxonomyIDS INTO txID;

            IF done1 THEN

                LEAVE TAXONOMYIDS_LOOP;

            END IF;

           IF txID < (txmaxcount+1) THEN 

                SET @rank=0;

                CATEGORYWISEPOSTSORTING: BEGIN

                    DECLARE Vranking INT; -- why this var? hasn't used in the code
                    DECLARE VPOSTID INT; 
                    DECLARE done2 BOOLEAN DEFAULT FALSE;

                    DECLARE RankingArray CURSOR FOR 
                    SELECT @rank:=@rank+1 AS ranking,  POSTID FROM  RankingView WHERE  term_id = txID ORDER BY claimedProducts DESC, commentcount DESC, pageviews DESC;                        

                    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done2=TRUE;

                    OPEN RankingArray;
                    RANKINGLOOP : LOOP 

                        FETCH RankingArray INTO Vranking, VPOSTID;

                        IF done2 THEN

                            LEAVE RANKINGLOOP;

                        END IF;

SELECT VPOSTID; 

                    END LOOP RANKINGLOOP;
                    CLOSE RankingArray;
                    SET done2= FALSE;
                END CATEGORYWISEPOSTSORTING;

            END IF;


        END LOOP TAXONOMYIDS_LOOP;
        CLOSE taxonomyIDS;
        SET done=FALSE;

END$$

DELIMITER ;
...