MySQL динамический курсор

0

Вот процедура, которую я написал: Cursors c1 и c2. c2 находится внутри c1, я попытался объявить c2 ниже c1 (вне курсора c1), но затем I НЕ принимает обновленное значение:( Любые предложения, чтобы заставить его работать, были бы полезны, Благодаря

create table t1(i int); 

create table t2(i int, j int);

insert into t1(i) values(1), (2), (3), (4), (5); 

insert into t2(i, j) values(1, 6), (2, 7), (3, 8), (4, 9), (5, 10);

delimiter $

CREATE PROCEDURE p1() 
BEGIN 
DECLARE I INT; 
DECLARE J INT;
DECLARE done INT DEFAULT 0;

DECLARE c1 CURSOR FOR SELECT i FROM t1;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

OPEN c1;
REPEAT 
    FETCH c1 INTO I;

    IF NOT done THEN

        select I;

        DECLARE c2 CURSOR FOR 
            SELECT j FROM t2 WHERE i = I;

        OPEN c2;
        REPEAT
            FETCH c2 into J;

            IF NOT done THEN
                SELECT J;
            END IF;
        UNTIL done END REPEAT;
        CLOSE c2;

        set done = 0;

    END IF;

UNTIL done END REPEAT;

CLOSE c1;

END$

delimiter ;
Теги:
cursors

1 ответ

1

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

Следующая процедура намного проще и дает одни и те же данные в одном результирующем наборе:

CREATE PROCEDURE p1()
BEGIN
  SELECT i, j FROM t1 JOIN t2 USING (i);
END

Возможно, вы можете отредактировать свой вопрос и описать, какой результат вы хотите, или показать пример желаемого вывода.

  • 0
    Спасибо, Билл. Да, мы можем использовать соединение, но мой вопрос в том, можем ли мы сделать то же самое, не используя JOIN, но используя два курсора. Иногда, JOIN может быть очень дорогостоящим в этом случае, каково решение?
  • 1
    Это миф, что присоединение стоит дорого. Конечно, это намного эффективнее, чем выполнение N + 1 запросов SELECT как вы показали.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню