Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Помогите Temporary table и cursor / 16 сообщений из 16, страница 1 из 1
02.01.2007, 08:01
    #34234627
Don VinNi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите Temporary table и cursor
Создаю следующую процедуру где создаю временную таблицу и вывожу результать с помощью курсора

create procedure myTemp()
result set 1
language sql
begin
declare vr_sum decimal(15,2);
declare vr_g33a char(4);
declare vr_summa decimal(15,2);
declare global temporary table session.temp1 like t_st2006 on commit preserve rows not logged
in usertemp1;
declare myCursor1 cursor for select char(g33a,4), sum(g46) from t_st2006 where g01a='ЭК' and
g54d between '2006-01-01' and '2006-12-31' group by char(g33a,4);
declare myCursor cursor with return for select * from session.temp1;
select sum(g46) into vr_summa from t_st2006 where g01a='ЭК' and g54d between '2006-01-0' and '2006-12-31';
open myCursor1;
while sqlcode=000 do
fetch myCursor1 into vr_g33a, vr_sum;
if vr_sum>=vr_summa then insert into session.temp1 select * from t_st2006
where char(g33a, 4)=vr_g33a and g54d between '2006-01-0' and '2006-12-31';
end if;
end while;
close myCursor1;
open myCursor;
end@

Вроди все ОК, но процессор командной строки ругается на:
SQL0104N Обнаружен неправильный элемент "<cursor declaration>" после текста "". Список правильных элементов: "<SQL statement>". LINE NUMBER=9. SQLSTATE=42601
...
Рейтинг: 0 / 0
02.01.2007, 11:50
    #34234720
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите Temporary table и cursor
Нельзя объвлять сначала временные таблицы, а потом курсор. Есть правила в порядке объявления...
...
Рейтинг: 0 / 0
03.01.2007, 07:26
    #34235312
Don VinNi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите Temporary table и cursor
TORTНельзя объвлять сначала временные таблицы, а потом курсор. Есть правила в порядке объявления...

Какова порядок объявления? Если вставить объявление временной таблицы после курсора коммандная строка ругается на:

SQL0204N Имя "SESSION.TEMP1" не было определено. LINE NUMBER=9
SQLSTATE=42704

create procedure myTemp()
result set 1
language sql
begin
declare vr_sum decimal(15,2);
declare vr_g33a char(4);
declare vr_summa decimal(15,2);
declare myCursor1 cursor for select char(g33a,4), sum(g46) from t_st2006 where g01a='ЭК' and
g54d between '2006-01-01' and '2006-12-31' group by char(g33a,4);
declare myCursor cursor with return for select * from session.temp1;
declare global temporary table session.temp1 like t_st2006 on commit preserve rows not logged
in usertemp1;

select sum(g46) into vr_summa from t_st2006 where g01a='ЭК' and g54d between '2006-01-0' and '2006-12-31';
open myCursor1;
while sqlcode=000 do
fetch myCursor1 into vr_g33a, vr_sum;
if vr_sum>=vr_summa then insert into session.temp1 select * from t_st2006
where char(g33a, 4)=vr_g33a and g54d between '2006-01-0' and '2006-12-31';
end if;
end while;
close myCursor1;
open myCursor;
end@
...
Рейтинг: 0 / 0
03.01.2007, 09:38
    #34235347
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите Temporary table и cursor
Я динамически делал:
declare c1 cursor for s1;
set SQL_CMD = "SELECT FIELD1 FROM SESSION.MYTABLE";
PREPARE s1 from SQL_CMD;
open c1;
.......................
вот что-то вроде этого
...
Рейтинг: 0 / 0
04.01.2007, 08:19
    #34236427
Don VinNi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите Temporary table и cursor
TORTЯ динамически делал:
declare c1 cursor for s1;
set SQL_CMD = "SELECT FIELD1 FROM SESSION.MYTABLE";
PREPARE s1 from SQL_CMD;
open c1;
.......................
вот что-то вроде этого
Спасибо за совет кажется все работает ОК!!!. Процедура откомпилировался успешно но при вызове статус возврата = 0;
Для проверки создал в БД настоящую таблицу temp1. Вызвал процедуру но результат не вышел на экран. Посмотрел в БД таблица temp1 заполнена данными. В чем же причина? Вроде бы курсор открыт для выводы результата.

