powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Несколько вопросов по ХП
13 сообщений из 13, страница 1 из 1
Несколько вопросов по ХП
    #35908073
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте всем!

1. Можно ли в теле процедуры объявлять и использовать массивы перменных?
2. Можно ли из процедуры вернуть выборку обычным RETURN (например, return select * from MYTAB), а не классическим способом через курсоры.
3. Можно ли вернуть выборку из временной таблицы, продекларированной внутри процедуры (declare global temporary table)? Возвращать только через открытый курсор или можно другим способом?

Заранее благодарен.
С уважением, Семен Попов
...
Рейтинг: 0 / 0
Несколько вопросов по ХП
    #35908229
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

1. Начиная с v9.5 есть Array support in SQL procedures .
См. также Array support enhances application portability .
2. Нет.
3. Временная таблица, объявленная в процедуре, будет доступно приложению после вызова процедуры.
Обратите внимание на то, что таблицу надо объявлять как 'on commit preserve rows', если нужен доступ к содержимому таблицы после commit.
...
Рейтинг: 0 / 0
Несколько вопросов по ХП
    #35908645
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein1. Начиная с v9.5 есть Array support in SQL procedures .
См. также Array support enhances application portability .
2. Нет.
3. Временная таблица, объявленная в процедуре, будет доступно приложению после вызова процедуры.
Обратите внимание на то, что таблицу надо объявлять как 'on commit preserve rows', если нужен доступ к содержимому таблицы после commit.Спасибо.
Из 2 и 3 понял, что если в процедуре декларируется временная таблица (например, declare global temporary table SESSION.MYTEMP) с опцией 'on commit preserve rows' и заполняется значениями, то после вызова процедуры я могу выполнить обычный select и получить данные?
Код: plaintext
call PREP_TAB; select * from SESSION.MYTEMP;

По 1 пункту. DB2 v8.2. Как же быть? Мне нужно подготовить отчёт (таблица 11 строк Х 10 колонок) - статистические показатели по данным из базы. Не хочется объявлять в процедуре 110 переменных. Думал воспользоваться массивами - объявил бы 10 массивов нужных типов, и работал бы с ними. А в конце закинул бы массивы во временную таблицу и вернул из процедуры. Какой еще подход существует? Не поможет ли мне собственный тип (create type int11 as (v1 int, v2 int,...,v11 int) ), который бы я потом использовал в теле процедуры?
...
Рейтинг: 0 / 0
Несколько вопросов по ХП
    #35908899
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Semen PopovИз 2 и 3 понял, что если в процедуре декларируется временная таблица (например, declare global temporary table SESSION.MYTEMP) с опцией 'on commit preserve rows' и заполняется значениями, то после вызова процедуры я могу выполнить обычный select и получить данные?
Код: plaintext
call PREP_TAB; select * from SESSION.MYTEMP;
Да.
Semen PopovПо 1 пункту. DB2 v8.2. Как же быть? Мне нужно подготовить отчёт (таблица 11 строк Х 10 колонок) - статистические показатели по данным из базы. Не хочется объявлять в процедуре 110 переменных. Думал воспользоваться массивами - объявил бы 10 массивов нужных типов, и работал бы с ними. А в конце закинул бы массивы во временную таблицу и вернул из процедуры. Какой еще подход существует? Не поможет ли мне собственный тип (create type int11 as (v1 int, v2 int,...,v11 int) ), который бы я потом использовал в теле процедуры?Если надо с массивами работать, то лучше писАть java или C процедуру.
...
Рейтинг: 0 / 0
Несколько вопросов по ХП
    #35908995
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark BarinsteinЕсли надо с массивами работать, то лучше писАть java или C процедуру.Как-нибудь и до них дойду. А пользовательские типы, созданные с помощью create type, в SQL PL использовать невозможно? Только в SQL?
...
Рейтинг: 0 / 0
Несколько вопросов по ХП
    #35909013
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Semen PopovА пользовательские типы, созданные с помощью create type, в SQL PL использовать невозможно? Только в SQL?Например так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
create type MY_TYPE as 
( COL_03 int, 
  COL_04 int, 
  COL_05 int, 
  COL_06 int, 
  COL_07 int, 
  COL_08 int, 
  COL_09 int, 
  COL_10 int,
  COL_11 decimal( 11 , 2 ), 
  COL_12 decimal( 11 , 2 ))
