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

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

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

я писал такую фигню на Embedded SQL. лучше этого не делать, а написать на cli, на порядок проще будет. если конечно cli сойдёт, нет там коорд. транзакций вроде MQ и так далее.. а то cli не всегда сойдёт..
...
Рейтинг: 0 / 0
execute immediate
    #35509372
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос скорее теоретический чем практический. Его цель понять как реализовать в 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
execute immediate
    #35509438
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
execute immediate
    #35509458
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
execute immediate
    #35509656
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
8 сообщений из 8, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / execute immediate
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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