Mysql 最后一行在存储过程中插入多次该怎么办
根据 如果获取超过结果集中的最后一行,则目标字段或变量的值不确定,Mysql 最后一行在存储过程中插入多次该怎么办,mysql,stored-procedures,cursor,Mysql,Stored Procedures,Cursor,根据 如果获取超过结果集中的最后一行,则目标字段或变量的值不确定,NOTFOUND属性返回TRUE 注意:上述语句来自Oracle cursors文档,但也适用于其他文档 我不确定您是如何声明变量d的默认值以与光标处理程序一起使用的。但是,我坚信问题是因为没有正确处理d(未找到)值 如果我是你,我会像下面这样编码: DECLARE candidate CURSOR FOR SELECT `ce_agr_perc`, `ce_year_of_passing`, `ql_id
NOTFOUND
属性返回TRUE
注意:上述语句来自Oracle cursors文档,但也适用于其他文档
我不确定您是如何声明变量d
的默认值以与光标处理程序一起使用的。但是,我坚信问题是因为没有正确处理d
(未找到
)值
如果我是你,我会像下面这样编码:
DECLARE candidate CURSOR FOR
SELECT `ce_agr_perc`, `ce_year_of_passing`, `ql_id`,`ua_id`,
`sb_id`, `ps_id` ,`ce_id`, c_id
FROM `candidate_education`
WHERE c_id IN ( SELECT c_id FROM `candidate` )
ORDER BY c_id;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET d = 0;
TRUNCATE TABLE `candidate_tag_string_copy`;
OPEN candidate;
read_loop: LOOP
FETCH candidate
INTO ceagrperc, ceyearofpassing, qlid, uaid, sbid, psid, ceid, cid;
IF d=1 THEN
LEAVE read_loop;
END IF;
IF NOT d=1 THEN
SELECT ql_short_code INTO qlcode FROM qualification_level
WHERE ql_id=qlid;
SELECT `us_short_code` INTO usshortcode FROM `university_affiliation`
WHERE ua_id=uaid;
SELECT `short_code` INTO shortcode FROM `school_boards`
WHERE sb_id=sbid;
SELECT `ds_id`,`dp_id` INTO dsid,dpid FROM `programe_specialization`
WHERE `ps_id`=psid;
SELECT `dp_short_code`, `dp_degree_edu_level`
INTO dpshortcode, dpdegreeedulevel
FROM `degree_programe`
WHERE `dp_id`=dpid;
SELECT `ds_short_code` INTO dsshortcode FROM `degree_specialization`
WHERE `ds_id`=dsid;
IF qlcode='UG' THEN
SELECT CONCAT( '{', qlcode,';', dpshortcode, '-',
dsshortcode, ';', usshortcode, ';',
ceagrperc, ';', ceyearofpassing, '}' )
INTO ctsstring ;
INSERT
INTO `candidate_tag_string_copy`
( `c_id`, `cts_tag_class`, `cts_fk_id`, `cts_string` )
VALUES( cid, 'edu', ceid, ctsstring );
END IF;
IF qlcode='PG' THEN
SELECT CONCAT( '{', qlcode, '::', ';', dpshortcode, '-',
dsshortcode, ';', usshortcode, ';',
ceagrperc, ';', ceyearofpassing, '}' )
INTO ctsstring ;
INSERT
INTO `candidate_tag_string_copy`
( `c_id`, `cts_tag_class`, `cts_fk_id`, `cts_string` )
VALUES(cid,'edu2',ceid,ctsstring);
END IF;
IF qlcode='XII' THEN
SELECT CONCAT( '{', qlcode, ';', dpshortcode,'-',
dsshortcode, ';', usshortcode, ';',
ceagrperc, ';', ceyearofpassing, '}' )
INTO ctsstring ;
INSERT
INTO `candidate_tag_string_copy`
(`c_id`, `cts_tag_class`, `cts_fk_id`, `cts_string` )
VALUES( cid, 'edu', ceid, ctsstring );
END IF;
IF qlcode='X' THEN
SELECT CONCAT( '{', qlcode, ';', dpshortcode, '-',
dsshortcode, ';', usshortcode, ';',
ceagrperc, ';', ceyearofpassing, '}' )
INTO ctsstring ;
INSERT
INTO `candidate_tag_string_copy`
( `c_id`, `cts_tag_class`, `cts_fk_id`, `cts_string` )
VALUES( cid, 'edu4', ceid, ctsstring );
END IF;
END IF;
END LOOP;
CLOSE candidate;
在这种情况下,我要做的第一件事是确保所有代码都正确缩进。您可能有一个简单的错误,但是您的缩进使得很难确定。@user2071660:变量d
的默认值是多少?那是1
还是0
?
declare not_found boolean default false;
...
declare continue handler for not found set not_found = true;
...
read_loop: LOOP
FETCH candidate
INTO ceagrperc, ceyearofpassing, qlid, uaid, sbid, psid, ceid, cid;
IF not_found THEN
LEAVE read_loop;
END IF;
...
...
end loop;
...