Я создал хранимую процедуру, которая выглядит следующим образом:
DELIMITER €€
CREATE PROCEDURE `GetAllNonprocessedSMSes`()
BEGIN
DECLARE smsid INT(10);
DECLARE finish BOOLEAN;
DECLARE id_cur CURSOR FOR
SELECT id FROM (
SELECT
MIN(id) as id,
MIN(UDH) as udh,
MIN(LENGTH(TextDecoded)) as txtlen,
MAX(ReceivingDateTime)-DATE_ADD(MIN(ReceivingDateTime), INTERVAL 3 MINUTE) AS rcvtimeout
FROM inbox
WHERE
Processed='false'
GROUP BY
IF(UDH='',id,SUBSTR(UDH,1,10))
HAVING
rcvtimeout>0
OR udh=''
OR txtlen<156
) AS baseview
ORDER BY id;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finish = TRUE;
OPEN id_cur;
the_loop : LOOP
FETCH id_cur INTO smsid;
CALL GetSMS(smsid);
IF finish THEN
CLOSE id_cur;
LEAVE the_loop;
END IF;
END LOOP the_loop;
END €€
DELIMITER ;
Я знаю, что курсор выбирает более одной строки, но когда я вызываю процедуру, он возвращает только одну запись, но при запуске он возвращает только первую запись.
Как я могу это исправить?
РЕДАКТИРОВАТЬ
Хранимая процедура GetSMS
выглядит как
CREATE PROCEDURE `GetSMS`(IN smsid int(10))
BEGIN
DECLARE smsudh TEXT;
SELECT `UDH` INTO smsudh FROM `inbox` WHERE `ID`=smsid;
IF (STRCMP(smsudh, '') < 1) THEN
SELECT * FROM `inbox` WHERE `ID`=smsid;
ELSE
SELECT * FROM `inbox` WHERE `UDH` LIKE CONCAT(LEFT(smsudh, (LENGTH(smsudh)-2)), "%") GROUP BY `ID` ORDER BY `UDH`;
END IF;
END €€
DELIMITER ;