powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / у меня проблема с declare cursor в db2
7 сообщений из 7, страница 1 из 1
у меня проблема с declare cursor в db2
    #36901048
shahruz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CREATE FUNCTION getpribcap (idinv_shets int)
RETURNS varchar(250)
BEGIN
declare retval varchar(250);
declare iddevice int;
declare amnt int;
declare i int;
declare SQLCODE int;
set i=1;
set retval='';

declare cur1 cursor for
select iddevice,amnt from shet_devices a where a.idinv_shets=idinv_shets;

open cur1;
FETCH cur1 into iddevice,amnt;
WHILE (SQLCODE !=100) do
set retval=retval+case when i=1 then '' else '*' end||ltrim(str(iddevice))||'#'+ltrim(str(amnt));
FETCH cur1 into iddevice,amnt;
set i=i+1;
END WHILE;
CLOSE cur1;
RETURN retval;
END@

что здесь неправильно???
SQL0104N Обнаружен неправильный элемент "<cursor declaration>" после текста
"". Список возможных правильных элементов: "<SQL statement>". LINE
NUMBER=13. SQLSTATE=42601 ... такая ошибка выдаёт.. помогите решить ... Заранее спасибо!
...
Рейтинг: 0 / 0
у меня проблема с declare cursor в db2
    #36901161
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
shahruz,

неправильный порядок следования команд.
Сначала надо декларации, потом исполняемые операторы.

Т.е. вместо:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
...
declare SQLCODE int;
set i= 1 ;
set retval='';

declare cur1 cursor for
select iddevice,amnt from shet_devices a where a.idinv_shets=idinv_shets;
...
надо:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
...
declare SQLCODE int;
declare cur1 cursor for
select iddevice,amnt from shet_devices a where a.idinv_shets=idinv_shets;

set i= 1 ;
set retval='';
...
...
Рейтинг: 0 / 0
у меня проблема с declare cursor в db2
    #36901285
shahruz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,

огромное спасибо...
...
Рейтинг: 0 / 0
у меня проблема с declare cursor в db2
    #36902500
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извините меня, но, перед тем, как заниматься всякой фигнёй (т.е. временные таблицы, хранимые процедуры, курсоры), вы лучше как следует проштудировали бы кулинарную книжку (http://mysite.verizon.net/Graeme_Birchall/id1.html).

(Если уже проштудировали, ещё раз извините).
...
Рейтинг: 0 / 0
у меня проблема с declare cursor в db2
    #36902703
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правда, теперь в кулинарной книжке этой фигне тоже уделено некоторое внимание, но не в этом дело. Когда-то в DB2 этого не было, но она и тогда была весьма крута.

Я бы начинающим вообще запретил бы использование SQL PL (PL/SQL) с сопутствующими прибамбасами, да кто же меня послушает. В результате приходится поддерживать тошнотворных тормознутых монстров, написанных в допотопном, клипперном стиле. Люди так привыкли писать и ничего плохого в этом не видят. Открыли курсор и погнали в цикле, а там куча if-ов с вызовами хранимых процедур, которые тоже открывают курсоры, вставляют/удаляют в десятки временных таблиц и т.д. В результате на одной из систем бедный Oracle требует держать max open cursors больше 600, хотя утечки курсоров нет и одновременно активно работает совсем немного клиентов. А самый смак - когда при этом на клиенте рисуют прогресс-бар, делая сотни вызовов вместо одного (а когда впридачу план выполнения косой, это и замедляет в сотни раз). Про гигабайты логов (реальных данных прибавляется на пару порядков меньше) и не говорю.
...
Рейтинг: 0 / 0
у меня проблема с declare cursor в db2
    #36903081
shahruz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Victor Metelitsa,

спасибо за совет, я подумаю
...
Рейтинг: 0 / 0
у меня проблема с declare cursor в db2
    #36965068
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, свежий пример. На днях прислали (поскольку DB2 теперь поддерживает PL/SQL, то это не оффтопик):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
DECLARE
  v_SOME_VAR NUMBER :=  12345 ;
  Cursor c_SOME_CURSOR (p_SOME_PARAM IN t_SOME_TABLE.ID%TYPE) is
    select * 
    from t_SOME_TABLE 
    where some_master_id = p_SOME_PARAM 
      and some_another_param <> 'Some Value';
BEGIN
  for VVV in c_SOME_CURSOR(v_SOME_VAR) loop
    Update t_SOME_TABLE 
    set some_master_id = ID
    where ID = VVV.ID;
  end Loop;
  COMMIT;
EXCEPTION
  WHEN OTHERS THEN
  ROLLBACK;
  RAISE;
END;
/
Тут ведь напрашивается что-то типа такого
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Update t_SOME_TABLE t1
set t1.some_master_id = t1.ID
where t1.ID in (    
    select t2.id
    from t_SOME_TABLE t2
    where t2.some_master_id =  12345  
      and t2.some_another_param <> 'Some Value');
а если ещё пару секунд подумать, то до такого:
Код: plaintext
1.
2.
3.
Update t_SOME_TABLE t1
set t1.some_master_id = t1.ID
where t1.some_master_id =  12345  and t1.some_another_param <> 'Some Value';
Не то, чтобы именно приведённый выше скрипт был проблемой - его надо было запустить один раз и реально он правит всего одну запись. Проблема в том, что народ вообще так пишет и считает это совершенно нормальным. В самом деле, курсоры зачем-то придумали? Значит, ими надо пользоваться.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / у меня проблема с declare cursor в db2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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