Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Новый топик    Ответить
 Несколько вопросов по ХП  [new]
Semen Popov
Member

Откуда: Сыктывкар
Сообщений: 793
Здравствуйте всем!

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

Заранее благодарен.
С уважением, Семен Попов
2 апр 09, 12:57    [7011125]     Ответить | Цитировать Сообщить модератору
 Re: Несколько вопросов по ХП  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4946
Здравствуйте.

1. Начиная с v9.5 есть Array support in SQL procedures.
См. также Array support enhances application portability.
2. Нет.
3. Временная таблица, объявленная в процедуре, будет доступно приложению после вызова процедуры.
Обратите внимание на то, что таблицу надо объявлять как 'on commit preserve rows', если нужен доступ к содержимому таблицы после commit.
2 апр 09, 13:38    [7011516]     Ответить | Цитировать Сообщить модератору
 Re: Несколько вопросов по ХП  [new]
Semen Popov
Member

Откуда: Сыктывкар
Сообщений: 793
Mark Barinstein
1. Начиная с 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 и получить данные?
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) ), который бы я потом использовал в теле процедуры?
2 апр 09, 15:20    [7012493]     Ответить | Цитировать Сообщить модератору
 Re: Несколько вопросов по ХП  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4946
Semen Popov
Из 2 и 3 понял, что если в процедуре декларируется временная таблица (например, declare global temporary table SESSION.MYTEMP) с опцией 'on commit preserve rows' и заполняется значениями, то после вызова процедуры я могу выполнить обычный select и получить данные?
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 процедуру.
2 апр 09, 16:25    [7013134]     Ответить | Цитировать Сообщить модератору
 Re: Несколько вопросов по ХП  [new]
Semen Popov
Member

Откуда: Сыктывкар
Сообщений: 793
Mark Barinstein
Если надо с массивами работать, то лучше писАть java или C процедуру.
Как-нибудь и до них дойду. А пользовательские типы, созданные с помощью create type, в SQL PL использовать невозможно? Только в SQL?
2 апр 09, 16:56    [7013407]     Ответить | Цитировать Сообщить модератору
 Re: Несколько вопросов по ХП  [new]
Semen Popov
Member

Откуда: Сыктывкар
Сообщений: 793
Semen Popov
А пользовательские типы, созданные с помощью create type, в SQL PL использовать невозможно? Только в SQL?
Например так
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;
...
2 апр 09, 17:02    [7013460]     Ответить | Цитировать Сообщить модератору
 Re: Несколько вопросов по ХП  [new]
Semen Popov
Member

Откуда: Сыктывкар
Сообщений: 793
Ещё вопрос. Можно ли в теле процедуры пробежаться по таблице, не используя курсор? Например так, как было возможно в функции
declare myvar int default 0;
...
for v as
  select * from MYTAB;
do
  set myvar=myvar+v.FLD;
end for;
У меня ругается на myvar. Мол нельзя использовать в этом месте. Может есть другие варианты без курсора? А то для курсора надо будет еще заводить переменные, в которые будет считана запись.
3 апр 09, 12:11    [7016768]     Ответить | Цитировать Сообщить модератору
 Re: Несколько вопросов по ХП  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4946
Semen Popov,

Нельзя использовать ';' после select.
3 апр 09, 12:19    [7016824]     Ответить | Цитировать Сообщить модератору
 Re: Несколько вопросов по ХП  [new]
Semen Popov
Member

Откуда: Сыктывкар
Сообщений: 793
Mark Barinstein
Semen Popov,

Нельзя использовать ';' после select.
Извините, это здесь написал от руки. А в том коде, что использую символа ';' нет. Но переменную не пропускает. Если убрать строку с присваиванием, то все в порядке.
declare myvar int default 0;
...
for v as
  select * from MYTAB
do
  -- set myvar=myvar+v.FLD;
end for;
Пороюсь тогда в переменных. Что-то не так.
3 апр 09, 12:35    [7016978]     Ответить | Цитировать Сообщить модератору
 Re: Несколько вопросов по ХП  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4946
Semen Popov,

Так работает
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@
?
3 апр 09, 12:56    [7017179]     Ответить | Цитировать Сообщить модератору
 Re: Несколько вопросов по ХП  [new]
Semen Popov
Member

Откуда: Сыктывкар
Сообщений: 793
DB2 v8.2. Странно. Вот вся процедура:
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? Говорит, что недопустимо использовать в том месте.
3 апр 09, 12:59    [7017200]     Ответить | Цитировать Сообщить модератору
 Re: Несколько вопросов по ХП  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4946
+ Semen Popov: DB2 v8.2. Странно. Вот вся процедура:

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), в котором она описана, а также внутри вложенных блоков в этот блок.
У вас же переменная описана в одном блоке, а используется в другом.
3 апр 09, 13:22    [7017391]     Ответить | Цитировать Сообщить модератору
 Re: Несколько вопросов по ХП  [new]
Semen Popov
Member

Откуда: Сыктывкар
Сообщений: 793
Спасибо. Хотел как лучше, а получилось как всегда.
3 апр 09, 14:07    [7017838]     Ответить | Цитировать Сообщить модератору
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Ответить