我编写了一个存储过程,该存储过程使用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
答案 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
@