I have created a Stored Procedure, that looks like this:
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 ;
I know the cursor selects more than one row, but when I call the Procedure it only returns one entry, but when it is runned it only returns the first entry.
How can I fix that?
EDIT
The GetSMS Stored Procedure looks like
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 ;
# put into PROCEDURE
GetAllNonprocessedSMSes# then, in GetSMS
You might want to put a lock around TempTable so that you don’t run two copies of the procedure concurrently.