powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / вложенный цикл с курсором
11 сообщений из 11, страница 1 из 1
вложенный цикл с курсором
    #36165395
Lily V.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день

Необходимо реализовать проход по вложенному циклу с двумя курсорами. Делал кто-нть подобное? Нужно что-то типа:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
begin
  declare call_cur1 cursor for
    select call_id, call_date /*...скип...*/  from dba.tmp_call;

  declare call_cur2 cursor for
    select call_id, call_date /*...скип...*/ from dba.tmp_call;

    open call_cur1;   open call_cur2;     
    call_loop1: loop
        fetch next call_cur1 into @call_id1, @call_date1 /*...скип...*/;

        if sqlstate = '02000' then             
            leave call_loop1
        end if;
    
        call_loop2: loop
            fetch next call_cur2 into @call_id2, @call_date2 /*...скип...*/;

            if sqlstate = '02000' then 
                 leave call_loop2
            end if;

            /* выполняем действия */

        end loop call_loop2;       
    end loop call_loop1; 
    close call_cur2;  close call_cur1;

end

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

ЗЫ ASA 8.0.2.4424
...
Рейтинг: 0 / 0
вложенный цикл с курсором
    #36166804
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а вложенный курсор то зачем открывать заранее? Внутренний цикл пройдет по нему до конца во время первой итерации внешнего цикла, а на вторую итерацию уже ничего не останется.
К тому же курсор для внутреннего цикла должен по идее быть как-то завязан на курсор внешнего цикла, иначе во всем этом бардаке вообще смысла не будет.

Вот, играемся с демо базой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
begin
    declare DeptId integer; declare DeptName char( 40 );
    declare EmpId integer; declare LastName person_name_t; declare FirstName person_name_t;

    declare crsr1 cursor for select DepartmentID, DepartmentName from Groupo.Departments;
    declare crsr2 cursor for select EmployeeID, Surname, GivenName from Groupo.Employees where DepartmentID=DeptID;

    open crsr1;
    loop1: loop
        fetch next crsr1 into DeptId, DeptName;
        if sqlstate='02000' then
            leave loop1;
        end if;

        open crsr2;
        loop2: loop
            fetch next crsr2 into EmpId, LastName, FirstName;
            if sqlstate='02000' then
                leave loop2;
            end if;
            print DeptName || ': ' || LastName || ', ' || FirstName;
        end loop loop2;
        close crsr2;

    end loop loop1;
    close crsr1;
end;
...
Рейтинг: 0 / 0
вложенный цикл с курсором
    #36167254
Lily V.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlНу а вложенный курсор то зачем открывать заранее?
Спасибо, действительно, второй курсор не там открывала

White OwlК тому же курсор для внутреннего цикла должен по идее быть как-то завязан на курсор внешнего цикла, иначе во всем этом бардаке вообще смысла не будет.
Почему завязан? логика находится в: /* выполняем действия */ Мне надо пройти по таблице (курсор1) и для каждой ее записи посчитать некую статистику по этой же таблице (курсор2). Запросом это сделать не получается.
...
Рейтинг: 0 / 0
вложенный цикл с курсором
    #36167300
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lily V.Запросом это сделать не получается.
Не факт. Может быть Вы просто "не умеете готовить" ;)
...
Рейтинг: 0 / 0
вложенный цикл с курсором
    #36167334
Lily V.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ASCRUSLily V.Запросом это сделать не получается.
Не факт. Может быть Вы просто "не умеете готовить" ;)
Может;) Я, конечно, не шеф-повар, но-таки прежде чем, курсоры городить, я пыталась это запросом реализовать) Не та ситуация)
...
Рейтинг: 0 / 0
вложенный цикл с курсором
    #36167393
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lily V.ASCRUSLily V.Запросом это сделать не получается.
Не факт. Может быть Вы просто "не умеете готовить" ;)
Может;) Я, конечно, не шеф-повар, но-таки прежде чем, курсоры городить, я пыталась это запросом реализовать) Не та ситуация)
Дайте примерное описание ситуации, что требуется сделать. На моей практике работы с ASA за все проекты мне ни разу не пришлось воспользоваться вложенными курсорами, всегда находилось более простое решение, вполне возможно и у Вас можно что нибудь придумать.
...
Рейтинг: 0 / 0
вложенный цикл с курсором
    #36167449
