Как получить таблицу результатов хранимой процедуры во временную таблицу? - PullRequest
0 голосов
/ 25 сентября 2019

Окружающая среда:

  • DB2 Версия 11.1,
  • ОС - Linux

Как получить таблицу результатов хранимой процедуры во временную таблицу?

Таблица и результат имеют одинаковую конфигурацию таблицы (firstColumn int, secondColumn nvarchar(255))

1 Ответ

1 голос
/ 25 сентября 2019

Я предполагаю, что ваша хранимая процедура возвращает открытый курсор, поэтому вы хотите использовать этот курсор, вставляя его содержимое в таблицу сеансов (объявленную глобальной временной таблицей) в Db2-LUW.

В дополнение кдля извлечения и вставки операторов необходимо понимать следующие операторы:

ассоциировать указатель набора результатов ... с процедурой ...

allocate ...курсор для набора результатов ...

Вот намеренно искусственный пример вложенной хранимой процедуры, которая показывает выборку набора результатов из вложенной процедуры в таблицу сеанса.Цель состоит в том, чтобы показать, как работает синтаксис, а не делать что-либо полезное с данными (поскольку в этом случае чистый эффект может быть одинаково встречен простой очередью каталога).Этот пример можно запустить из командной строки Db2 (например, в оболочке bash после подключения к базе данных с соответствующими разрешениями):

update command options using s on ;

--#SET TERMINATOR @

create or replace procedure alltabs
dynamic result sets 1
language sql
specific alltabs
begin
  declare v_cur cursor with return to caller for select tabschema,tabname,type  from syscat.tables ;
  open v_cur;
end@


declare global temporary table session.thetables(tabschema varchar(128), tabname varchar(128))
not logged with replace on commit preserve rows  @


create or replace procedure populate_dgtt()
language sql
specific populate_dgtt
begin
  declare v_rs result_set_locator varying;
  declare v_tabschema varchar(128);
  declare v_tabname   varchar(128);
  declare v_type      char(1);
  declare sqlstate char(5) default '00000';
  call alltabs;
  associate result set locator (v_rs) with procedure alltabs;
  allocate v_rscur cursor for result set v_rs;
  fetch from v_rscur into v_tabschema, v_tabname, v_type;
  while ( sqlstate = '00000') do
      if v_type='V' and v_tabschema='SYSSTAT'
      then
          insert into session.thetables(tabschema,tabname) values (v_tabschema, v_tabname);
      end if;
      fetch from v_rscur into v_tabschema, v_tabname, v_type;
  end while;
  return;
end@

call populate_dgtt()@

select rtrim(Tabschema)||'.'||rtrim(tabname) from session.thetables @
...