Hi,

Use a temporary table to store the ids and join to it for the final
update? That will at least avoid an error when the cursor selects zero
records.

Cheers,
-Janek

On Wed, 2009-05-20 at 16:05 -0400, W. Scott Hayes wrote:
> Hello,
> 
> I would like to do a select on a table to get back the IDs of some of
> the records.
> 
> Then take those IDs and do a single update using a WHERE clause like
> (recordID IN (2,44,21))
> 
> My question is:
> 
> Can I build a string using a cursor that has all of the IDs and then
> issue an update using the string as part of the WHERE clause?
> 
> Are there functions that facilitate this better?  I'm wondering if
> there is some sort of column function that will grab the IDs from the
> initial select.
> 
> Below is my code.  Thanks for any advice.
> 
> DELIMITER $$
> 
> DROP PROCEDURE IF EXISTS sp_getNextQueueBlock$$
> 
> CREATE PROCEDURE sp_getNextQueueBlock()
> BEGIN
> DECLARE l_LinkQueueID INTEGER;
> DECLARE no_more_queue_items INT DEFAULT 0;
> DECLARE l_updateString VARCHAR(2000) DEFAULT '';
> DECLARE queue_csr CURSOR FOR
>       SELECT LinkQueueID FROM linkqueue WHERE Completed <> 0 LIMIT 200;
> DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_queue_items=1;
> 
> START Transaction;
> OPEN queue_csr;
> queue_loop:LOOP
>       FETCH queue_csr INTO l_LinkQueueID;
>       IF no_more_queue_items=1 THEN
>               LEAVE queue_loop;
>       END IF;
>       SET l_updateString=CONCAT(l_updateString,', ',l_LinkQueueID);
> END LOOP queue_loop;
> 
> IF LENGTH(l_updateString) > 2 THEN
>       SET l_updateString=SUBSTRING(l_updateString,3,LENGTH(l_updateString)-2);
> END IF;
> 
> UPDATE linkqueue SET Completed = 0 WHERE (LinkQueueID IN (l_updateString));
> commit;
> END$$
> 
> DELIMITER ;
> 


-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/mysql?unsub=arch...@jab.org

Reply via email to