Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / execute immediate / 8 сообщений из 8, страница 1 из 1
27.08.2008, 00:24
    #35507535
Kru
Kru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
execute immediate
Господа,
Можно ли решить такую задачку средствами DB:

Есть таблица с именами таблиц. Нужно пройтись по всем записям и для каждой выполнить select * from table.

Заранее спасибо
...
Рейтинг: 0 / 0
27.08.2008, 07:15
    #35507651
Peter Wilson
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
execute immediate
добрый день!
я бы это реализовал хранимой процедурой.
...
Рейтинг: 0 / 0
27.08.2008, 11:10
    #35507945
Vladimir Kiselev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
execute immediate
Вопрос не совсем понятен, а именно, какой нужно получить результат?
Все таблицы имеют одинаковую структуру?
...
Рейтинг: 0 / 0
27.08.2008, 15:12
    #35508799
NewYear
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
execute immediate
ну наверно результаты этих селектов нужно куда-то деть.
структура таблиц всё-таки разная наверно :)

я писал такую фигню на Embedded SQL. лучше этого не делать, а написать на cli, на порядок проще будет. если конечно cli сойдёт, нет там коорд. транзакций вроде MQ и так далее.. а то cli не всегда сойдёт..
...
Рейтинг: 0 / 0
27.08.2008, 17:51
    #35509372
Kru
Kru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
execute immediate
Вопрос скорее теоретический чем практический. Его цель понять как реализовать в DB2 динамический запрос, если этот запрос возвращает данные.

Например, как реализовать в DB2 такой алгоритм.

Если параметр = 1 выполнить select * from table1
если = 2, то выполнить select * from table2
...
если = т, то выполнить select * from tableN

Структура таблиц разная.

Если кому доводилось работать с Sybase или MSSQL, то там есть возможность сгенерить текст запроса в процедуре и потом его выполнить execute (текст запроса).

В этих СУБД подобная задачка не вызывает никаких трудностей.

В DB2 же я пока вижу одно решение динамически создавать код на создание временной таблицы структура которой должна быть такая же как и у таблицы источника и код вставки данных во временную таблицу. Потом открывать курсор на этой таблице. Я привёл пример ниже.
Это решение работает, но главный недостаток в том что нужно копировать данные.

Может быть есть более эффективный способ решить подобную задачку?

Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
create table tempdb.table1 (a int);
create table tempdb.table2 (a int, b int);
insert into tempdb.table1 values ( 1 );
insert into tempdb.table2 values ( 1 , 2 );

create procedure tempdb.test (in_tab_id smallint)
begin
    declare i_crea varchar( 100 );
    declare i_drop varchar( 100 );
    declare i_ins varchar( 100 );
    if ( 1 = 2 ) then
        declare global temporary table table1 (a int);
    end if;
    
    if in_tab_id =  1  then
        set i_crea = 'declare global temporary table table1 (a int) ON COMMIT preserve  ROWS';
    else
        set i_crea = 'declare global temporary table table1 (a int, b int) ON COMMIT preserve  ROWS';
    end if;
    execute immediate i_crea;
p1: begin
        declare c_res cursor with return for
        select * from session.table1;

        if in_tab_id =  1  then
            set i_ins = 'insert into session.table1 select * from tempdb.table1';
        else
            set i_ins = 'insert into session.table1 select * from tempdb.table2';
        end if;
                
        execute immediate i_ins;

        open c_res;
               
   end p1;
end
;

call tempdb.test( 2 )
...
Рейтинг: 0 / 0
27.08.2008, 18:18
    #35509438
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
execute immediate
KruВопрос скорее теоретический чем практический. Его цель понять как реализовать в DB2 динамический запрос, если этот запрос возвращает данные.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create procedure dyn_test(stmt varchar( 4000 ))
dynamic result sets  1 
begin
  declare c1 cursor with return for s1;
  prepare s1 from stmt;
  open c1;
end@

call dyn_test('values 1')@

call dyn_test('select tabschema, tabname, colname from syscat.columns fetch first 10 rows only')@
...
Рейтинг: 0 / 0
27.08.2008, 18:24
    #35509458
NewYear
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
execute immediate
Mark Barinstein KruВопрос скорее теоретический чем практический. Его цель понять как реализовать в DB2 динамический запрос, если этот запрос возвращает данные.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create procedure dyn_test(stmt varchar( 4000 ))
dynamic result sets  1 
begin
  declare c1 cursor with return for s1;
  prepare s1 from stmt;
  open c1;
end@

call dyn_test('values 1')@

call dyn_test('select tabschema, tabname, colname from syscat.columns fetch first 10 rows only')@


а теперь теперь этот курсор распечатать :)
...
Рейтинг: 0 / 0
27.08.2008, 20:45
    #35509656
Kru
Kru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
execute immediate
Mark Barinstein KruВопрос скорее теоретический чем практический. Его цель понять как реализовать в DB2 динамический запрос, если этот запрос возвращает данные.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create procedure dyn_test(stmt varchar( 4000 ))
dynamic result sets  1 
begin
  declare c1 cursor with return for s1;
  prepare s1 from stmt;
  open c1;
end@

call dyn_test('values 1')@

call dyn_test('select tabschema, tabname, colname from syscat.columns fetch first 10 rows only')@


Огромное спасибо.
То что надо
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / execute immediate / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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