【问题标题】:DB2 Can't REFRESH Materialized Query Table (MQT) in Stored ProcedureDB2 无法在存储过程中刷新具体化查询表 (MQT)
【发布时间】:2014-02-13 02:18:32
【问题描述】:

我在刷新存储过程中的 MQT 时遇到问题。

我在尝试刷新表格时收到以下错误:

错误 [42601] [IBM][DB2/LINUXX8664] SQL0104N 在“ANGUAGE SQL BEGIN”之后发现了意外的标记“REFRESH”。预期的标记可能包括:“TRUNCATE”。

/**********
* CREATE A NEW DUMMY TABLE AND INSERT DUMMY DATA
**********/
CREATE TABLE DELETE_ME (
  COLUMN_A DECIMAL(5)
  );

INSERT INTO DELETE_ME (COLUMN_A) VALUES (1);
INSERT INTO DELETE_ME (COLUMN_A) VALUES (2);
INSERT INTO DELETE_ME (COLUMN_A) VALUES (3);



/**********
* CREATE A MATERIALIZED QUERY USING THE DUMMY TABLE
**********/
CREATE TABLE MQT_TEST AS  (                     
  SELECT COLUMN_A                       
  FROM   DELETE_ME
  ) 
DATA INITIALLY DEFERRED
REFRESH DEFERRED
ENABLE QUERY OPTIMIZATION
NOT LOGGED INITIALLY;
COMMIT;


/**********
* CREATE A SIMPLE PROCEDURE TO REFRESH THE MATERIALIZED QUERY
**********/  
CREATE OR REPLACE PROCEDURE TEST_PROC LANGUAGE SQL
BEGIN
  REFRESH TABLE MQT_TEST;
END; 

--!!!! FAILS WITH THE FOLLOWING ERROR CODE:  - DB2 Database Error : 

ERROR [42601] [IBM][DB2/LINUXX8664] SQL0104N  An unexpected token "REFRESH" was found following "ANGUAGE SQL BEGIN ".  Expected tokens may include:  "TRUNCATE" .

【问题讨论】:

    标签: stored-procedures db2 refresh materialized-views


    【解决方案1】:

    您不能在存储过程中将REFRESH TABLE 作为静态语句执行,因为它只能作为动态语句运行。

    因此,正确的方法是使用EXECUTE IMMEDIATE 语句:

    CREATE OR REPLACE PROCEDURE TEST_PROC 
       LANGUAGE SQL
    BEGIN
      declare vSQL varchar(1024);
    
      set vSQL = 'refresh table MQT_TEST';
      execute immediate vSQL;
    
    END@
    

    【讨论】:

      猜你喜欢
      • 2015-01-06
      • 2011-09-16
      • 1970-01-01
      • 2014-02-15
      • 1970-01-01
      • 2014-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多