2013-02-21 2 views
0

Я копирую данные для таблицы «Множество к многим», делающей третью таблицу. Хранимая процедура в настоящее время выглядит следующим образом, но она имеет некоторые ошибкиОшибка хранимой процедуры MySQL вложенных курсоров

DELIMITER $$ 
CREATE PROCEDURE `test`.UpdateRelatedAccounts() 
BEGIN 
    DECLARE ssn_sel_id VARCHAR(255) DEFAULT 0; 
    DECLARE id_sel_id CHAR(36) DEFAULT 0; 
    DECLARE id_sel_rel CHAR(36) DEFAULT 0; 
    DECLARE no_more_rows BOOLEAN; 
    DECLARE num_rows INT DEFAULT 0; 
    DECLARE no_more_rel_rows BOOLEAN; 
    DECLARE rel_num_rows INT DEFAULT 0; 

    DECLARE ssn_all_cur CURSOR FOR 
    SELECT ssn, id FROM ssn WHERE ssn NOT IN ('','000-00-0000'); 

    DECLARE ssn_cur CURSOR FOR 
    SELECT id FROM ssn WHERE id != id_sel_id AND ssn = ssn_sel_id; 

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_rows = TRUE; 
-- DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_rel_rows = TRUE; 



OPEN ssn_all_cur; 
SELECT FOUND_ROWS() INTO num_rows; 
    the_loop: LOOP 
     FETCH ssn_all_cur 
     INTO ssn_sel_id, id_sel_id; 

     IF no_more_rows THEN 
     CLOSE ssn_all_cur; 
     LEAVE the_loop; 
     END IF; 



    OPEN ssn_cur; 
    SELECT FOUND_ROWS() INTO rel_num_rows; 
    the_rel_loop: LOOP 
     FETCH ssn_cur 
     INTO id_sel_rel; 

     IF no_more_rel_rows THEN 
     CLOSE ssn_cur; 
     LEAVE the_rel_loop; 
     END IF; 

     INSERT INTO `ssn_related` (`ssn_primary`, `ssn_related`) VALUES (id_sel_id, id_sel_rel), (id_sel_rel, id_sel_id); 

    END LOOP the_rel_loop; 

    END LOOP the_loop;  
END$$ 
DELIMITER ; 

Как я гнездо использовать значение и вставить в третью таблицу.

+0

Что означает «имеет какую-то ошибку»? – Bohemian

+0

Он не запускает запрос вставки, чтобы все связанные записи были вставлены в таблицу – HardCode

ответ

3

Курсоры работают медленно и большую часть времени не нужны. Вложенные курсоры медленны и не нужны2. Курсоры должны использоваться только в качестве последнего средства, когда другого выхода нет.

То, что вы хотите сделать, может быть разбита на это:

INSERT INTO `ssn_related` (`ssn_primary`, `ssn_related`) 
SELECT 
ssn_1.id, 
ssn_2.id 
FROM 
ssn ssn_1 
INNER JOIN ssn ssn_2 ON ssn_2.ssn = ssn_1.id 
WHERE ssn_1.ssn NOT IN ('', '000-00-0000') 
AND ssn_2.id != ssn_1.id; 

Затем вы делаете то же самое снова поменялись местами столбцы в SELECT.

INSERT INTO `ssn_related` (`ssn_primary`, `ssn_related`) 
SELECT 
ssn_2.id, 
ssn_1.id 
FROM 
ssn ssn_1 
INNER JOIN ssn ssn_2 ON ssn_2.ssn = ssn_1.id 
WHERE ssn_1.ssn NOT IN ('', '000-00-0000') 
AND ssn_2.id != ssn_1.id; 
Смежные вопросы