代码之家  ›  专栏  ›  技术社区  ›  matz3

Db2 Pivot函数-fetch next语句

  •  1
  • matz3  · 技术社区  · 6 年前

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

    执行以下代码(请注意“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
    

    有什么建议吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   mao    6 年前

    对于Db2 LUW v11。要编译存储过程,可以进行下面列出的更改。这只是为了获得成功的编译。我还没有检查功能。

    • 删除(或注释掉)程序类型SUB

    • 删除(或注释掉)并发访问解析默认值

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

    • 删除(或注释掉)例程语句上的标签

    • 删除(或注释掉)参数例程语句上的注释