2014-01-22 1 views
1

У меня возникли проблемы с обновлением MQT внутри хранимой процедуры.DB2 не может REFRESH Материализованная таблица запросов (MQT) в хранимой процедуре

Я получаю следующее сообщение об ошибке при попытке обновить таблицу:

ERROR [42601] [IBM] [DB2/LINUXX8664] SQL0104N Неожиданный маркер "ОБНОВИТЬ" был найден следующий «ANGUAGE SQL BEGIN ". Ожидаемые жетоны могут включать: «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

Вы не можете выполнить 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; 

[email protected] 
Смежные вопросы