当前位置:网站首页>Use the fetch statement to obtain the repetition of the last row of cursor data

Use the fetch statement to obtain the repetition of the last row of cursor data

2022-07-07 10:22:00 qq_ forty-two million one hundred and twenty thousand eight hun

  • Problem description 《MySQL Will know 》 Medium P179 After the execution of the stored procedure, a row is repeatedly inserted in the new table .

  • stored procedure processorders( To calculate the orders The total amount of each order in the table and deposit in a new table )
# Create a stored procedure to calculate the total amount of each order and store it in a new table 
DELIMITER //
CREATE PROCEDURE processorders()
BEGIN
	# Declare local variables 
	DECLARE done BOOLEAN DEFAULT 0;
	DECLARE o INT;
	DECLARE t DECIMAL(8,2);
	
	# declare cursor 
	DECLARE ordernumbers CURSOR
	FOR
	SELECT order_num FROM orders;
	
	# Declare exception handling , When sql Status as 02000 when , take done Set to 1
	DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
	
	# Create a new table to store the results 
	CREATE TABLE IF NOT EXISTS ordertotals
	(order_num INT,
	total DECIMAL(8,2)
	
	);
	
	# Open cursor 
	OPEN ordernumbers;
	
	# Insert all rows in a loop 
	REPEAT
		# Get the order number , When the intra row pointer points to the next row of the last row, executing this statement will make SQLSTATE='02000'
		# Cause the execution of the upper handle processing to make done = 1
		FETCH ordernumbers INTO o;
		
		# Calculate the total amount with tax , The result will be returned to the parameter t, The stored procedure is at the bottom 
		CALL ordertotal(o,1,t);
		
		# Insert the order number and total amount into the table 
		INSERT INTO ordertotals(order_num,total)
		VALUES(o,t);
	UNTIL done # The end cycle condition is done For the wrong 0
	END REPEAT;
	
	# Close cursor 
	CLOSE ordernumbers;
END//

# Execute query statement 
CALL processorders()//
  • The result

  • Problem analysis : When the pointer in the cursor points to the next row of the last row , Re execution
    FETCH ordernumbers INTO o;

    When this statement , To take the current line and move the pointer down one line , Because the position pointed by the pointer is illegal , So there is a row error , Cause the upper handle processing to trigger , bring done = 1, And then o No new data is inserted , Or the old data of the last round ( That is, the order number in the last line ), Therefore, the last line is repeatedly inserted twice .

  • resolvent : stay FETCH Judge immediately after the statement is executed done Is it modified to 1, If it is modified to 1, Then the following insert code will not be executed . The stored procedure code above is modified to

DELIMITER //
CREATE PROCEDURE processorders()
BEGIN
	# Declare local variables 
	DECLARE done BOOLEAN DEFAULT 0;
	DECLARE o INT;
	DECLARE t DECIMAL(8,2);
	
	# declare cursor 
	DECLARE ordernumbers CURSOR
	FOR
	SELECT order_num FROM orders;
	
	# Declare exception handling , When sql Status as 02000 when , take done Set to 1
	DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
	
	# Create a new table to store the results 
	CREATE TABLE IF NOT EXISTS ordertotals
	(order_num INT,
	total DECIMAL(8,2)
	
	);
	
	# Open cursor 
	OPEN ordernumbers;
	
	# Insert all rows in a loop 
	REPEAT
		# Get the order number , When the intra row pointer points to the next row of the last row, executing this statement will make SQLSTATE='02000'
		# Cause the execution of the upper handle processing to make done = 1
		FETCH ordernumbers INTO o;
		IF !done THEN # The key position of the correction 
		
		# Calculate the total amount with tax , The result will be returned to the parameter t, The stored procedure is at the bottom 
		CALL ordertotal(o,1,t);
		
		# Insert the order number and total amount into the table 
		INSERT INTO ordertotals(order_num,total)
		VALUES(o,t);
		END IF;
	UNTIL done 
	END REPEAT;
	
	# Close cursor 
	CLOSE ordernumbers;
END//

Query again ordertotals The result of the table is

Reference material :

  1. https://stackoverflow.com/questions/16900482/mysql-cursor-fetching-same-result-twice
  2. https://my.oschina.net/u/1383934/blog/667444  《mysql The last row of the cursor is repeated

原网站

版权声明
本文为[qq_ forty-two million one hundred and twenty thousand eight hun]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/02/202202130623100869.html