mode DB2SQL
@
create procedure MY_PROC ()

   language sql
   modifies sql data
   no external action
   not deterministic
begin atomic
  declare sp_rec REF(MY_TYPE);
...
  set sp_rec.COL_03= 0 ;
...
...
Рейтинг: 0 / 0
Несколько вопросов по ХП
    #35910308
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё вопрос. Можно ли в теле процедуры пробежаться по таблице, не используя курсор? Например так, как было возможно в функции
Код: plaintext
1.
2.
3.
4.
5.
6.
declare myvar int default  0 ;
...
for v as
  select * from MYTAB;
do
  set myvar=myvar+v.FLD;
end for;
У меня ругается на myvar. Мол нельзя использовать в этом месте. Может есть другие варианты без курсора? А то для курсора надо будет еще заводить переменные, в которые будет считана запись.
...
Рейтинг: 0 / 0
Несколько вопросов по ХП
    #35910338
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Semen Popov,

Нельзя использовать ';' после select.
...
Рейтинг: 0 / 0
Несколько вопросов по ХП
    #35910404
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark BarinsteinSemen Popov,

Нельзя использовать ';' после select.Извините, это здесь написал от руки. А в том коде, что использую символа ';' нет. Но переменную не пропускает. Если убрать строку с присваиванием, то все в порядке.
Код: plaintext
1.
2.
3.
4.
5.
6.
declare myvar int default  0 ;
...
for v as
  select * from MYTAB
do
  -- set myvar=myvar+v.FLD;
end for;
Пороюсь тогда в переменных. Что-то не так.
...
Рейтинг: 0 / 0
Несколько вопросов по ХП
    #35910493
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Semen Popov,

Так работает
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
create procedure test()
begin 
  declare myvar int default  0 ;
  for v as 
    select * from syscat.tables where tabschema='SYSCAT'
  do
    set myvar=myvar+v.npages;
  end for;
end@
?
...
Рейтинг: 0 / 0
Несколько вопросов по ХП
    #35910504
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DB2 v8.2. Странно. Вот вся процедура:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create procedure TESTDB.MYPROC()
   language sql
spbody: begin atomic
 decl: begin
  -- Перменные для накопления итогов
  declare sp_var int default  0 ;
 end decl; 
 body: begin
  for res as
      select * from TESTDB.MYTAB
  do
      set sp_var=sp_var+res.FLD;
  end for;
 end body;
end spbody
@

Почему ругается на переменную sp_var? Говорит, что недопустимо использовать в том месте.
...
Рейтинг: 0 / 0
Несколько вопросов по ХП
    #35910586
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Semen Popov: DB2 v8.2. Странно. Вот вся процедура:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create procedure TESTDB.MYPROC()
   language sql
spbody: begin atomic
 decl: begin
  -- Перменные для накопления итогов
  declare sp_var int default  0 ;
 end decl; 
 body: begin
  for res as
      select * from TESTDB.MYTAB
  do
      set sp_var=sp_var+res.FLD;
  end for;
 end body;
end spbody
@

Почему ругается на переменную sp_var? Говорит, что недопустимо использовать в том месте.
Потому что переменная sp_var находится все зоны видимости.
Переменная видна только внутри compound блока (begin ... end), в котором она описана, а также внутри вложенных блоков в этот блок.
У вас же переменная описана в одном блоке, а используется в другом.
...
Рейтинг: 0 / 0
Несколько вопросов по ХП
    #35910711
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. Хотел как лучше, а получилось как всегда.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Несколько вопросов по ХП
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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