【问题标题】:How to get the restult table of a stored procedure into a temp table?如何将存储过程的结果表放入临时表?
【发布时间】:2019-09-25 11:23:44
【问题描述】:

环境:

  • DB2 版本 11.1,
  • 操作系统 - Linux

如何将存储过程的结果表放入临时表中?

表和结果表配置相同(firstColumn int, secondColumn nvarchar(255)

【问题讨论】:

    标签: stored-procedures db2 db2-luw


    【解决方案1】:

    我假设您的存储过程返回一个打开的游标,因此您想要使用该游标,将其内容插入到 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 @
    

    【讨论】:

    • 如果我将 `insert into session.thetables(tabschema,tabname) values (v_tabschema, v_tabname);` 行增加到set newDeclaratedVariable = v_tabname,程序永远不会停止。在 DB2 Studio 中,状态是“开始”并且永不停止。改回insert into -Line 它运行良好。这两行有什么区别?
    • @michael-mammut ,与 INSERT 不同,SET 语句不会影响表。如果您提出一个在小示例中显示所有代码的新问题会更好,因为您的后续问题不适合发表评论。如果您有一个不会停止的循环,那么您的代码可能有错误。您也可以在 DataStudio 中调试您的过程。
    猜你喜欢
    • 2020-01-26
    • 2018-07-05
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 2020-12-05
    • 2018-11-16
    • 2014-10-26
    相关资源
    最近更新 更多