近期项目有这么个需求,需要将数据从生产环境导入到开发环境。以便有真实的数据进行项目上线前的测试。手头上的文档只列出了所需的视图,并没有直接给出标名。这样也就需要通过查询视图定义找到底层表,然后在进行数据的导入。如果人工一层层找,主要的问题有以下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
相关推荐
视图是一个或多个表中数据的逻辑表达式。表可以看作有行和列的电子数据表,表是关系数据库中一种拥有数据的结构。用CREATE TABLE语句建立表,在建立表的同时,必须定义表名,列,以及列的数据类型和大小。表名标识一...
通过MSQL通过视图访问ORACLE中的表和视图。
而实施的时候,经常只会注意要修改的对象是否修改完成,往往忽略相关对象的失效问题,所以做了一个自动重新编译的脚本程序,目的是定期(10分钟)完成一次对所有对象的检查,如果有失效对象,则对其进行重新编译。...
oracle实现带参数视图,里面有例子,很好的一个东西。
Oracle_View视图创建在oracle数据库中已建立两张表rt_issuesect和roadstate,表结构如下: 高架状态表结构rt_issuesect
ORACLE主要的系统表和系统视图.pdf
总结: 可传参视图主要是利用oracle存储过程来作为参数传递的介质,相当于定义了一个全局变量,在查询的时候设置参数,在视图中获取参数。
oracle中查询某个表在那个存储过程中用到了 例如查询t_lea_waybill在那个存储过程中用到了: select a.name 过程名称, min(a.line) 首次出现行数 from user_source a where a.TEXT like '%t_lea_waybill%' group by ...
自己总结的数据库oracle视图用法自己总结的数据库oracle视图用法
oracle DBA 常用系统表和系统视图
oracle 视图创建和操作,创建简单,复杂的视图,创建基表不存在的视图,视图增删改,查看视图的结构
东华大学oracle上机实验二答案,需要的可以参考下。
因Oracle暂不支持对视图(View)的加密,在实际工作中有时需提供给第三方只读账户,为保护知识产权,可用文中所述方法防止第三方账户查看视图(View)中的SQL代码。
17oracle的视图 PPT 17oracle的视图 PPT
oracle表字段或是视图字段添加备注方法
讲述oracle中视图的用法。视图定义、视图作用、视图语法、视图操作等等。
用C# 实现将 oracle数据库的视图从一个数据库迁移到另一个数据库。
数据字典视图一般有三套:以存表的视图为例 dba_tables[DBA所有的], all_tables[所有用户所有的], user_tables[当前用户所有的] 对于DBA所有的,只有拥有DBA权限的用户才可以查询,否则提示表或视图不存在。 系统表...
oracle基础--表、视图、过程、函数、游标、异常
dba_users 数据库用户信息 dba_segments 表段信息 dba_extents 数据区信息 dba_objects 数据库对象信息