我們有一些偏好使用物化視圖的環境,但常規應用程序使用常規視圖。爲了使事情更容易,我們希望我們的應用程序能夠根據配置參數以自動方式自動將所有常規視圖遷移到物化視圖。將視圖腳本轉換爲物化視圖(Oracle)
我已經寫了我認爲最需要這個腳本工作的東西,但是我在最後的碰觸中掙扎着。可能還有一些我需要解決的逃避問題。
現在,腳本創建一個名爲'magic'的視圖,然後嘗試轉換該視圖,但目前爲止它不能轉換到物化視圖階段。我不確定我做錯了什麼。任何幫助不勝感激。
我看到的錯誤如下。
Error report:
ORA-00911: invalid character
ORA-06512: at line 49
ORA-00911: invalid character
00911. 00000 - "invalid character"
*Cause: identifiers may not start with any ASCII character other than
letters and numbers. $#_ are also allowed after the first
character. Identifiers enclosed by doublequotes may contain
any character other than a doublequote. Alternative quotes
(q'#...#') cannot use spaces, tabs, or carriage returns as
delimiters. For all other contexts, consult the SQL Language
Reference Manual.
*Action:
Attempting to drop materialized view named MAGIC
No materialized view found with name MAGIC
Attempting to drop view named MAGIC
Success.
Attempting to create materialized view named MAGIC
CREATE MATERIALIZED VIEW "MYDB"."MAGIC" ("MAGIC") AS
SELECT 'MAGIC' FROM DUAL;
Failed to create materialized view, recreating original view MAGIC
ERROR: Could not recreate view named MAGIC.
SQL was:
CREATE OR REPLACE FORCE VIEW "MYDB"."MAGIC" ("MAGIC") AS
SELECT 'MAGIC' FROM DUAL;
PL/SQL代碼如下。
clear;
SET serveroutput ON size 1000000;
/**
* Converts all views in the database to materialized views.
*/
CREATE OR REPLACE VIEW "MAGIC" ("MAGIC") AS SELECT 'MAGIC' FROM DUAL;
BEGIN
FOR cur_rec IN (SELECT object_name, object_type FROM user_objects WHERE object_type='VIEW' and object_name='MAGIC')
LOOP
BEGIN
FOR cur_view IN
(SELECT TRIM(REPLACE(REPLACE(DBMS_METADATA.GET_DDL('VIEW', cur_rec.object_name), 'CREATE OR REPLACE FORCE VIEW', 'CREATE MATERIALIZED VIEW'), 'CREATE OR REPLACE VIEW', 'CREATE MATERIALIZED VIEW')) "MATERIALIZED_VIEW",
TRIM(DBMS_METADATA.GET_DDL('VIEW', cur_rec.object_name)) "VIEW"
FROM DUAL
)
LOOP
BEGIN
BEGIN
DBMS_OUTPUT.PUT_LINE('Attempting to drop materialized view named ' || cur_rec.object_name);
EXECUTE IMMEDIATE 'drop materialized view ' || cur_rec.object_name;
DBMS_OUTPUT.PUT_LINE('Success.');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('No materialized view found with name ' || cur_rec.object_name);
IF SQLCODE != -12003 THEN
RAISE;
END IF;
END;
BEGIN
DBMS_OUTPUT.PUT_LINE('Attempting to drop view named ' || cur_rec.object_name);
EXECUTE IMMEDIATE 'drop view ' || cur_rec.object_name;
DBMS_OUTPUT.PUT_LINE('Success.');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('No view found with name ' || cur_rec.object_name);
IF SQLCODE != -942 THEN
RAISE;
END IF;
END;
-- create the view as a materialized view.
BEGIN
DBMS_OUTPUT.PUT_LINE('Attempting to create materialized view named ' || cur_rec.object_name);
DBMS_OUTPUT.PUT_LINE(cur_view."MATERIALIZED_VIEW");
EXECUTE IMMEDIATE cur_view."MATERIALIZED_VIEW";
DBMS_OUTPUT.PUT_LINE('Success.');
EXCEPTION
WHEN OTHERS THEN
BEGIN
DBMS_OUTPUT.PUT_LINE('Failed to create materialized view, recreating original view ' || cur_rec.object_name);
EXECUTE IMMEDIATE cur_view."VIEW";
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERROR: Could not recreate view named ' || cur_rec.object_name || '.');
DBMS_OUTPUT.PUT_LINE('SQL was:' || cur_view."VIEW");
RAISE;
END;
END;
END;
END LOOP;
END;
END LOOP;
END;
太棒了,非常感謝! – mrswadge