1
votes

I'm having trouble refreshing an MQT inside of a stored procedure.

I'm receiving the following error when attempting to refresh the table :

ERROR [42601] [IBM][DB2/LINUXX8664] SQL0104N An unexpected token "REFRESH" was found following "ANGUAGE SQL BEGIN " . Expected tokens may include: "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" .
1

1 Answers

3
votes

You can't execute the REFRESH TABLE as a static statement in a stored procedure as it can only run as a dynamic statement.

Therefore, the proper method to do this is to use the EXECUTE IMMEDIATE statement:

CREATE OR REPLACE PROCEDURE TEST_PROC 
   LANGUAGE SQL
BEGIN
  declare vSQL varchar(1024);

  set vSQL = 'refresh table MQT_TEST';
  execute immediate vSQL;

END@