当前位置:网站首页>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 :
边栏推荐
- 【acwing】789. Range of numbers (binary basis)
- STM32产品介绍
- Differences between MCU and MPU
- Why is the reflection efficiency low?
- 反射效率为什么低?
- The Hal library is configured with a general timer Tim to trigger ADC sampling, and then DMA is moved to the memory space.
- 2022.7.3DAY595
- Some test points about coupon test
- [learning notes - Li Hongyi] Gan (generation of confrontation network) full series (I)
- CONDA creates virtual environment offline
猜你喜欢
The landing practice of ByteDance kitex in SEMA e-commerce scene
Chris Lattner, père de llvm: Pourquoi reconstruire le logiciel d'infrastructure ai
Google Colab装载Google Drive(Google Colab中使用Google Drive)
Pdf document signature Guide
ORM模型--关联字段,抽象模型类
Appx代码签名指南
【acwing】789. Range of numbers (binary basis)
ORM -- grouping query, aggregation query, query set queryset object properties
Word自动生成目录的方法
PDF文档签名指南
随机推荐
Some test points about coupon test
Appx代碼簽名指南
Or in SQL, what scenarios will lead to full table scanning
一文讲解单片机、ARM、MUC、DSP、FPGA、嵌入式错综复杂的关系
UnityWebRequest基础使用之下载文本、图片、AB包
Word自动生成目录的方法
ES6中的函數進階學習
ORM -- logical relation and & or; Sort operation, update record operation, delete record operation
搭建物联网硬件通信技术几种方案
conda离线创建虚拟环境
STM32 product introduction
Programming features of ISP, IAP, ICP, JTAG and SWD
.NET配置系统
VS Code指定扩展安装位置
[higherhrnet] higherhrnet detailed heat map regression code of higherhrnet
STM32 ADC and DMA
【STM32】STM32烧录程序后SWD无法识别器件的问题解决方法
JMeter loop controller and CSV data file settings are used together
Es classes and objects, prototypes
Programming features of ISP, IAP, ICP, JTAG and SWD