powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / UDB LUW: если процедура использует цикл, то как получить промежуточный результат
10 сообщений из 10, страница 1 из 1
UDB LUW: если процедура использует цикл, то как получить промежуточный результат
    #36022474
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день,
извиняюсь за не очень точную формулировку вопроса в заголовке.

То что интересует - есть процедура UDB для удаления большого количества записей.
Удаление происходит в цикле.
Время выполнения цикла может быть довольно продолжительным.
Хотелось бы на клиента выводить какую-ту информация о прогрессе, например сообщать через каждые 10 000 записей, что очередная порция удалена.

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

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

Приходит на ум мысль в цикле помещать удалённое кол-во записей в специально созданную таблицу и читать из неё из приожения. Но тут сразу возникают сложности с многопоточностью.

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

Заранее большое спасибо за отклик.
...
Рейтинг: 0 / 0
UDB LUW: если процедура использует цикл, то как получить промежуточный результат
    #36023011
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

В v9.5.2+ вы можете использовать The administrative task scheduler .
См. также процедуру ADMIN_TASK_ADD .
...
Рейтинг: 0 / 0
UDB LUW: если процедура использует цикл, то как получить промежуточный результат
    #36024265
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark BarinsteinЗдравствуйте.

В v9.5.2+ вы можете использовать The administrative task scheduler .
См. также процедуру ADMIN_TASK_ADD .

Добрый день,
большое спасибо за отклик и за ссылки.
Если я правильно понял administrative task scheduler позволяет выполнять разные запросы в разное время.
Это не совсем то что я ищу.

В моём случае - есть одна процедура которая удаляет из ряда таблиц, часть из которых довольно большие. Она может вызываться как из перлового скрипта так и просто пользователем.
Т.к. время её выполнения довольно продолжительное, то я хотел бы выводить какие-нибудь промежуточные сообщения на экран.

Я попробовал написать такую пробную процедуру, которая обновляет временную таблицу в цикле и которая создаёт 2 курсора смотрящие на эту таблицу.
Она открывает 1й курсор до обновления и 2й после.
Мой расчёт был на то, что 1й курсор будет открыт и возвращён на клиента до окончания цикла.
К сожалению, кажется, выходит так, что процедура сначала отрабатывает и потом возвращает оба курсора с одинаковым набором данных.
Вот мой код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
create procedure tempdb.mult_c_test ()
    RESULT SETS  2 
    LANGUAGE SQL
    MODIFIES SQL DATA
begin
            declare global temporary table tmp (i int);
   
    P1: begin
        declare v_i int default  0 ;  
        declare c1 CURSOR WITH RETURN for select * from session.tmp with UR for fetch only ;
        declare c2 CURSOR WITH RETURN for select * from session.tmp with UR for fetch only ;
 
      set v_i = v_i+ 1 ;
     insert into session.tmp  values (v_i);
      open c1;
             while (v_i < 5 ) do
                set v_i = v_i+ 1 ;
                insert into session.tmp  values (v_i);
             end while; 
       open c2;
    end P1;
end

Может быть есть какая-нибудь возможность вернуть курсор на клиента до окончания работы процедуры.
Например в Sybase если сделать select в процедуре, то результат будет сразу выдан на клиента после чего процедура продолжит работу.

Я очень надеюсь найти возможность добиться подобного поведения от UDB.

Заранее огромное спасибо за помощь
...
Рейтинг: 0 / 0
UDB LUW: если процедура использует цикл, то как получить промежуточный результат
    #36024307
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kru[quot Mark Barinstein]Если я правильно понял administrative task scheduler позволяет выполнять разные запросы в разное время.
Это не совсем то что я ищу.

В моём случае - есть одна процедура которая удаляет из ряда таблиц, часть из которых довольно большие. Она может вызываться как из перлового скрипта так и просто пользователем.
Т.к. время её выполнения довольно продолжительное, то я хотел бы выводить какие-нибудь промежуточные сообщения на экран.1.
Вы в приложении создаёте задачу с помощью вызова ADMIN_TASK_ADD, чтоб она запустилась 1 раз как можно скорее - этот вызов проходит быстро.
Ваша процедура может логировать результаты работы в таблицу.
2.
Ваше приложение после этого циклически выводит информацию из этой таблицы пользователю.

Вам не подходит такая реализация?
...
Рейтинг: 0 / 0
UDB LUW: если процедура использует цикл, то как получить промежуточный результат
    #36024399
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark BarinsteinKru[quot Mark Barinstein]Если я правильно понял administrative task scheduler позволяет выполнять разные запросы в разное время.
Это не совсем то что я ищу.

В моём случае - есть одна процедура которая удаляет из ряда таблиц, часть из которых довольно большие. Она может вызываться как из перлового скрипта так и просто пользователем.
Т.к. время её выполнения довольно продолжительное, то я хотел бы выводить какие-нибудь промежуточные сообщения на экран.1.
Вы в приложении создаёте задачу с помощью вызова ADMIN_TASK_ADD, чтоб она запустилась 1 раз как можно скорее - этот вызов проходит быстро.
Ваша процедура может логировать результаты работы в таблицу.
2.
Ваше приложение после этого циклически выводит информацию из этой таблицы пользователю.

Вам не подходит такая реализация?

Если я правильно понимаю предложенный подход, задача ADMIN_TASK_ADD заключается в том, чтобы читать из таблицы во время работы процедуры.
Если так, то по сути нужно будет создавать 2 параллельных процесса - 1й запускает процедуру, 2й запускает ADMIN_TASK_ADD и выдаёт результаты.