Вот скрипт:
Код: 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 temp()
result set  1 
language sql
begin
declare vr_sum decimal( 15 , 2 );
declare vr_g33a char( 4 );
declare vr_summa decimal( 15 , 2 );
declare vr_count smallint;
declare myCursor1 cursor for select char(g33a, 4 ), sum(g46) from t_st2006 where g01a='ЭК' and g54d between '2006-01-01' and '2006-12-31' group by char(g33a, 4 );
declare myCursor cursor for select * from temp1;
select count(g33a) into vr_count from t_st2006 where g01a='ЭК' and g54d between '2006-01-01' and '2006-12-31';
select sum(g46) into vr_summa from t_st2006 where g01a='ЭК' and g54d between '2006-01-01' and '2006-12-31';
set vr_summa=(vr_summa* 5 )/ 100 ;
open myCursor1;
  while vr_count<> 0  do
     set vr_count=vr_count- 1 ;
     fetch myCursor1 into vr_g33a, vr_sum;
     if vr_sum>=vr_summa then insert into temp1 select * from t_st2006 where char(g33a,  4 )=vr_g33a and              g54d between '2006-01-01' and '2006-12-31';
     end if;
  end while;
close myCursor1;
open myCursor;
end @
...
Рейтинг: 0 / 0
04.01.2007, 08:52
    #34236439
Don VinNi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите Temporary table и cursor
Забыл еще один вопрос задать. Как использовать sqlcode для цикла вместо счетчика что бы после окончание строк в курсоре, цикл завершилась.
Sqlcode является ключевым словом или ее где то надо объявить?

Код: plaintext
1.
2.
3.
4.
5.
6.
while vr_count<> 0  do
     set vr_count=vr_count- 1 ;
     fetch myCursor1 into vr_g33a, vr_sum;
     if vr_sum>=vr_summa then insert into temp1 select * from t_st2006 where char(g33a,  4 )=vr_g33a and              g54d between '2006-01-01' and '2006-12-31';
     end if;
  end while;
...
Рейтинг: 0 / 0
04.01.2007, 09:27
    #34236455
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите Temporary table и cursor
Насчет курсора: declare c1 cursor with return for.....
про опции курсора в доке почитайте....
...
Рейтинг: 0 / 0
04.01.2007, 09:28
    #34236456
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите Temporary table и cursor
declare SQLSTATE char(5);
declare SQLCODE integer;
в начале процедуры вполне достаточно
...
Рейтинг: 0 / 0
05.01.2007, 16:50
    #34238593
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите Temporary table и cursor
Don VinNiЗабыл еще один вопрос задать. Как использовать sqlcode для цикла вместо счетчика что бы после окончание строк в курсоре, цикл завершилась.
Sqlcode является ключевым словом или ее где то надо объявить?

1.
С курсорами обычно работают так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
DECLARE at_end INT;
DECLARE c1 CURSOR ...;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET at_end =  1 ;
...
OPEN c1 ...;
SET at_end= 0 ;
FETCH c1 INTO ...;
WHILE (at_end= 0 ) DO
 ...
 SET at_end= 0 ;
 FETCH c1 INTO ...;
END WHILE;
Если очередной fetch позиционирует курсор за последней записью, то управление передастся handler'у, который выставит флаг и передаст управление в ту же точку, откуда этот handler был вызван.

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

P.S.:
А вообще в вашем случае можно одним insert ... select обойтись и не городить циклов, курсоров - быстрее работать будет...
...
Рейтинг: 0 / 0
08.01.2007, 08:36
    #34240731
Don VinNi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите Temporary table и cursor
Mark Barinstein Don VinNiЗабыл еще один вопрос задать. Как использовать sqlcode для цикла вместо счетчика что бы после окончание строк в курсоре, цикл завершилась.
Sqlcode является ключевым словом или ее где то надо объявить?

1.
С курсорами обычно работают так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
DECLARE at_end INT;
DECLARE c1 CURSOR ...;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET at_end =  1 ;
...
OPEN c1 ...;
SET at_end= 0 ;
FETCH c1 INTO ...;
WHILE (at_end= 0 ) DO
 ...
 SET at_end= 0 ;
 FETCH c1 INTO ...;
END WHILE;
Если очередной fetch позиционирует курсор за последней записью, то управление передастся handler'у, который выставит флаг и передаст управление в ту же точку, откуда этот handler был вызван.

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

P.S.:
А вообще в вашем случае можно одним insert ... select обойтись и не городить циклов, курсоров - быстрее работать будет...

