【发布时间】:2019-09-25 11:23:44
【问题描述】:
环境:
- DB2 版本 11.1,
- 操作系统 - Linux
如何将存储过程的结果表放入临时表中?
表和结果表配置相同(firstColumn int, secondColumn nvarchar(255))
【问题讨论】:
标签: stored-procedures db2 db2-luw
环境:
如何将存储过程的结果表放入临时表中?
表和结果表配置相同(firstColumn int, secondColumn nvarchar(255))
【问题讨论】:
标签: stored-procedures db2 db2-luw
我假设您的存储过程返回一个打开的游标,因此您想要使用该游标,将其内容插入到 Db2-LUW 上的会话表(声明的全局临时表)中。
除了fetch和insert语句,还需要了解以下语句:
associate result set locator ... with procedure ...
allocate ... cursor for result set ...
这是一个故意人为的嵌套存储过程示例,它显示了从嵌套过程中获取结果集到会话表中。目的是展示语法是如何工作的,而不是对数据做任何有用的事情(因为在这种情况下,一个简单的目录查询同样可以满足净效果)。此示例可以在 Db2 命令行中运行(例如在 bash shell 中,在您连接到具有适当权限的数据库之后):
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 @
【讨论】:
set newDeclaratedVariable = v_tabname,程序永远不会停止。在 DB2 Studio 中,状态是“开始”并且永不停止。改回insert into -Line 它运行良好。这两行有什么区别?
SET 语句不会影响表。如果您提出一个在小示例中显示所有代码的新问题会更好,因为您的后续问题不适合发表评论。如果您有一个不会停止的循环,那么您的代码可能有错误。您也可以在 DataStudio 中调试您的过程。