Так ли это?
...
Рейтинг: 0 / 0
UDB LUW: если процедура использует цикл, то как получить промежуточный результат
    #36024913
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KruMark Barinstein1.
Вы в приложении создаёте задачу с помощью вызова ADMIN_TASK_ADD, чтоб она запустилась 1 раз как можно скорее - этот вызов проходит быстро.
Ваша процедура может логировать результаты работы в таблицу.
2.
Ваше приложение после этого циклически выводит информацию из этой таблицы пользователю.

Вам не подходит такая реализация?

Если я правильно понимаю предложенный подход, задача ADMIN_TASK_ADD заключается в том, чтобы читать из таблицы во время работы процедуры.
Если так, то по сути нужно будет создавать 2 параллельных процесса - 1й запускает процедуру, 2й запускает ADMIN_TASK_ADD и выдаёт результаты.

Так ли это?Нет, не так.
Задача ADMIN_TASK_ADD - запустить по расписанию вашу долгоиграющую процедуру. Т.е. рассматривайте эту процедуру как что-то типа unix cron.
После того, как вы повесили запуск вашей процедуры по расписанию, вы через то же самое соединение в своей программе время от времени можете проверять результаты работы своей процедуры, которая эти самые результаты сохраняет в какой-то таблице.
...
Рейтинг: 0 / 0
UDB LUW: если процедура использует цикл, то как получить промежуточный результат
    #36028352
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark BarinsteinKru
Если я правильно понимаю предложенный подход, задача ADMIN_TASK_ADD заключается в том, чтобы читать из таблицы во время работы процедуры.
Если так, то по сути нужно будет создавать 2 параллельных процесса - 1й запускает процедуру, 2й запускает ADMIN_TASK_ADD и выдаёт результаты.

Так ли это?
Нет, не так.
Задача ADMIN_TASK_ADD - запустить по расписанию вашу долгоиграющую процедуру. Т.е. рассматривайте эту процедуру как что-то типа unix cron.
После того, как вы повесили запуск вашей процедуры по расписанию, вы через то же самое соединение в своей программе время от времени можете проверять результаты работы своей процедуры, которая эти самые результаты сохраняет в какой-то таблице.

Марк,
огромное спасибо. Я теперь понял. Попробую запустить из Perl ADMIN_TASK_ADD и запрос к таблице в цикле.

Ещё раз огромное спасибо.
...
Рейтинг: 0 / 0
UDB LUW: если процедура использует цикл, то как получить промежуточный результат
    #36036416
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein
Задача ADMIN_TASK_ADD - запустить по расписанию вашу долгоиграющую процедуру. Т.е. рассматривайте эту процедуру как что-то типа unix cron.
После того, как вы повесили запуск вашей процедуры по расписанию, вы через то же самое соединение в своей программе время от времени можете проверять результаты работы своей процедуры, которая эти самые результаты сохраняет в какой-то таблице.

Добрый день,
я попробовал создать тестовую процедуру и задачу её вызывающую.
К сожалению ничего не получилось. Задача хоть и создавалась, но процедуру она не вызывала.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create table tempdb.test_feedback (i int)

create procedure tempdb.p_test_feed_back ()
modifies sql data
begin 
declare v_i int default  0 ;
while (v_i <  100 ) do
   set v_i = v_i + 1  ;
    insert into  tempdb.test_feedback  values (v_i);
 end while;
end

CALL SYSPROC.ADMIN_TASK_ADD ('Test',NULL ,NULL,NULL,NULL,'tempdb','p_test_feed_back',NULL,NULL,NULL)

Тоже, не могли бы Вы подсказать как пользоваться параметром procedure_input?
Может быть есть пример задачи вызывающей процедуру с параметрами?

Заранее большое спасибо.
...
Рейтинг: 0 / 0
UDB LUW: если процедура использует цикл, то как получить промежуточный результат
    #36036480
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.
Вопрос использования ADMIN_TASK_ADD стал теоретическим, т.к. админ не разрешил использовать эту возможность.

Буду искать как пользоваться параллельно 2мя соединениями из Перла.

Со своей стороны вопрос закрываю.

Всем и особенно Марку, огромное спасибо.
...
Рейтинг: 0 / 0
UDB LUW: если процедура использует цикл, то как получить промежуточный результат
    #36037707
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KruТоже, не могли бы Вы подсказать как пользоваться параметром procedure_input?
Может быть есть пример задачи вызывающей процедуру с параметрами?Если всё ещё интересно:
Читаем про The administrative task scheduler и настраиваем его, как там написано.
Пусть есть:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create procedure myschema.command
(
  in stmt varchar( 128 )
, out rc int
, out msg varchar( 128 )
)
language sql
begin
 declare sqlcode int default  0 ;
 declare exit handler for sqlexception
  begin
   GET DIAGNOSTICS EXCEPTION  1  msg = MESSAGE_TEXT;
   SET rc=SQLCODE;
  end;
 EXECUTE IMMEDIATE stmt;
 SET rc= 0 ;
end@
Тогда:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CALL SYSPROC.ADMIN_TASK_ADD (
  'MY 1-ST TEST'
, NULL
, NULL
,  1 
, NULL
, 'MYSCHEMA'
, 'COMMAND'
, 'VALUES (''INSERT INTO SOMESCHEMA.TEST_ATS VALUES (''''HELLO'''')'', CAST(NULL AS INT), CAST(NULL AS VARCHAR(128)))'
, NULL
, NULL)
и смотреть в SYSTOOLS.ADMIN_TASK_STATUS
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / UDB LUW: если процедура использует цикл, то как получить промежуточный результат
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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