powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / CURSOR. Внятный пример использования
12 сообщений из 12, страница 1 из 1
CURSOR. Внятный пример использования
    #39862696
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шалом.

Есть ли у кого-нибудь хороший пример использования именованных курсоров?

читал:
README.cursors.txt
Firebird_Language_Reference_RUS.pdf
ну и кусочек из Хелен.

что надо: два входящих потока данных, грубо говоря, приоткрываем краник то на одном, то на другом, смешиваем, но не взбалтываем, сливаем в третий поток.

вопрос: контроль окончания потоков.
в типовых примерах ROW_COUNT, while (1=1), leave. неизящно.
если фетчить наплевав на проверку, то выскакивает exception.

есть красивые и, может быть, современные решения?
...
Рейтинг: 0 / 0
CURSOR. Внятный пример использования
    #39862770
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pastor,

ну явные курсоры вообще не очень красивые. Это ты ещё в MySQL их не пробовал.

можешь взводить переменную-флаг вместо LEAVE и проверять её в WHILE

Код: 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.
EXECUTE BLOCK
RETURNS (
    RNAME CHAR(31))
AS
  DECLARE C CURSOR FOR (
      SELECT
          RDB$RELATION_NAME
      FROM RDB$RELATIONS
      ORDER BY RDB$RELATION_NAME);
  DECLARE C_FLAG BOOLEAN = TRUE;
BEGIN
  OPEN C;
  WHILE (C_FLAG) DO
  BEGIN
    FETCH C
    INTO :RNAME;
    C_FLAG = (ROW_COUNT <> 0);
    IF (C_FLAG) THEN
    BEGIN
      -- тут куча обработки
      SUSPEND;
    END
  END
  CLOSE C;
END
...
Рейтинг: 0 / 0
CURSOR. Внятный пример использования
    #39862784
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисpastor,

ну явные курсоры вообще не очень красивые. Это ты ещё в MySQL их не пробовал.



я старый просто, как дерьмо мамонта.

думал, упустил какой-нить улучшайзер вроде

for fetch c

while (fetch c)

if (fetch c)

и до сих пор поезда под откос пускаю.
ну, значит, не пропустил :(
...
Рейтинг: 0 / 0
CURSOR. Внятный пример использования
    #39862799
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pastor,

улучшайзер есть, но он немного не такой как ты думаешь

1. всё тот же курсор FOR SELECT, только без INTO

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
EXECUTE BLOCK
RETURNS (
  o CHAR(31))
AS
BEGIN
  FOR
    SELECT
      rdb$relation_name AS name
    FROM
      rdb$relations AS CURSOR c
  DO
  BEGIN
    o = c.name;
    SUSPEND;
  END
END



2. Двунаправленные курсоры

Код: 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.
EXECUTE BLOCK
RETURNS (
  N INT,
  RNAME CHAR(31))
AS
  DECLARE C SCROLL CURSOR FOR (
    SELECT
      ROW_NUMBER() OVER(ORDER BY RDB$RELATION_NAME) AS N,
      RDB$RELATION_NAME
    FROM RDB$RELATIONS
    ORDER BY RDB$RELATION_NAME);
BEGIN
  OPEN C;
  -- перемещаемся на первую запись (N=1)
  FETCH FIRST FROM C;
  RNAME = C.RDB$RELATION_NAME;
  N = C.N;
  SUSPEND;
  -- перемещаемся на 1 запись вперёд (N=2)
  FETCH NEXT FROM C;
  RNAME = C.RDB$RELATION_NAME;
  N = C.N;
  SUSPEND;
  -- перемещаемся на пятую запись (N=5)
  FETCH ABSOLUTE 5 FROM C;
  RNAME = C.RDB$RELATION_NAME;
  N = C.N;
  SUSPEND;
  -- перемещаемся на 1 запись назад (N=4)
  FETCH PRIOR FROM C;
  RNAME = C.RDB$RELATION_NAME;
  N = C.N;
  SUSPEND;
  -- перемещаемся на 3 записи вперёд (N=7)
  FETCH RELATIVE 3 FROM C;
  RNAME = C.RDB$RELATION_NAME;
  N = C.N;
  SUSPEND;
  -- перемещаемся на 5 записей назад (N=2)
  FETCH RELATIVE -5 FROM C;
  RNAME = C.RDB$RELATION_NAME;
  N = C.N;
  SUSPEND;
  -- перемещаемся на первую запись (N=1)
  FETCH FIRST FROM C;
  RNAME = C.RDB$RELATION_NAME;
  N = C.N;
  SUSPEND;
  -- перемещаемся на последнюю запись
  FETCH LAST FROM C;
  RNAME = C.RDB$RELATION_NAME;
  N = C.N;
  SUSPEND;
  CLOSE C;
END



красивых способов контроля окончания фетча не придумано
...
Рейтинг: 0 / 0
CURSOR. Внятный пример использования
    #39862807
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

благодарствуем.
первый пункт мне подойдет
...
Рейтинг: 0 / 0
CURSOR. Внятный пример использования
    #39862810
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> ну явные курсоры вообще не очень красивые

а кроме того - в тройке при использовании WHERE CURRENT OF - ещё и медленные
...
Рейтинг: 0 / 0
CURSOR. Внятный пример использования
    #39862811
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> два входящих потока данных, грубо говоря, приоткрываем краник то на одном, то на другом

сортировка слиянием на PSQL ?
...
Рейтинг: 0 / 0
CURSOR. Внятный пример использования
    #39862819
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochа кроме того - в тройке при использовании WHERE CURRENT OF - ещё и медленные

пруфы будут? Причём здесь неявные курсоры?
...
Рейтинг: 0 / 0
CURSOR. Внятный пример использования
    #39862824
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch> два входящих потока данных, грубо говоря, приоткрываем краник то на одном, то на другом

сортировка слиянием на PSQL ?

а ты пробовал прочитать предложение до конца?
...
Рейтинг: 0 / 0
CURSOR. Внятный пример использования
    #39862826
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

я помню только одно замедление, но оно связано с перевычислением вычисляемых полей (или подзапросов в SELECT) при повторном обращении к ним
...
Рейтинг: 0 / 0
CURSOR. Внятный пример использования
    #39862842
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Было на форуме некоторое время назад, то ли в триггере то ли в SP

update .... where current of

после перехода с 2.5 на тройку производительность упала в разы

после переделки на where PK_ID = ... - производительность сравнялась
...
Рейтинг: 0 / 0
CURSOR. Внятный пример использования
    #39862847
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

прям в разы? не верю
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / CURSOR. Внятный пример использования
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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