近期项目有这么个需求,需要将数据从生产环境导入到开发环境。以便有真实的数据进行项目上线前的测试。手头上的文档只列出了所需的视图,并没有直接给出标名。这样也就需要通过查询视图定义找到底层表,然后在进行数据的导入。如果人工一层层找,主要的问题有以下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
相关推荐
在日常管理维护Oracle数据库服务器的过程中,我们经常会遇到需要修改视图(View)、表(Table)结构的情况。由于Oracle中的视图、函数(Function)、存储过程(Procedure)等对象之间存在着复杂的依赖关系,因此当...
本篇主要介绍如何通过MySQL数据库创建视图来访问Oracle数据库中的表,实现数据的互联互通。 首先,我们要理解MySQL和Oracle之间的数据集成。由于它们是两个不同的数据库系统,直接的SQL查询并不能实现跨库操作。...
Oracle数据库是世界上最流行的数据库管理系统之一,它提供了丰富的数据存储和管理功能。在Oracle中,表和视图是最基本的数据...在学习Oracle的过程中,深入理解表和视图的概念及其操作,是成为专业数据库管理员的基础。
本实验涵盖了 Oracle 中的视图概念、创建视图、显示视图的内容、从数据字典视图中选择视图的名字和文本、使用视图查询数据、创建带有条件的视图、显示视图的结构和内容、更新视图、创建复杂视图等内容,为读者提供了...
### 常用的Oracle表和视图知识点详解 #### 一、查询某个表在哪些存储过程中被使用 为了高效地了解某个特定表在哪些存储过程中被引用,可以通过以下SQL查询来实现: ```sql SELECT A.NAME AS 过程名称, MIN(A.LINE...
### Oracle 实现带参数视图 #### 背景与概念 在数据库设计与管理过程中,视图(View)作为一种虚拟表,对于简化查询、增强数据安全性和提供数据抽象具有重要作用。然而,标准的视图定义是静态的,无法根据不同的...
Oracle的视图是数据库管理系统中的一个重要概念,它允许用户从一个或多个表中创建虚拟表,这些虚拟表并不存储实际数据,而是根据查询时的定义动态生成结果集。视图在数据库设计中扮演着多种角色,包括数据抽象、权限...
在Oracle数据库管理中,系统视图是获取数据库信息的关键途径,它们提供了丰富的元数据,用于监控、优化和理解数据库的内部工作。这篇博客主要聚焦于Oracle的常用系统视图以及数据导入导出的相关操作,这对于数据库...
### Oracle主要的系统表和系统视图 Oracle数据库作为一款广泛使用的数据库管理系统,在其内部维护了大量的系统表和系统视图来记录与管理数据库的各种状态信息。对于DBA(数据库管理员)来说,熟悉并掌握这些系统表...
Oracle 视图(View)是一种逻辑表,基于一个或多个实际表,它不占用物理空间,只存在逻辑定义。每次使用视图时,都是重新执行 SQL 语句。视图可以从一个或多个实际表中获得,这些表的数据存放在数据库中。那些用于...
Oracle数据库中的视图是SQL语言的一个重要特性,它允许用户创建虚拟表,这些虚拟表基于一个或多个实际的表或视图。视图提供了一种数据抽象的方式,简化了复杂查询,同时也保护了基础表的数据,因为它们可以被限制在...
Oracle数据库的视图是预编译的SQL查询,它不包含数据,而是提供了一个虚拟表,用于简化复杂的查询逻辑。 在C#中,迁移Oracle视图的步骤主要包括以下几个方面: 1. **建立数据库连接**:使用OracleConnection类创建...
为了更好地管理和查询这两张表的数据,本教程将详细介绍如何利用Oracle的视图功能来创建一个名为 `newview` 的视图,并对数据进行必要的转换和格式化。 #### 二、表结构概述 **1. 高架状态表结构 rt_issuesect** ...
Oracle 视图是基于一张表或多张表或另外一个视图的逻辑表,视图不同于表,视图本身不包含任何数据。表是实际独立存在的实体,是用于存储数据的基本结构。而视图只是一种定义,对应一个查询语句。视图的数据都来自于...
Oracle 表与视图的基本操作 Oracle 表与视图的基本操作是数据库管理系统中的一种基本操作,包括创建、修改、使用和...本实验为我们提供了 Oracle 表与视图的基本操作的实践经验,为我们提供了数据库管理的基础知识。
Oracle 视图详解是指在 Oracle 数据库中创建的虚拟表,以便用户可以更方便地访问和操作数据库中的数据。视图的定义是一个基于查询的结果集,可以来自一个或多个实际表或视图,或者甚至来自其他数据源。Oracle 视图的...
Oracle 表字段或是视图字段添加备注方法 Oracle 是一个强大的关系数据库管理系统,提供了多种方式来添加备注信息到表字段或视图字段中。在本节中,我们将详细介绍如何使用 Oracle 的 Comment 机制来添加备注信息到...
Oracle 带参数视图实践 Oracle 数据库中的视图通常是不带参数的,但...本文介绍了两种实现 Oracle 带参数视图的方法:利用全局变量和利用临时表。这些方法可以帮助我们方便地查询数据,并且提高了报表的生成速度。
Oracle 物化视图是数据库对象,存储远程表的数据副本,也可以称为快照。物化视图可以查询表、视图和其他物化视图。通常情况下,物化视图被称为主表(在复制期间)或明细表(在数据仓库中)。 创建物化视图的目的: ...