create procedure myTemp()
result set 1
language sql
begin
declare vr_sum decimal(15,2);
declare vr_g33a char(4);
declare vr_summa decimal(15,2);
declare vr_count smallint;
declare SQL_CMD varchar(100);
declare myCursor1 cursor for select char(g33a,4), sum(g46) from t_st2006 where g01a='ЭК' and g54d between '2006-01-01' and '2006-12-31' group by char(g33a,4);
declare myCursor cursor with return for s1;
declare global temporary table session.temp1 like t_st2006 on commit preserve rows not logged in usertemp1;
set SQL_CMD='select * from session.temp1';
prepare s1 from SQL_CMD;
select count(distinct char(g33a,4)) into vr_count from t_st2006 where char(g33a,4)=any(select char(g33a,4) from t_st2006 where g01a='ЭК' and g54d between '2006-01-01' and '2006-12-31' group by char(g33a,4));
select sum(g46) into vr_summa from t_st2006 where g01a='ЭК' and g54d between '2006-01-01' and '2006-12-31';
open myCursor1;
while vr_count<>0 do
set vr_count=vr_count-1;
fetch myCursor1 into vr_g33a, vr_sum;
if vr_sum>=vr_summa then insert into session.temp1 select * from t_st2006 where char(g33a, 4)=vr_g33a and g54d between '2006-01-01' and '2006-12-31' and g01a='ЭК ';
end if;
end while;
close myCursor1;
open myCursor;
end@

Объявил временную таблицу. Откомпелировалься нормально. Вызвал процедуру call myTemp Но результат пустой.
Попробывал с обичным таблицой она запольняется и показывает результат работы.
...
Рейтинг: 0 / 0
08.01.2007, 08:49
    #34240737
Don VinNi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите Temporary table и cursor
С курсорами обычно работают так:
Код: plaintext
1.
DECLARE CONTINUE HANDLER FOR NOT FOUND SET at_end =  1 ;


Про CONTINUE HANDLER где можно узнать подробнее. В основном использую для справки SQL 8.2 Referance vol 2, но ненашел про CONTINUE HANDLER
...
Рейтинг: 0 / 0
08.01.2007, 12:16
    #34240935
Don VinNi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите Temporary table и cursor
Don VinNi
С курсорами обычно работают так:
Код: plaintext
1.
DECLARE CONTINUE HANDLER FOR NOT FOUND SET at_end =  1 ;


Про CONTINUE HANDLER где можно узнать подробнее. В основном использую для справки SQL 8.2 Referance vol 2, но ненашел про CONTINUE HANDLER

Вопрос про CONTINUE HANDLER отподает!
...
Рейтинг: 0 / 0
09.01.2007, 09:37
    #34241911
golsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите Temporary table и cursor
Тебе же сказали как работать с курсорами, оператор

if vr_sum>=vr_summa then insert into session.temp1 select * from t_st2006
where char(g33a, 4)=vr_g33a and g54d between '2006-01-0' and '2006-12-31';

end if;

поменяет sqlcode! Обрати внимание

Mark Barinstein
SET at_end=0;
FETCH c1 INTO ...;
WHILE (at_end=0) DO
...
SET at_end=0;
FETCH c1 INTO ...;
END WHILE;

операторы
Код: plaintext
1.
2.
 SET at_end= 0 ;
 FETCH c1 INTO ...;
ходят в паре и feth последний в цикле - чтобы в while не словить левый at_end
...
Рейтинг: 0 / 0
09.01.2007, 10:34
    #34242052
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите Temporary table и cursor
golsaif vr_sum>=vr_summa then insert into session.temp1 select * from t_st2006
where char(g33a, 4)=vr_g33a and g54d between '2006-01-0' and '2006-12-31';

end if;

поменяет sqlcode!
sqlcode поменяется только в случае, если этот оператор вызовет ошибку.
Если этот insert select ничего не вставит, поменяется sqlstate (на '02000'), а не sqlcode.
...
Рейтинг: 0 / 0
11.01.2007, 14:08
    #34248781
Don VinNi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите Temporary table и cursor
Спасибо всем за помощь! Тема закрыто.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
02.11.2009, 15:05
    #36286105
db2alex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите Temporary table и cursor
Вот, нашёл на просторах интернета ещё способ:

CREATE PROCEDURE FETCH_CS01_TEST_RESULTS_PRCXYZ()
RESULT SETS 1
LANGUAGE SQL
P1 : BEGIN


DECLARE GLOBAL TEMPORARY TABLE XYZ(
ID INTEGER);




P2 : BEGIN


DECLARE c1 CURSOR WITH RETURN FOR SELECT ID FROM SESSION.XYZ ;


OPEN c1;

END P2;
END P1
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Помогите Temporary table и cursor / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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