우리는 구체화 된보기의 사용을 선호하지만 일반 응용 프로그램은 일반보기를 사용합니다. 작업을 더 쉽게하기 위해 응용 프로그램이 구성 매개 변수를 기반으로 모든 일반보기를 자동으로 구체화 된보기로 자동으로 마이그레이션하도록합니다.뷰의 구체화 된 뷰 (Materialized Views) 로의 스크립트 변환 (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