У меня есть таблица, содержащая более 100 000 записей, из которых у меня есть некоторые вычисления, основанные на значении, которое хранится в определенном столбце.
Для этого я написал хранимую процедуру, которая занимает 100 строк ввремя от базовой таблицы.Поскольку курсоры не поддерживают динамический sql.Я создал динамическое представление, и курсор всегда выбирает данные из этого представления.
Код:
BEGIN
-- VARIABLES TO RETURN
DECLARE ORIG_COUNT INT ;
DECLARE SERVED_COUNT INT;
-- VARIABLED FOR LOOPING
DECLARE no_more_rows BOOLEAN;
DECLARE no_more_rows_sub BOOLEAN;
DECLARE num_rows INT DEFAULT 0;
SET @ORIG_COUNT =0;
SET @SERVED_COUNT=0;
SELECT COUNT(*) FROM table_one AS A WHERE A.year='2011' INTO @ORIG_COUNT ;
DELETE FROM table_test;
insert into table_test values ('Total Rows',@ORIG_COUNT,NULL);
DROP TABLE IF EXISTS table_request;
CREATE TABLE table_request (
BN_NUM VARCHAR(25) NOT NULL,
DN_NUM varchar(10) NOT NULL,
A_TOTAL FLOAT DEFAULT 0,
B_TOTAL FLOAT DEFAULT 0,
C_TOTAL FLOAT DEFAULT 0,
PRIMARY KEY (BN)
);
WHILE (@SERVED_COUNT<@ORIG_COUNT) DO
DROP VIEW IF EXISTS pbs_history.temp_view;
SET @query = CONCAT('CREATE VIEW temp_view as SELECT A.BN,A.DN
FROM table_one AS A
WHERE A.year='2011'
ORDER BY A.ID
LIMIT ', @SERVED_COUNT,',100');
PREPARE stmt from @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
/* ================= HERE ==================== */
SELECT * FROM temp_view;
BLOKA:BEGIN
DECLARE BN VARCHAR(25);
DECLARE DN VARCHAR(10);
DECLARE num_rows INT(5) DEFAULT 0;
DECLARE bn_count INT(5) DEFAULT 0;
DECLARE sel_recs CURSOR FOR SELECT * FROM temp_view;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_rows = TRUE;
insert into table_test values('Start Served',@SERVED_COUNT,@query);
OPEN sel_recs;
SELECT FOUND_ROWS() INTO @num_rows;
insert into table_test values('Found Rows in View',@num_rows,NULL);
the_loop: LOOP
FETCH sel_recs INTO BN,DN;
IF no_more_rows THEN
CLOSE sel_recs;
LEAVE the_loop;
END IF;
SET @bn_count=0;
SELECT COUNT(*) FROM table_request WHERE BILL_NUMBER=BN INTO @bn_count;
insert into table_test VALUES(BN,DN,@bn_count);
IF(@bn_count=0) THEN
INSERT INTO table_request VALUES (BN,DN,0,0,0);
END IF;
BLOKB:BEGIN
DECLARE CAT VARCHAR(5);
DECLARE T1 FLOAT;
DECLARE data_fetch CURSOR FOR SELECT CAT_ID, TYPE_1 FROM transactions WHERE ID=BN;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_rows_sub = TRUE;
OPEN data_fetch;
sub_loop: LOOP
FETCH data_fetch INTO CAT,T1;
IF no_more_rows_sub THEN
CLOSE data_fetch;
LEAVE sub_loop;
END IF;
IF (CAT='P1') THEN
UPDATE table_request SET A_TOTAL = A_TOTAL+T1 WHERE BN_NUM=BN;
ELSEIF (CAT='P2') THEN
UPDATE table_request SET B_TOTAL = B_TOTAL+T1 WHERE BN_NUM=BN;
ELSEIF (CAT='P3') THEN
UPDATE table_request SET N_TOTAL = N_TOTAL+T1 WHERE BN_NUM=BN;
END IF;
END LOOP sub_loop;
END BLOKB;
SET @SERVED_COUNT = @SERVED_COUNT+1;
END LOOP the_loop;
insert into table_test values ('End the_loop',0,NULL);
END BLOKA;
END WHILE;
END
Я тестирую код с подмножеством из исходной таблицы.,И подмножество имеет 461 запись.
И с этим кодом должно быть 5 итераций.И в последней итерации представление должно содержать только 61 запись.Но с этим кодом каждая итерация имеет 100 записей, и на каждой итерации она учитывает только первые 100 записей.
Но если после запуска процедуры я запускаю SELECT * FROM temp_view
в консоли mysql, она показывает последнюю61 запись.
Кто-нибудь может указать, что я здесь не так делаю?