如何让解决视图迁移时遇到的依赖问题

cqdj 2012-09-02 09:12:38
在数据迁移脚本编写的时候遇到这样一个问题,为了避免在迁移过程中人的干预,需要解决这样一个问题:迁移视图A时,需要先迁移视图A所依赖的B,视图B也可能在调用视图C,请问这个问题如何解决,用递归函数也可以,谢谢!
...全文
212 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingstarer 2012-09-08
  • 打赏
  • 举报
回复
有一个视图,可以查出对象依赖关系
hupeng213 2012-09-03
  • 打赏
  • 举报
回复
同意楼上, 把所有视图生成语句拷贝出来, 按照一定顺序执行就可以了。
哪怕不按顺序执行,有依赖关系的视图如果不存在,会创建失败的。再把失败的视图重新执行就可以了。
BenChiM888 2012-09-03
  • 打赏
  • 举报
回复
同意 1楼2楼3楼的同学
fw0124 2012-09-03
  • 打赏
  • 举报
回复
严重同意,迁移完后编译所有的view.
Kobayashi 2012-09-03
  • 打赏
  • 举报
回复
楼上说得对。。迁移的时候不要管视图的依赖。。。
kingstarer 2012-09-03
  • 打赏
  • 举报
回复
怎么找出视图依赖于哪些其它对象?

例如create view mydual select * from dual;

从哪可以找出mydual依赖于dual?

有没有相关的字典表可以查?
fw0124 2012-09-03
  • 打赏
  • 举报
回复
你的过程里面加上异常处理,捕获后继续执行下一个创建。
加上红色部分。
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;
fw0124 2012-09-03
  • 打赏
  • 举报
回复
你的过程里面加上异常处理,捕获后继续执行下一个创建。
fw0124 2012-09-03
  • 打赏
  • 举报
回复
多执行几遍,
例如A依赖B,B依赖C.
创建语句顺序A,B,C
这样第一次只有C成功;
第二次B成功,C被replace;
第三次A成功,B,C被replace。
cqdj 2012-09-03
  • 打赏
  • 举报
回复
谢谢给位,但是你们试试就知道了,如果违反顺序,好像执行不成功的。
我用的是下列语句,各位看是否正确:
---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;
jdsnhan 2012-09-02
  • 打赏
  • 举报
回复
如果对于视图,我觉得可以不用去管依赖,把所有的内容都迁移完成后,统一全编译一次就OK了。

17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