DECLARE
v_sql VARCHAR2(32000);
createstmt VARCHAR2(500);
target VARCHAR2(50);
BEGIN
--COMPILE ALL OBJECTS
DBMS_UTILITY.COMPILE_SCHEMA(USER);
--RECREATE THE EXISTING VIEWS INCASE THE UNDERLYING TABLE SIGNATURES HAVE CHANGED
FOR CUR_REC IN (SELECT v.VIEW_NAME FROM USER_VIEWS v)
LOOP
BEGIN
target := CUR_REC.VIEW_NAME;
createstmt := 'CREATE OR REPLACE FORCE VIEW ' || target || ' AS ';
EXECUTE IMMEDIATE 'SELECT TEXT FROM USER_VIEWS WHERE VIEW_NAME = '|| '''' || target || '''' INTO v_sql;
EXECUTE IMMEDIATE createstmt || v_sql;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SUBSTR(SQLERRM,1,255));
END;
END LOOP;
--COMPILE ONLY THE INVALID OBJECTS
--SEVERAL OBJECTS COULD HAVE BECOME
--INVALID WHILE RECREATING THE VIEWS.
DBMS_UTILITY.COMPILE_SCHEMA(USER,FALSE);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SUBSTR(SQLERRM,1,255));
END
;/