【问题标题】:Db2 Pivot function - fetch next statementDb2 Pivot 函数 - 获取下一条语句
【发布时间】:2018-04-17 06:58:09
【问题描述】:

https://www.itjungle.com/2015/04/21/fhg042115-story01/ 下可以找到一篇关于如何编写通用 Db2 枢轴方法的好文章。

执行以下代码(注意 'end #' 而不是 'end ;'):

SET SCHEMA = TESTSCHEMA;

CREATE PROCEDURE DO_PIVOT
(IN FOR_SCHEMA CHARACTER (10) , 
IN FOR_TABLE CHARACTER (10) , 
IN PIVOT_COLUMN VARCHAR (250) , 
IN VALUE_COLUMN VARCHAR (250) , 
IN AGG_FUNCTION VARCHAR (5) DEFAULT 'SUM' , 
IN GROUP_COLUMN VARCHAR (250) DEFAULT NULL ) 
LANGUAGE SQL 
MODIFIES SQL DATA 
PROGRAM TYPE SUB 
CONCURRENT ACCESS RESOLUTION DEFAULT 
DYNAMIC RESULT SETS 1 
OLD SAVEPOINT LEVEL COMMIT ON RETURN NO 

BEGIN
DECLARE SQLCODE INTEGER DEFAULT 0 ;
DECLARE SQL_STATEMENT VARCHAR ( 5000 ) ;
DECLARE PIVOT_VALUE VARCHAR ( 20 ) ;
DECLARE PAD CHAR ( 2 ) DEFAULT ' ' ;
DECLARE C1 CURSOR FOR D1 ;
DECLARE C2 CURSOR WITH RETURN FOR D2 ;

SET SCHEMA = FOR_SCHEMA ;

-- Get the list of values available for the pivot column

-- Each value will be a column in the return set
SET SQL_STATEMENT = 'select distinct ' 
                   || PIVOT_COLUMN  
                   || ' from ' 
                   || FOR_TABLE 
                   || ' order by 1' ;

PREPARE D1 FROM SQL_STATEMENT ;
OPEN C1 ;

-- Construct a dynamic select statement for the pivot
SET SQL_STATEMENT = 'select ' ;

-- If requested, add the Group By Column 
-- to the select clause
IF GROUP_COLUMN IS NOT NULL THEN
  SET SQL_STATEMENT = SQL_STATEMENT || GROUP_COLUMN ;
  SET PAD = ', ' ;
END IF ;

-- For each possible value for the Pivot Column, 
-- add a case statement to perform the requested 
-- aggregate function on the Value Column
FETCH NEXT FROM C1 INTO PIVOT_VALUE ;
WHILE ( SQLCODE >= 0 AND SQLCODE <> 100 ) DO
  SET SQL_STATEMENT = SQL_STATEMENT 
                      || PAD 
                      || AGG_FUNCTION 
                      || '(CASE WHEN ' 
                      || PIVOT_COLUMN 
                      || ' = ''' 
                      || PIVOT_VALUE 
                      || ''' THEN ' 
                      || VALUE_COLUMN 
                      || '  END) AS ' 
                      || PIVOT_VALUE ;
  SET PAD = ', ' ;
  FETCH NEXT FROM C1 INTO PIVOT_VALUE ;
END WHILE ;
CLOSE C1 ;

-- Specify the table to select from
SET SQL_STATEMENT = SQL_STATEMENT 
                    || ' from ' 
                    || FOR_TABLE ;

-- If requested, add the Group By Column
-- to the select clause
IF GROUP_COLUMN IS NOT NULL THEN
  SET SQL_STATEMENT = SQL_STATEMENT 
                      || ' group by ' 
                      || GROUP_COLUMN 
                      || ' order by ' 
                      || GROUP_COLUMN;
END IF ;

PREPARE D2 FROM SQL_STATEMENT ;
OPEN C2 ;

END #

LABEL ON ROUTINE DO_PIVOT 
( CHAR(), CHAR(), VARCHAR(), VARCHAR(), VARCHAR(), VARCHAR() )  
IS 'Perform a General Purpose Pivot';

COMMENT ON PARAMETER ROUTINE DO_PIVOT 
( CHAR(), CHAR(), VARCHAR(), VARCHAR(), VARCHAR(), VARCHAR() ) 
(FOR_SCHEMA IS 'Schema for Table' , 
FOR_TABLE IS 'For Table' , 
PIVOT_COLUMN IS 'Name of Column to be Pivoted' , 
VALUE_COLUMN IS 'Column to be Aggregated for Pivot' , 
AGG_FUNCTION IS 'Use Aggregate Function' , 
GROUP_COLUMN IS 'Group on Column' ) ;

产生错误信息:

DB21034E  The command was processed as an SQL statement because it was
not a valid Command Line Processor command.  During SQL processing it
returned:
SQL0104N  An unexpected token "FROM" was found following "    FETCH
NEXT".
Expected tokens may include:  ".".  LINE NUMBER=50.  SQLSTATE=42601

有什么建议吗?

【问题讨论】:

  • 显示调用参数。提前致谢
  • 喜欢链接页面:CALL DO_PIVOT('SQLSTAND', 'SALES','SALES_PERSON', 'SALES', DEFAULT, DEFAULT); - 另请参阅参数文档。聚合函数有效,但对于更复杂的聚合就不太舒服了。

标签: sql db2 pivot db2-luw bigsql


【解决方案1】:

对于 Db2-LUW v11.1 及更高版本,要编译 sproc,您可以进行下面列出的更改。这只是为了获得成功的编译。我没有检查功能。

  • 删除(或注释掉)PROGRAM TYPE SUB

  • 删除(或注释掉)并发访问分辨率默认值

  • 将 FETCH NEXT FROM 更改为 FETCH(在两个地方),或使用 FETCH FROM

  • 删除(或注释掉)LABEL ON ROUTINE 语句

  • 删除(或注释掉)COMMENT ON PARAMETER ROUTINE 语句

【讨论】:

  • 非常感谢 - 太好了。您能否提供详细信息如何了解第 3 点的解决方案(我自己也发现了其他点) - 只是阅读ibm.com/support/knowledgecenter/en/SSEPGG_11.1.0/…
  • 静态 SQL 中的 Db2-LUW FETCH 在功能上等同于 FETCH NEXT。 Db2 平台(LUW、iSeries、Z/OS)之间的语法差异很常见。
猜你喜欢
  • 1970-01-01
  • 2012-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
  • 2021-02-16
  • 2016-12-09
相关资源
最近更新 更多