Lily V.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть примерно такая таблица:
Код: plaintext
1.
2.
3.
4.
5.
create table dba.tmp_call(
            call_id integer,
            start_time time,
            call_duration time,
            end_time time,
            call_cnt integer);
Необходимо подсчитать количество записей с пересекающимися start_time и end_time. Т.е. для первой записи просматриваем все следующие, которые попадают в пересечение start_time и end_time, однако, если в этом промежутке есть непересекающиеся записи (не параллельные, а последовательные), то считается только одна. Попробую лучше схематично изобразить:
Код: plaintext
1.
2.
3.
1 |-----------|                  +1
2 |-----|                          +2
3            |--|   
4    |-----------------|      +3
Понятно объяснила?
...
Рейтинг: 0 / 0
вложенный цикл с курсором
    #36167562
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо, имеет такой код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE TABLE #tmp_call (
  call_id integer,
  start_time time,
  call_duration int,
  end_time time,
);

INSERT INTO #tmp_call (call_id, start_time, end_time, call_duration)
  SELECT  1 , '00:00:00.000', '00:01:00.000',  60 
  UNION ALL
  SELECT  2 , '00:00:30.000', '00:01:00.000',  30 
  UNION ALL
  SELECT  3 , '00:00:45.000', '00:01:45.000',  60 
  UNION ALL
  SELECT  4 , '00:01:01.000', '00:01:21.000',  20 
  UNION ALL
  SELECT  5 , '00:01:10.000', '00:01:21.000',  10 


COMMIT;

SELECT *
FROM #tmp_call
ORDER BY call_id;
На выходе имеет таблицу с записями:
call_idstart_timecall_durationend_time1'00:00:00.000'60'00:01:00.000'2'00:00:30.000'30'00:01:00.000'3'00:00:45.000'60'00:01:45.000'4'00:01:01.000'20'00:01:21.000'5'00:01:10.000'10'00:01:21.000'

Распишите по call_id, какое будет кол-во пересекающихся записей для каждой записи таблицы, чтобы я понял, что мы говорим об одном и том же.
...
Рейтинг: 0 / 0
вложенный цикл с курсором
    #36167766
Lily V.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ASCRUS,
call_idcall_cntcross_call_list131 2 3231 2 3351 2 3 4 5433 4 5533 4 5
...
Рейтинг: 0 / 0
вложенный цикл с курсором
    #36167814
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lily V.ASCRUS,
call_idcall_cntcross_call_list131 2 3231 2 3351 2 3 4 5433 4 5533 4 5
Ну вот Ваш результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT t1.call_id, t1.start_time, t1.end_time, 
       List(t2.call_id, ';' ORDER BY t2.call_id) AS list_call,
       Count(t2.call_id) AS count_call
FROM #tmp_call t1
  INNER JOIN #tmp_call t2 
    ON t2.start_time BETWEEN t1.start_time AND t1.end_time OR
       t2.end_time BETWEEN t1.start_time AND t1.end_time OR
       t1.start_time BETWEEN t2.start_time AND t2.end_time OR
       t1.end_time BETWEEN t2.start_time AND t2.end_time
GROUP BY t1.call_id, t1.start_time, t1.end_time
ORDER BY t1.call_id
call_idstart_timeend_timelist_callcount_call1'00:00:00.000''00:01:00.000''1;2;3'32'00:00:30.000''00:01:00.000''1;2;3'33'00:00:45.000''00:01:45.000''1;2;3;4;5'54'00:01:01.000''00:01:21.000''3;4;5'35'00:01:10.000''00:01:21.000''3;4;5'3
Вроде как простейший запрос с одним соединением, не вижу смысла здесь применять курсоры.
...
Рейтинг: 0 / 0
вложенный цикл с курсором
    #36167887
Lily V.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ASCRUS,

блин, все гениальное просто! спасибо
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / вложенный цикл с курсором
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]