powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / курсоры
4 сообщений из 4, страница 1 из 1
курсоры
    #38732089
BuKTaP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго дня.
Есть вложенные курсоры.
Код: sql
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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
DECLARE @person_id INT, @ibes_tkr CHAR(6), @rtr_id INT, @rtr_estimate_id INT, @code INT, @person_id2 INT, @tmp_code NVARCHAR(10), @cccnt int, @cm nvarchar(100)
set @cccnt = 1 -- счётчик записей
SET @tmp_code = NULL
DECLARE cur_exc CURSOR FOR
SELECT DISTINCT pite.person_id, pite.rtr_id, pite.rtr_estimate_id
FROM #person_ibes_tmp_exc pite
JOIN #ibes_broker_analyst iba ON iba.ibes_tkr = pite.ibes_tkr AND iba.rtr_id = pite.rtr_id

OPEN cur_exc
FETCH cur_exc INTO @person_id, @rtr_id, @rtr_estimate_id
WHILE @@FETCH_STATUS = 0
BEGIN

    DECLARE code CURSOR FOR 
    SELECT pac.maskcode FROM person_analyst_code pac WHERE person_id = @person_id

    OPEN code
    FETCH code INTO @code
    WHILE @@fetch_status = 0
    BEGIN
        DECLARE person2 SCROLL CURSOR FOR
        SELECT pac.person_id FROM person_analyst_code pac WHERE maskcode = @code

        OPEN person2
-- поиск по одному параметру
        FETCH person2 INTO @person_id2
        WHILE @@fetch_status = 0
        BEGIN
            IF EXISTS
            (SELECT prx.person_id, prx.analyst_code, prx.ctb_id 
            FROM person_xref prx 
            WHERE prx.analyst_code IS NOT NULL AND prx.analyst_code IS NOT NULL AND prx.end_date IS NULL
                  AND prx.person_id = @person_id2 AND prx.ctb_id = ISNULL(@rtr_estimate_id,-1))
            BEGIN
                SELECT TOP 1 @tmp_code = prx.analyst_code 
                FROM person_xref prx 
                WHERE prx.analyst_code IS NOT NULL AND prx.analyst_code IS NOT NULL AND prx.end_date IS NULL
                AND prx.person_id = @person_id2 AND prx.ctb_id = ISNULL(@rtr_estimate_id,-1)

                BREAK
            END
            ELSE FETCH person2 INTO @person_id2
        END
-- поиск по другому параметру, если по первому не найдено соответствие
        IF @tmp_code IS NULL
        BEGIN
            FETCH FIRST person2 INTO @person_id2
            WHILE @@fetch_status = 0
            BEGIN
                IF EXISTS 
                (SELECT prx.person_id, prx.analyst_code, prx.ctb_id 
                FROM person_xref prx 
                WHERE prx.analyst_code IS NOT NULL AND prx.analyst_code IS NOT NULL AND prx.end_date IS NULL
                      AND prx.person_id = @person_id2 AND prx.ctb_id = @rtr_id)
                BEGIN
                    SELECT TOP 1 @tmp_code = prx.analyst_code 
                    FROM person_xref prx 
                    WHERE prx.analyst_code IS NOT NULL AND prx.analyst_code IS NOT NULL AND prx.end_date IS NULL
                    AND prx.person_id = @person_id2 AND prx.ctb_id = @rtr_id

                    BREAK
                END
                ELSE FETCH person2 INTO @person_id2
            END
        END

      	UPDATE #person_ibes_tmp_exc
        SET analyst_code = @tmp_code
        WHERE (person_id = @person_id)  AND (ISNULL(rtr_estimate_id,-1) = ISNULL(@rtr_estimate_id,-1)) AND (rtr_id = @rtr_id) and (analyst_code is null)
        
        select @cccnt /*номер обрабатываемой записи*/, @person_id, @rtr_id, @rtr_estimate_id, @tmp_code
        SET @tmp_code = NULL

        CLOSE person2
        DEALLOCATE person2
    FETCH code INTO @code
    END
    CLOSE code
    DEALLOCATE code

set @cccnt = @cccnt+1
FETCH cur_exc INTO @person_id, @rtr_id, @rtr_estimate_id
END
CLOSE cur_exc
DEALLOCATE cur_exc



Запрос для первого из курсоров возвращает 6 записей
person_id rtr_id rtr_estimate_id70570 30291 (null)12131092 8976 (null)12133501 32323 (null)12753439 6478 (null)12132733 6478 (null)12756658 6478 (null)
, но в цикле обрабатывается только 4
person_id rtr_id rtr_estimate_id70570 30291 (null)12131092 8976 (null)12133501 32323 (null)12753439 6478 (null)
Если принудительно в запрос для первого курсора пишу условие
Код: sql
1.
where pite.person_id in (12756658,12132733)


то они обе записи нормально.
Почему так? ума не приложу
...
Рейтинг: 0 / 0
курсоры
    #38732090
BuKTaP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
select @@version



Adaptive Server Enterprise/15.7.0/EBF 20733 SMP ESD#03 /P/x86_64/Enterprise Linux/ase157esd3/3183/64-bit/FBO/Sat Dec 8 18:28:29 2012
...
Рейтинг: 0 / 0
курсоры
    #38733245
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Слишком много букв...

В общем случае, курсоры могут "глючить" если в обрабатывающем блоке ты меняешь исходную таблицу.

Если хочешь более конкретной помощи: сделай скрипт создающий таблицы и наполняющий эти таблицы данными. Тогда можно будет посмотреть.
...
Рейтинг: 0 / 0
курсоры
    #38733556
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

Там есть добавочная опция INSENSITIVE , если меня не подводит память.
Или же, если её нет, то можно искуственно её сделать руками, добавив в запрос
фиктивный DISTINCT или ORDER BY (что заставит движок сделать рабочую таблицу и курсор перестанет автоматом быть "живым").
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / курсоры
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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