设为首页 收藏本站
查看: 666|回复: 0

[经验分享] 自动查找oracle视图的基础表(原创)

[复制链接]

尚未签到

发表于 2016-8-6 17:03:43 | 显示全部楼层 |阅读模式
  近期项目有这么个需求,需要将数据从生产环境导入到开发环境。以便有真实的数据进行项目上线前的测试。手头上的文档只列出了所需的视图,并没有直接给出标名。这样也就需要通过查询视图定义找到底层表,然后在进行数据的导入。如果人工一层层找,主要的问题有以下3个:
  1、很多视图是建立在视图之上的,这也就意味着需要人工一层层往下找,才能找到基表。
  2、需要操作的视图数量较多。
  3、刚需求日后还会有。
  基于上述三点,我写了个shell脚本来自动查询出视图的基表。基本思路是通过存储过程判断输入的对象是表还是视图,然后再通过shell的正则表达式对输出内容进行处理。用shell是由于笔者对oracle地下的文本处理不是很熟悉,如果有了解的,希望指教。
  具体脚本如下
  存储过程
  create or replace PROCEDURE view_verify(v_ob_name  in all_objects.OBJECT_NAME%type)
as
a_OB_TYPE   all_OBJECTS.OBJECT_TYPE%type;
a_OB_NAME   all_OBJECTS.object_name%type;
a_OB_OWNER  all_OBJECTS.owner%type;
a_CHAR      VARCHAR2(32767);
cursor         obj_cur is
            SELECT OBJECT_TYPE,OBJECT_NAME,OWNER
            FROM all_OBJECTS WHERE OBJECT_NAME= UPPER(v_ob_name);
begin
    open obj_cur;
    loop
        fetch obj_cur into a_OB_TYPE,a_OB_NAME,a_OB_OWNER;
        exit when obj_cur%notfound;
----------------------determine the object type----------------------
        IF a_OB_TYPE = 'VIEW' THEN
            select dbms_metadata.get_ddl(a_OB_TYPE,a_OB_NAME,a_OB_OWNER) into a_CHAR from dual;
            DBMS_OUTPUT.PUT_LINE(A_CHAR);
        elsif a_OB_TYPE = 'TABLE' THEN
            DBMS_OUTPUT.put_line('Table: ' ||a_ob_name);
        ELSE
            NULL;
        end if;
----------------------------------------------------------------
    end loop;
    close obj_cur;
end;
/
  shell 脚本
  #!/bin/bash
#######################declare variable##########################

export PATH=/u01/app/oracle/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/oracle/bin
CONTROL=1
X=1
cat /dev/null > temp_result
cat /dev/null > result
cat /dev/null > output
  #######################juge input argument#######################
if [ -f $1 ] ;then
        cat $1 > name_file
else
        echo  $1 > name_file
fi
#######################Loop######################################
while [ $CONTROL -gt 0 ]
  do
        cat /dev/null > temp_output
        for i in `cat name_file`
          do
                sqlplus -S scott/scott << EOF >> temp_output
                                        set serveroutput on;
                                        exec view_verify('$i');
EOF
          done
        sed -e '/[Ff][Rr][Oo][Mm] *$/N; s/\n/ /g' temp_output |grep -i from |grep -v Disconnected >  middle$X
        grep  "Table:" temp_output >> temp_result
        awk 'BEGIN{FS="[Ff][Rr][Oo][Mm]"}{if(NF>2) print $0}' middle$X >> exception
        sed -e 's/[Ff][Rr][Oo][Mm]/from/g' middle$X | grep -oP '(?<=from |join )\w*' |sort -u > name_file
        CONTROL=`grep -ci "from" middle$X`
        rm middle$X
        X=`expr $X + 1`
        cat temp_output >> output
  done
cat temp_result | sort -u > result
#######################remove temporary file#####################
rm temp_output
rm temp_result
#rm name_file
  执行结果
  [oracle@orcl ~]$ cat czm
ghi
dd
  [oracle@orcl ~]$ ./eee czm
[oracle@orcl ~]$ cat result
Table: DEPT
Table: EMP
  脚本我就不具体分析了,注释已经很详细了,如果有更高效的想法,希望联系我,谢谢。
  
  本文原创,转载请注明出处、作者
  如有错误,欢迎指正
邮箱:czmcj@163.com

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-253813-1-1.html 上篇帖子: 【转】详介oracle的RBO/CBO优化器 下篇帖子: Oracle中如何创建大量测试数据的两种方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表