Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.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存储过程中的动态视图不更新_Mysql_Sql_Dynamic_View_Procedure - Fatal编程技术网

Mysql存储过程中的动态视图不更新

Mysql存储过程中的动态视图不更新,mysql,sql,dynamic,view,procedure,Mysql,Sql,Dynamic,View,Procedure,我有一个包含100000多条记录的表,根据存储在特定列中的值,我可以从中进行一些计算 为此,我编写了一个存储过程,每次从基表中获取100行。因为游标不支持动态sql。我所做的是创建一个动态视图,光标总是从该视图中选择数据 守则: BEGIN -- VARIABLES TO RETURN DECLARE ORIG_COUNT INT ; DECLARE SERVED_COUNT INT; -- VARIABLED FOR LOOPING DECLARE no_more_rows BOOLEAN;

我有一个包含100000多条记录的表,根据存储在特定列中的值,我可以从中进行一些计算

为此,我编写了一个存储过程,每次从基表中获取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条记录

但如果在程序运行后在mysql控制台中从temp_视图运行SELECT*,它将显示最后61条记录


任何人都可以指出我在这里做错了什么?

打印@SERVED\u COUNT的值,并查看是否正确更新。是的,确实如此。创建sql的视图是正确的。创建视图temp_VIEW as从表_one中选择A.BN,A.DN作为A.year='2011'订单的A.ID LIMIT 0100;创建视图temp_VIEW as从表_one中选择A.BN,A.DN作为A.year='2011'订单的A.ID LIMIT 100100;结果似乎是,该过程将计算应用于它多次获取的第一个数据集,而忽略更新的视图。