powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Курсор и EXECUTE IMMEDIATE
5 сообщений из 5, страница 1 из 1
Курсор и EXECUTE IMMEDIATE
    #34189530
SunnyVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!
Подскажите, что я делаю неправильно:
Допустим есть Таблица1, которая хранит следующие данные:

I P1 12 13 14 25 26 2
Таблица2, которая хранит следующие данные:
I2 NAME27 'aaa'8 'bbb'

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
DECLARE STRING_  VARCHAR( 4096 );

DECLARE c1_end INTEGER DEFAULT  0 ;
DECLARE I_ INTEGER;    
DECLARE C1 CURSOR FOR
  SELECT 
    I
  FROM Таблица1
  WHERE P= 1 ;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET c1_end= 1 ;

OPEN C1;
FETCH C1 INTO I_;

WHILE (c1_end= 0 ) DO
   SET STRING_='INSERT INTO Таблица3 (I3, NAME3) SELECT I2, NAME2 FROM Таблица2 WHERE I2=' || I_;
   EXECUTE IMMEDIATE STRING_;
   FETCH C1 INTO TIME_;
END WHILE;
CLOSE C1;

В приведенном коде программы у меня на выполнение идет запрос на вставку, где SELECT содержит 0 строк и из-за этого, после первого значения курсора процедура заканчивает выполнение, хотя должна проделать три вставки...
Если я убираю (комментирую) строку EXECUTE IMMEDIATE цикл по курсору проходит нормально...
Если я правильно понимаю, то после того как процедура пытается сделать на немедленное выполнение запрос, который вставляет 0 строк происходит сигнал о том, что больше в переменной курсора данных нет... Что я делаю не так?

(Версия: DB2 UDB for iSeries (AS/400) V5R3)
...
Рейтинг: 0 / 0
Курсор и EXECUTE IMMEDIATE
    #34189815
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Почему код работает не так, как вы хотели?
2. Что вы делаете не так?

По-моему, это два разных вопроса ;-)

1. Поскольку
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET c1_end=1;
относится не только к курсору, чтобы код работал так, как вы хотели, вам придётся писать как-то так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
....
WHILE (c1_end= 0 ) DO
   SET STRING_='INSERT INTO Таблица3 (I3, NAME3) SELECT I2, NAME2 FROM Таблица2 WHERE I2=' || I_;
   -- отменить обработку
   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' .... ;
   EXECUTE IMMEDIATE STRING_;
   -- восстановить обработку
   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET c1_end= 1 ;
   FETCH C1 INTO TIME_;
END WHILE;

2. Почему нельзя написать простой insert вместо этой кучи кода? Сколько ни вижу подобных "примеров", не перестаю удивляться. Говорят, в Индии платят построчно, но про Россию такого не слышал.
...
Рейтинг: 0 / 0
Курсор и EXECUTE IMMEDIATE
    #34189898
SunnyVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
процедура имеет входные параметры в зависимости от которых вставляются разные данные... поэтому "простой" INSERT сделать нельзя...
после первого EXECUTE IMMEDIATE курсор завершает свою работу, хотя не должен... вот в этом моя проблема...

так не выходит
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
....
WHILE (c1_end= 0 ) DO
   SET STRING_='INSERT INTO Таблица3 (I3, NAME3) SELECT I2, NAME2 FROM Таблица2 WHERE I2=' || I_;
   -- отменить обработку
   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' .... ;
   EXECUTE IMMEDIATE STRING_;
   -- восстановить обработку
   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET c1_end= 1 ;
   FETCH C1 INTO I_;
END WHILE;

возникает ошибка
SQL State: 42601
Vendor Code: -199
Message: [SQL0199]
Keyword CONTINUE not expected. Valid tokens: GLOBAL.
...
Рейтинг: 0 / 0
Курсор и EXECUTE IMMEDIATE
    #34189940
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SunnyVaпроцедура имеет входные параметры в зависимости от которых вставляются разные данные... поэтому "простой" INSERT сделать нельзя.


Сомнительно как-то.


так не выходит


Ещё одно чудовищное решение "через ж.":
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
....
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET c1_end=CASE xxx= 0  THEN  1  ELSE c1_end END;
....

WHILE (c1_end= 0 ) DO
   SET STRING_='INSERT INTO Таблица3 (I3, NAME3) SELECT I2, NAME2 FROM Таблица2 WHERE I2=' || I_;
   -- отменить обработку
   SET xxx= 1 ;

   EXECUTE IMMEDIATE STRING_;

   -- восстановить обработку
   SET xxx= 0 ;

   FETCH C1 INTO I_;
END WHILE;
...
Рейтинг: 0 / 0
Курсор и EXECUTE IMMEDIATE
    #34189994
SunnyVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Victor, спасибо такая отмена обработки помогла...
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Курсор и EXECUTE IMMEDIATE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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