Come posso utilizzare due cursori nella stessa routine? Se rimuovo la seconda dichiarazione del cursore e il ciclo di recupero tutto funziona correttamente. La routine viene utilizzata per aggiungere un amico nella mia webapp. Prende l'id dell'utente corrente e l'e-mail dell'amico che vogliamo aggiungere come amico, quindi controlla se l'e-mail ha un id utente corrispondente e se non esiste alcuna relazione amico ne creerà uno. Qualsiasi altra soluzione di routine rispetto a questa sarebbe ottima.Procedura memorizzata MySQL, gestione di più cursori e risultati delle query
DROP PROCEDURE IF EXISTS addNewFriend;
DELIMITER //
CREATE PROCEDURE addNewFriend(IN inUserId INT UNSIGNED, IN inFriendEmail VARCHAR(80))
BEGIN
DECLARE tempFriendId INT UNSIGNED DEFAULT 0;
DECLARE tempId INT UNSIGNED DEFAULT 0;
DECLARE done INT DEFAULT 0;
DECLARE cur CURSOR FOR
SELECT id FROM users WHERE email = inFriendEmail;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur;
REPEAT
FETCH cur INTO tempFriendId;
UNTIL done = 1 END REPEAT;
CLOSE cur;
DECLARE cur CURSOR FOR
SELECT user_id FROM users_friends WHERE user_id = tempFriendId OR friend_id = tempFriendId;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur;
REPEAT
FETCH cur INTO tempId;
UNTIL done = 1 END REPEAT;
CLOSE cur;
IF tempFriendId != 0 AND tempId != 0 THEN
INSERT INTO users_friends (user_id, friend_id) VALUES(inUserId, tempFriendId);
END IF;
SELECT tempFriendId as friendId;
END //
DELIMITER ;
Grazie per i vostri sensi, Sono nuovo di stored procedure e ha cercato di utilizzare una rutine precedente ho ottenuto aiuto con (http://stackoverflow.com/questions/1903189/using-select-resultset-to-run-update-query-with-mysql-stored-procedures), cercherò di trovare un diverso approccio per scrivere questa procedura. – Tirithen
E sì, hai ragione riguardo la logica, dovrebbe essere: SELECT user_id FROM users_friends WHERE (user_id = tempFriendId AND friend_id = inUserId) OR (friend_id = tempFriendId AND user_id = inUserId); Ma come ho detto, proverò un modo diverso di farlo. – Tirithen