批量修改视图的定义

来源:互联网 发布:五子棋打谱软件 编辑:程序博客网 时间:2024/05/10 18:44

       在数据库迁移的过程中,可能要更改一些user_objects的DDL,但是这些DDL存在着规律,而且量很大,再说了搞IT的都是些懒人,能批量搞定,肯定不会去一个一个修改这些objects的DDL。

     今天我就遇到了这样的问题,tsybdd的schema中有好多的视图名称都是CS_开头的,而且这些视图都是在基于同一个数据库上的另外一个用户hbjb_kf_ts的表,因此他们的DDL语句后面都是from hbjb_kf_ts.**,现在在另外一台计算机上装了一个服务器,把hbjb_kf_ts的数据全部移到新装的这一台机器上了,因此原来的视图都要通过数据链重建,这样一来,就要改很多视图的DDL,为了做这件事,我写了一个过程,来批量的完成这项工作。下面给出我的代码:

CREATE OR REPLACE PROCEDURE prc_changeViewDDL IS  TYPE type_user_views IS TABLE OF USER_views%ROWTYPE INDEX BY BINARY_INTEGER;  collect_views TYPe_user_views;  v_sql         VARCHAR2(32767);  v_tablename   VARCHAR2(2000);  v_viewname    VARCHAR2(2000);  n_dotposition NUMBER;BEGIN  SELECT * BULK COLLECT    INTO collect_views    FROM USER_views   WHERE view_name LIKE 'CS_%';  FOR view_index IN 1 .. collect_views.COUNT LOOP    v_sql         := collect_views(view_index).text; --得到脚本    v_viewname    := collect_views(view_index).view_name;    v_sql         := REPLACE(v_sql, '"', ''); --去掉双引号    n_dotposition := instr(v_sql, '.', -1, 1); --得到最后面一个点的位置    IF n_dotposition = 0 THEN      GOTO nextview; -- 表示是当前用户,不用改。    END IF;    n_dotposition := n_dotposition + 1; --加1    v_tablename   := substr(v_sql, n_dotposition); --得到远端的表名字    v_sql         := REPLACE(lower(v_sql),                             'hbjb_kf_ts.' || lower(v_tablename),                             ' ' || v_tablename || '@to_center'); --生成最新的SQL    EXECUTE IMMEDIATE ' create or replace view  ' || v_viewname ||                      '   as   ' || v_sql; --执行    << nextview >>    NULL;  END LOOP;END prc_changeViewDDL;

       如果执行时提示权限不足 ,需要显示授权:grant create any view to  tsybdd ;
原创粉丝点击