我正在为mysql数据库编写一个程序,下面是程序:
DROP PROCEDURE IF EXISTS accidents.task_51_proce;
CREATE PROCEDURE accidents.`task_51_proce`()
BEGIN
DECLARE v_finished INTEGER DEFAULT 0;
DECLARE v_mine INTEGER;
DECLARE v_date DATETIME;
DECLARE v_lat INTEGER;
DECLARE v_lng INTEGER;
DECLARE weather_cursor CURSOR FOR select mine_id, accident_dt, lat, lng
from test_1
where accident_dt between STR_TO_DATE('1/1/2010', '%m/%d/%Y') and
STR_TO_DATE('1/2/2010', '%m/%d/%Y');
DECLARE CONTINUE HANDLER
FOR NOT FOUND SET v_finished = 1;
OPEN weather_cursor;
get_update: LOOP
FETCH weather_cursor INTO v_mine, v_date, v_lat, v_lng;
IF v_finished = 1 THEN
LEAVE get_update;
END IF;
UPDATE test_1
set tmin = (
SELECT tmin
FROM test_2
WHERE Longitude_MAX <= v_lng and
Longitude_MIN >= v_lng and
Latitude_MAX <= v_lat and
Latitude_MIN >= v_lat and
STR_TO_DATE(Date, '%m/%d/%Y') = STR_TO_DATE(v_date, '%m/%d/%Y'));
END LOOP get_update;
CLOSE weather_cursor;
END;
游标查询在很短的时间内只返回51条记录,但是当我运行这个过程时,它执行了很长时间并且没有完成。
我认为在这段代码中有一些像变异表(oracle概念)的东西,我更新的是在游标选择中使用的相同的表。
问候:
您可以尝试在临时表中插入结果,而不是使用游标。
开始创建临时表,从select中插入所需的数据,然后遍历表更新源表。