Как получить данные, используя несколько курсоров и несколько циклов в хранимой процедуре MySQL? - PullRequest
0 голосов
/ 29 сентября 2018

Согласно сценарию использования, эта процедура должна возвращать 30 строк с 15 уникальными идентификаторами отведений, соответствующими всем 15 в активности = 1;случайным образом 10 участвуют в активности = 2;и из этих 10, 5 отведений случайным образом соответствуют активности = 3.

Когда я запускаю хранимую процедуру, она продолжается до заполнения 25 записей;которые соответствуют уникальному получению 15 идентификаторов для активности = 1 и 10 из них для активности = 2;но я не могу получить записи сразу после.

Если вы проверите код;Я упомянул оператор SELECT перед закрытием cur2 (SELECT COUNT (*) FROM task2), который должен вернуть Count = 25;но это не так.Таким образом, очевидно, что программа даже не идет дальше в cur3, который я объявил для активности = 3.

Я также пытался использовать Continue Handler с курсором;но, похоже, это не сработало!

Может ли кто-нибудь помочь решить эту проблему?

НАЧАТЬ СБРОС ТАБЛИЦЫ, ЕСЛИ СУЩЕСТВУЕТ task2;CREATE TABLE task2 (ID int (11) NOT NULL AUTO_INCREMENT, type_id int (11) DEFAULT NULL, url varchar (100) DEFAULT NULL, lead_id int (11) DEFAULT NULL, createdDatedatetime DEFAULT NULL, month varchar (20) DEFAULT NULL, year int (11) DEFAULT NULL, month_year varchar (20) DEFAULT NULL, ПЕРВИЧНЫЙ КЛЮЧ (ID))

BEGIN
    -- INSERTING DATA FOR ACTIVITY = 1

            DECLARE nurl VARCHAR(100);
            DECLARE nleadid INTEGER;
            DECLARE ncreateddate DATETIME;

            DECLARE l_count INTEGER;
            DECLARE loop_count INTEGER;

   -- LOOP COUNT = 15
            SET l_count = 15;

            SET loop_count = 1; 

            read_loop:LOOP

            IF loop_count > l_count THEN
            LEAVE read_loop;
            END IF; 


            IF loop_count = 1
            THEN
            SET nleadid = 100;
            SET ncreateddate = ('2012-09-08 01:09:30');             

            ELSE
            SET nleadid = 100 + loop_count - 1;
            SET ncreateddate = (SELECT MAX(createdDate) FROM task2);
            SET ncreateddate = DATE_ADD(ncreateddate, INTERVAL ELT(0.5 + RAND() * 6, '3', '5', '45', '34', '23', '68') MINUTE);                                      
            END IF;


            SET nurl = ELT(0.5 + RAND() * 3, 'g.com', 'y.com', 'm.com');

            INSERT INTO task2 (type_id, url, lead_id, createdDate)
            VALUES ('1', nurl, nleadid, ncreateddate);

            UPDATE task2
            SET month = MONTHNAME(createddate), year = YEAR(createddate), month_year = CONCAT(MONTHNAME(createddate),'-', YEAR(createddate));

            SET loop_count = loop_count + 1;

            END LOOP read_loop;

    END;

    -- INSERTING THE DATA FOR ACTIVITY = 2 
    BEGIN

                DECLARE nurl VARCHAR(100);
                DECLARE nleadid INTEGER;
                DECLARE ncreateddate DATETIME;

                DECLARE l_count INTEGER;
                DECLARE loop_count INTEGER;

        -- CURSOR DECLARATION TO FETCH 10 RANDOM RECORDS FROM ACTIVITY=1

                DECLARE cur2 CURSOR FOR
                SELECT DISTINCT lead_id FROM task2 WHERE type_id = 1 ORDER BY RAND() LIMIT 10;


                SET l_count = 10;

                SET loop_count = 1; 

                OPEN cur2;



                read_loop:LOOP

                FETCH cur2 INTO nleadid;

                IF loop_count > l_count THEN
                SELECT loop_count_2, l_count_2;
                LEAVE read_loop;
                END IF; 


                SET nurl = ELT(0.5 + RAND() * 3, 'g.com', 'y.com', 'm.com');

                SET ncreateddate = (SELECT MAX(createdDate) FROM task2 WHERE lead_id = nleadid);
                SET ncreateddate = DATE_ADD(ncreateddate, INTERVAL ELT(0.5 + RAND() * 6, '3', '5', '45', '34', '23', '68') MINUTE);

                INSERT INTO task2 (type_id, url, lead_id, createdDate)
                VALUES ('2', nurl, nleadid, ncreateddate);

                UPDATE task2
                SET month = MONTHNAME(createddate), year = YEAR(createddate), month_year = CONCAT(MONTHNAME(createddate),'-', YEAR(createddate));

                SET loop_count = loop_count + 1;
                SELECT COUNT(*) FROM task2;
                END LOOP read_loop;

        SELECT COUNT(*) FROM task2;
    CLOSE cur2;

END;

-- INSERTING DATA FOR ACTIVITY = 3
    BEGIN

            DECLARE nurl VARCHAR(100);
            DECLARE nleadid INTEGER;
            DECLARE ncreateddate DATETIME;
            DECLARE l_count INTEGER;
            DECLARE loop_count INTEGER;


   -- CURSOR DECLARATION FOR SELECTING 5 RANDOM LEADS FROM ACTIVITY=2     

            DECLARE cur3 CURSOR FOR
            SELECT DISTINCT lead_id FROM task2 WHERE type_id = 2 ORDER BY RAND() LIMIT 5;

            SET l_count = 5;

            SET loop_count = 1; 


            OPEN cur3;
            read_loop:LOOP

            IF loop_count > l_count THEN
            LEAVE read_loop;
            END IF; 

            FETCH cur3 INTO nleadid;

            SET nurl = CONCAT(ELT(0.5 + RAND() * 3, 'g.com', 'y.com', 'm.com'), ELT(0.5 + RAND() * 3, '/home.html', '/index.html', '/about.html'));
            SELECT nurl;              
            SET ncreateddate = (SELECT MAX(createdDate) FROM task2 WHERE lead_id = nleadid);

            SET ncreateddate = DATE_ADD(ncreateddate, INTERVAL ELT(0.5 + RAND() * 6, '3', '5', '45', '34', '23', '68') MINUTE);

SELECT ncreateddate;     

            INSERT INTO task2 (type_id, url, lead_id, createdDate)
            VALUES ('3', nurl, nleadid, ncreateddate);

            UPDATE task2 
            SET month = MONTHNAME(createddate), year = YEAR(createddate), month_year = CONCAT(MONTHNAME(createddate),'-',YEAR(createddate));

            SET loop_count =loop_count + 1;
            END LOOP read_loop;
    CLOSE cur3;
END;

    SELECT * FROM task2;

END

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...