存储过程中的for循环后发生DB2 Select Statement错误

时间:2018-07-16 10:00:50

标签: sql db2

我编写了一个存储过程,该存储过程使用for循环执行对视图列表的查询。它为for循环内的每个视图生成一个动态sql语句,然后执行它,然后将输出插入声明的临时表中。

for循环可以完美地运行,并且可以正常运行,但是如果我在END FOR之后添加一个select语句;为了从临时表中获得最终输出,我得到了下面的错误。请问有人有什么想法吗?

Error 16/07/2018 10:43:41 0:00:00.007 DB2 Database Error: ERROR [42601] [IBM][DB2/AIX64] SQL0104N An unexpected token "select *" was found following "1; END FOR; ". Expected tokens may include: "<call>". LINE NUMBER=31. SQLSTATE=42601

SQL代码:

BEGIN
 DECLARE SQLTEXT varchar(500);
 DECLARE GLOBAL TEMPORARY TABLE SESSION.AS_USAGE_RESULTS(
  temp table columns
 );

 FOR v as cur1 cursor for
   select distinct viewname,viewschema
   from syscat.VIEWS
  DO

  SET SQLTEXT = 'Dynamic Insert into temp table here' 

  PREPARE s1 FROM SQLTEXT;
  EXECUTE s1;
 END FOR;

 select *
   from SESSION.AS_USAGE_RESULTS;

 DROP TABLE SESSION.AS_USAGE_RESULTS;
END

1 个答案:

答案 0 :(得分:0)

您的错误是,如果您希望从session.as_usage_results返回结果集,则必须声明一个用于选择它的游标,然后打开该游标,然后结束sproc。这是一个常见问题解答。在IBM Db2 Server SAMPLES目录和Db2知识中心中都有示例。

在proc内,您可以使用SELECT ... INTO,也可以在游标中使用select或将SELECT用作SET语句的一部分。

如果在删除表之前不会使用结果集,则不要在该过程中删除会话表。可以将会话表拖放到其他位置,也可以使用其他设计。

在您的示例中,您不需要光标cur1,因此在下面,我展示了一个可能暗示您的意思的高跷人工示例。这是人为的,因为在此示例中您可以看到会话表也是多余的,但是它显示了结果集使用的游标。

--#SET TERMINATOR @

create or replace procedure dynproc1
language sql
specific dynproc1
dynamic result sets 1
BEGIN

    DECLARE v_sqltext varchar(2000);
    DECLARE c1 cursor with return to client for s1;
    DECLARE GLOBAL TEMPORARY TABLE SESSION.AS_USAGE_RESULTS ( viewname varchar(128), viewschema varchar(128) );

    insert into session.as_usage_results(viewname, viewschema) select viewname, viewschema from syscat.views;

    set v_sqltext = 'select * from session.as_usage_results';

    prepare s1 from v_sqltext;

    open c1;
END
@