在数据迁移脚本编写的时候遇到这样一个问题,为了避免在迁移过程中人的干预,需要解决这样一个问题:迁移视图A时,需要先迁移视图A所依赖的B,视图B也可能在调用视图C,请问这个问题如何解决,用递归函数也可以,谢谢!

解决方案 »

  1.   

     严重同意,迁移完后编译所有的view.
      

  2.   

    谢谢给位,但是你们试试就知道了,如果违反顺序,好像执行不成功的。
    我用的是下列语句,各位看是否正确:
    ---7.个性化视图处理
      cmdstr := 'select v.VIEW_NAME  from all_views  v
                 where  v.OWNER=upper(:1) and v.VIEW_NAME like ''VW_FB_%''
                 AND NOT EXISTS (SELECT 1 FROM user_views u where u.VIEW_NAME=v.VIEW_NAME)';
      open Reg_cur for cmdstr
        using pUser;
      loop
        fetch Reg_cur
          into vartab;
        exit when Reg_cur% notfound;
        select v.text
          into varSql
          from all_views v
         where v.OWNER = upper(pUser)
           and v.VIEW_NAME = upper(vartab);
           varSql:=upper(varSql);
        if len(trim(varSql)) <> 0 then
          cmdstr   := 'create or replace force view ' || vartab || '  as ' ||
                      trim(replace(varSql,'PROJECT_','PRJ_'));
          execute immediate cmdstr;
        end if;
      end loop;
      close Reg_cur;
      

  3.   

    多执行几遍,
    例如A依赖B,B依赖C.
    创建语句顺序A,B,C
    这样第一次只有C成功;
    第二次B成功,C被replace;
    第三次A成功,B,C被replace。
      

  4.   

    你的过程里面加上异常处理,捕获后继续执行下一个创建。
    加上红色部分。
    cmdstr := 'select v.VIEW_NAME from all_views v
      where v.OWNER=upper(:1) and v.VIEW_NAME like ''VW_FB_%''
      AND NOT EXISTS (SELECT 1 FROM user_views u where u.VIEW_NAME=v.VIEW_NAME)';
      open Reg_cur for cmdstr
      using pUser;
      loop
      fetch Reg_cur
      into vartab;
      exit when Reg_cur% notfound;
      select v.text
      into varSql
      from all_views v
      where v.OWNER = upper(pUser)
      and v.VIEW_NAME = upper(vartab);
      varSql:=upper(varSql);
      if len(trim(varSql)) <> 0 then
      cmdstr := 'create or replace force view ' || vartab || ' as ' ||
      trim(replace(varSql,'PROJECT_','PRJ_'));
      begin    execute immediate cmdstr;
      exception  
        when others then null;  
      end;

      end if;
      end loop;
      close Reg_cur;
      

  5.   

    怎么找出视图依赖于哪些其它对象?例如create view mydual select * from dual;从哪可以找出mydual依赖于dual?有没有相关的字典表可以查?