2017年计算机等级考试二级C++辅导笔记:C++与C语言的区别

2017年计算机等级考试二级C++辅导笔记:C++与C语言的区别,第1张

注明:以下及其后续内容部分摘自《Standard C++ Bible》,所有程序代码都在Visual Stdio 6.0中编译运行, *** 作系统为WinXP。本文不涉及VC6.0开发工具的使用,只讲解C++语法知识。 C++和C的共同部分就不讲解了(如 常量和变量,循环语句和循环控制,数组和指针等,这里面的一些区别会在本节和下节介绍一下),本文着重介绍C++的特点,如类、继承和多重继承、运算符重载、类模板、C++标准库、模板库、等等。 一、C++概述 (一) 发展历史 1980年,Bjarne Stroustrup博士开始着手创建一种模拟语言,能够具有面向对象的程序设计特色。在当时,面向对象编程还是一个比较新的理念,Stroustrup博士并不是从头开始设计新语言,而是在C语言的基础上进行创建。这就是C++语言。 1985年,C++开始在外面慢慢流行。经过多年的发展,C++已经有了多个版本。为次,ANSI和ISO的联合委员会于1989年着手为C++制定标准。1994年2月,该委员会出版了第一份非正式草案,1998年正式推出了C++的国际标准。 (二) C和C++ C++是C的超集,也可以说C是C++的子集,因为C先出现。按常理说,C++编译器能够编译任何C程序,但是C和C++还是有一些小差别。 例如C++增加了C不具有的关键字。这些关键字能作为函数和变量的标识符在C程序中使用,尽管C++包含了所有的C,但显然没有任何C++编译器能编译这样的C程序。 C程序员可以省略函数原型,而C++不可以,一个不带参数的C函数原型必须把void写出来。而C++可以使用空参数列表。 C++中new和delete是对内存分配的运算符,取代了C中的malloc和free。 标准C++中的字符串类取代了C标准C函数库头文件中的字符数组处理函数。 C++中用来做控制态输入输出的iostream类库替代了标准C中的stdio函数库。 C++中的try/catch/throw异常处理机制取代了标准C中的setjmp()和longjmp()函数。 二、关键字和变量 C++相对与C增加了一些关键字,如下: typename bool dynamic_cast mutable namespace static_cast using catch explicit new virtual operator false private template volatile const protected this wchar_t const_cast public throw friend true reinterpret_cast try bitor xor_e and_eq compl or_eq not_eq bitand 在C++中还增加了bool型变量和wchar_t型变量: 布尔型变量是有两种逻辑状态的变量,它包含两个值:真和假。如果在表达式中使用了布尔型变量,那么将根据变量值的真假而赋予整型值1或0。要把一个整型变量转换成布尔型变量,如果整型值为0,则其布尔型值为假;反之如果整型值为非0,则其布尔型值为真。布儿型变量在运行时通常用做标志,比如进行逻辑测试以改变程序流程。 #include iostream.h int main() { bool flagflag=trueif(flag) cout<return 0} C++中还包括wchar_t数据类型,wchar_t也是字符类型,但是是那些宽度超过8位的数据类型。许多外文字符集所含的数目超过256个,char字符类型无法完全囊括。wchar_t数据类型一般为16位。 标准C++的iostream类库中包括了可以支持宽字符的类和对象。用wout替代cout即可。 #include iostream.h int main() { wchar_t wcwc='b'wout<wc='y'wout<wc='e'wout<return 0} 说明一下:某些编译器无法编译该程序(不支持该数据类型)。 三、强制类型转换 有时候,根据表达式的需要,某个数据需要被当成另外的数据类型来处理,这时,就需要强制编译器把变量或常数由声明时的类型转换成需要的类型。为此,就要使用强制类型转换说明,格式如下: int* iptr=(int*) &table表达式的前缀(int*)就是传统C风格的强制类型转换说明(typecast),又可称为强制转换说明(cast)。强制转换说明告诉编译器把表达式转换成指定的类型。有些情况下强制转换是禁用的,例如不能把一个结构类型转换成其他任何类型。数字类型和数字类型、指针和指针之间可以相互转换。当然,数字类型和指针类型也可以相互转换,但通常认为这样做是不安全而且也是没必要的。强制类型转换可以避免编译器的警告。 long int el=123short i=(int) elfloat m=34.56int i=(int) m上面两个都是C风格的强制类型转换,C++还增加了一种转换方式,比较一下上面和下面这个书写方式的不同: long int el=123short i=int (el)float m=34.56int i=int (m) 使用强制类型转换的好处就是:禁止编译器对你故意去做的事发出警告。但是,利用强制类型转换说明使得编译器的类型检查机制失效,这不是明智的选择。通常,是不提倡进行强制类型转换的。除非不可避免,如要调用malloc()函数时要用的void型指针转换成指定类型指针。 四、标准输入输出流 在C语言中,输入输出是使用语句scanf()和printf()来实现的,而C++中是使用类来实现的。 #include iostream.h main() //C++中main()函数默认为int型,而C语言中默认为void型。 { int acout cin>>a/*输入一个数值*/ cout<return 0} cin,cout,endl对象,他们本身并不是C++语言的组成部分。虽然他们已经是ANSI标准C++中被定义,但是他们不是语言的内在组成部分。在C++中不提供内在的输入输出运算符,这与其他语言是不同的。输入和输出是通过C++类来实现的,cin和cout是这些类的实例,他们是在C++语言的外部实现。 在C++语言中,有了一种新的注释方法,就是‘//’,在该行//后的所有说明都被编译器认为是注释,这种注释不能换行。C++中仍然保留了传统C语言的注释风格/*……*/。 C++也可采用格式化输出的方法: #include iostream.h int main() { int acout cin>>acout<五、函数重载 在C++中,允许有相同的函数名,不过它们的参数类型不能完全相同,这样这些函数就可以相互区别开来。而这在C语言中是不允许的。 1.参数个数不同 #include iostream.h void a(int,int)void a(int)int main() { a(5)a(6,7)return 0} void a(int i) { cout<} void a(int i,int j) { cout<} 2.参数格式不同 #include iostream.h void a(int,int)void a(int,float)int main() { a(5,6)a(6,7.0)return 0} void a(int i,int j) { cout<} void a(int i,float j) { cout } 六、变量作用域 C++语言中,允许变量定义语句在程序中的任何地方,只要在是使用它之前就可以;而C语言中,必须要在函数开头部分。而且C++允许重复定义变量,C语言也是做不到这一点的。看下面的程序: #include iostream.h int aint main() { cin>>afor(int i=1i<=10i++) //C语言中,不允许在这里定义变量 { static int a=0//C语言中,同一函数块,不允许有同名变量 a+=icout<<::a<<<} return 0}

七、new和delete运算符 在C++语言中,仍然支持malloc()和free()来分配和释放内存,同时增加了new和delete来管理内存。 1.为固定大小的数组分配内存 #include iostream.h int main() { int *birthday=new int[3]birthday[0]=6birthday[1]=24birthday[2]=1940cout< delete [] birthday//注意这儿 return 0} 在删除数组时,delete运算符后要有一对方括号。 2.为动态数组分配内存 #include iostream.h #include stdlib.h int main() { int sizecin>>sizeint *array=new int[size]for(int i=0i array[i]=rand()for(i=0i cout<<'\n'<delete [] arrayreturn 0} 八、引用型变量 在C++中,引用是一个经常使用的概念。引用型变量是其他变量的一个别名,我们可以认为他们只是名字不相同,其他都是相同的。 1.引用是一个别名 C++中的引用是其他变量的别名。声明一个引用型变量,需要给他一个初始化值,在变量的生存周期内,该值不会改变。&运算符定义了一个引用型变量: int aint&b=a先声明一个名为a的变量,它还有一个别名b。我们可以认为是一个人,有一个真名,一个外号,以后不管是喊他a还是b,都是叫他这个人。同样,作为变量,以后对这两个标识符 *** 作都会产生相同的效果。 #include iostream.h int main() { int a=123int&b=acout<a++cout<b++cout return 0} 2.引用的初始化 和指针不同,引用变量的值不可改变。引用作为真实对象的别名,必须进行初始化,除非满足下列条件之一: (1) 引用变量被声明为外部的,它可以在任何地方初始化 (2) 引用变量作为类的成员,在构造函数里对它进行初始化 (3) 引用变量作为函数声明的形参,在函数调用时,用调用者的实参来进行初始化 3.作为函数形参的引用 引用常常被用作函数的形参。以引用代替拷贝作为形参的优点: 引用避免了传递大型数据结构带来的额外开销 引用无须象指针那样需要使用*和->等运算符 #include iostream.h void func1(s p)void func2(s&p)struct s { int nchar text[10]}int main() { static s str={123,China}func1(str)func2(str)return 0} void func1(s p) { cout<cout<} void func2(s&p) { cout<cout<} 从表面上看,这两个函数没有明显区别,不过他们所花的时间却有很大差异,func2()函数所用的时间开销会比func2()函数少很多。它们还有一个差别,如果程序递归func1(),随着递归的深入,会因为栈的耗尽而崩溃,但func2()没有这样的担忧。 4.以引用方式调用 当函数把引用作为参数传递给另一个函数时,被调用函数将直接对参数在调用者中的拷贝进行 *** 作,而不是产生一个局部的拷贝(传递变量本身是这样的)。这就称为以引用方式调用。把参数的值传递到被调用函数内部的拷贝中则称为以传值方式调用。 #include iostream.h void display(const Date&,const char*)void swapper(Date&,Date&)struct Date { int month,day,year}int main() { static Date now={2,23,90}static Date then={9,10,60}display(now,Now: )display(then,Then: )swapper(now,then)display(now,Now: )display(then,Then: )return 0} void swapper(Date&dt1,Date&dt2) { Date savesave=dt1dt1=dt2dt2=save} void display(const Date&dt,const char *s) { cout<cout<} 5.以引用作为返回值 #include iostream.h struct Date { int month,day,year}Date birthdays[]= { {12,12,60}{10,25,85}{5,20,73}}const Date&getdate(int n) { return birthdays[n-1]} int main() { int dt=1while(dt!=0) { cout cin>>dtif(dt>0 &&dt<4) { const Date&bd=getdate(dt)cout<} } return 0} 程序都很简单,就不讲解了。

这个百度上一搜一大把,都说的很详细,楼主没搜过,

数据导出:

1 将数据库TEST完全导出,用户名system 密码manager 导出到D:daochu.dmp中

exp system/manager@TEST file=d:daochu.dmp full=y

2 将数据库中system用户与sys用户的表导出

exp system/manager@TEST file=d:daochu.dmp owner=(system,sys)

3 将数据库中的表inner_notify、notify_staff_relat导出

exp aichannel/aichannel@TESTDB2 file= d:datanewsmgnt.dmp tables=(inner_notify,notify_staff_relat)

4 将数据库中的表table1中的字段filed1以"00"打头的数据导出

exp system/manager@TEST file=d:daochu.dmp tables=(table1) query=" where filed1 like '00%'"

上面是常用的导出,对于压缩,既用winzip把dmp文件可以很好的压缩。

也可以在上面命令后面 加上 compress=y 来实现。

数据的导入

1 将D:daochu.dmp 中的数据导入 TEST数据库中。

imp system/manager@TEST file=d:daochu.dmp

imp aichannel/aichannel@HUST full=y file=d:datanewsmgnt.dmp ignore=y

上面可能有点问题,因为有的表已经存在,然后它就报错,对该表就不进行导入。

在后面加上 ignore=y 就可以了。

2 将d:daochu.dmp中的表table1 导入

imp system/manager@TEST file=d:daochu.dmp tables=(table1)

基本上上面的导入导出够用了。不少情况要先是将表彻底删除,然后导入。

注意:

*** 作者要有足够的权限,权限不够它会提示。

数据库时可以连上的。可以用tnsping TEST 来获得数据库TEST能否连上。

当然,上面的方法在导出数据时可能会导出很大的包,那是因为你的用户可能在授权的时候授予了DBA的权限,所以可以采用下面方法来进行数据库备份:

数据库备份

建议系统过渡后,每周进行一次备份。或者在数据表发生重大改变前,对要改变的数据表进行备份。

执行以下步骤,进行备份。

在命令行里,敲入“cmd”,回车,进入命令行窗口。

在窗口中,输入:

exp mas/123456@mas

系统提示:输入数组提取缓冲区大小: 4096 >

可以直接回车;

系统提示:导出文件: EXPDAT.DMP>

此处输入导出文件的位置,其路径必须存在,Oracle在这里不会自动建立路径,但可以建立文件名。备份文件以dmp作为后缀。

输入内容如:e:\work\mas_db_090925v1.dmp 回车

系统提示: (1)E(完整的数据库),(2)U(用户) 或 (3)T(表): (2)U >u

此处可以输入u,也可以直接回车,因为系统此时默认的是U

系统提示:导出权限(yes/no):yes>回车

系统提示:导出表数据(yes/no):yes>回车

系统提示:压缩区(yes/no):yes>回车

系统提示:要导出的用户: (RETURN 以退出) >mas

系统提示:要导出的用户: (RETURN 以退出) >回车

此时系统会自动进行备份

本文对Oracle数据的导入导出 imp ,exp 两个命令进行了介绍, 并对其相应的参数进行了说明,然后通过一些示例进行演练,加深理解.

文章最后对运用这两个命令可能出现的问题(如权限不够,不同oracle版本)进行了探讨,并提出了相应的解决方案

本文部分内容摘录自网络,感谢网友的经验总结

一.说明

oracle 的exp/imp命令用于实现对数据库的导出/导入 *** 作

exp命令用于把数据从远程数据库服务器导出至本地,生成dmp文件

imp命令用于把本地的数据库dmp文件从本地导入到远程的Oracle数据库中。

二.语法

可以通过在命令行输入 imp help=y 获取imp的语法信息:

=============================================================================

C:\Documents and Settings\auduser>imp help=y

Import: Release 9.0.1.1.1 - Production on 星期二 5月 20 18:21:57 2008

(c) Copyright 2001 Oracle Corporation. All rights reserved.

可以通过输入 IMP 命令和您的用户名/口令

后接用户名/口令的命令:

例程: IMP SCOTT/TIGER

或者, 可以通过输入 IMP 命令和各种参数来控制“导入”

按照不同参数。要指定参数,您可以使用关键字:

格式: IMP KEYWORD=value 或 KEYWORD=(value1,value2,...,vlaueN)

例程: IMP SCOTT/TIGER IGNORE=Y TABLES=(EMP,DEPT) FULL=N

或 TABLES=(T1: P1,T1: P2),如果 T1 是分区表

USERID 必须是命令行中的第一个参数。

关键字 说明(默认)关键字 说明(默认)

--------------------------------------------------------------------------

USERID 用户名/口令 FULL 导入整个文件 (N)

BUFFER 数据缓冲区大小 FROMUSER 所有人用户名列表

FILE 输入文件 (EXPDAT.DMP)TOUSER 用户名列表

SHOW 只列出文件内容 (N) TABLES 表名列表

IGNORE 忽略创建错误 (N)RECORDLENGTH IO 记录的长度

GRANTS 导入权限 (Y) INCTYPE 增量导入类型

INDEXES 导入索引 (Y) COMMIT 提交数组插入 (N)

ROWS导入数据行 (Y)PARFILE 参数文件名

LOG 屏幕输出的日志文件 CONSTRAINTS 导入限制 (Y)

DESTROY覆盖表空间数据文件 (N)

INDEXFILE 将表/索引信息写入指定的文件

SKIP_UNUSABLE_INDEXES 跳过不可用索引的维护 (N)

FEEDBACK 每 x 行显示进度 (0)

TOID_NOVALIDATE跳过指定类型 ID 的验证

FILESIZE 每个转储文件的最大大小

STATISTICS 始终导入预计算的统计信息

RESUMABLE 遇到与空格有关的错误时挂起 (N)

RESUMABLE_NAME 用来标识可恢复语句的文本字符串

RESUMABLE_TIMEOUT RESUMABLE 的等待时间

COMPILE编译过程, 程序包和函数 (Y)

下列关键字仅用于可传输的表空间

TRANSPORT_TABLESPACE 导入可传输的表空间元数据 (N)

TABLESPACES 将要传输到数据库的表空间

DATAFILES 将要传输到数据库的数据文件

TTS_OWNERS 拥有可传输表空间集中数据的用户

==============================================

同样可以通过输入 exp help=y 获取exp的语法信息

Microsoft Windows XP [版本 5.1.2600]

(C) 版权所有 1985-2001 Microsoft Corp.

C:\Documents and Settings\auduser>exp help=y

Export: Release 9.0.1.1.1 - Production on 星期二 5月 20 18:26:34 2008

(c) Copyright 2001 Oracle Corporation. All rights reserved.

通过输入 EXP 命令和用户名/口令,您可以

后接用户名/口令的命令:

例程: EXP SCOTT/TIGER

或者,您也可以通过输入跟有各种参数的 EXP 命令来控制“导出”

按照不同参数。要指定参数,您可以使用关键字:

格式: EXP KEYWORD=value 或 KEYWORD=(value1,value2,...,valueN)

例程: EXP SCOTT/TIGER GRANTS=Y TABLES=(EMP,DEPT,MGR)

或 TABLES=(T1: P1,T1: P2),如果 T1 是分区表

USERID 必须是命令行中的第一个参数。

关键字 说明(默认)关键字 说明(默认)

--------------------------------------------------------------------------

USERID 用户名/口令 FULL 导出整个文件 (N)

BUFFER 数据缓冲区大小 OWNER 所有者用户名列表

FILE 输出文件 (EXPDAT.DMP) TABLES 表名称列表

COMPRESS 导入到一个区 (Y) RECORDLENGTH IO 记录的长度

GRANTS 导出权限 (Y) INCTYPE 增量导出类型

INDEXES导出索引 (Y) RECORD 跟踪增量导出 (Y)

DIRECT 直接路径 (N)TRIGGERS 导出触发器 (Y)

LOG屏幕输出的日志文件 STATISTICS 分析对象 (ESTIMATE)

ROWS导出数据行 (Y)PARFILE 参数文件名

CONSISTENT 交叉表一致性CONSTRAINTS 导出约束条件 (Y)

FEEDBACK 每 x 行显示进度 (0)

FILESIZE 每个转储文件的最大大小

FLASHBACK_SCN用于回调会话快照的 SCN

FLASHBACK_TIME 用来获得最接近于指定时间的 SCN 的时间

QUERY用来导出表的子集的选择子句

RESUMABLE遇到与空格有关的错误时挂起 (N)

RESUMABLE_NAME 用来标识可恢复语句的文本字符串

RESUMABLE_TIMEOUTRESUMABLE 的等待时间

TTS_FULL_CHECK 对 TTS 执行完全或部分相关性检查

TABLESPACES 要导出的表空间列表

TRANSPORT_TABLESPACE 导出可传输的表空间元数据 (N)

TEMPLATE 调用 iAS 模式导出的模板名称

三.使用示例

3.1 数据导出:

1 将数据库SampleDB完全导出,用户名system 密码manager 导出到E:\SampleDB.dmp中

exp system/manager@TestDB file=E:\sampleDB.dmp full=y

2 将数据库中system用户与sys用户的表导出

exp system/manager@TestDB file=E:\sampleDB.dmp owner=(system,sys)

3 将数据库中的表 TableA,TableB 导出

exp system/manager@TestDB file=E:\sampleDB.dmp tables=(TableA,TableB)

4 将数据库中的表tableA中的字段filed1 值为 "王五" 的数据导出

exp system/manager@TestDB file=E:\sampleDB.dmp tables=(tableA) query=' where filed1='王五'

如果想对dmp文件进行压缩,可以在上面命令后面 加上 compress=y 来实现。

3.2 数据的导入

1 将备份数据库文件中的数据导入指定的数据库SampleDB 中,如果 SampleDB 已存在该表,则不再导入

imp system/manager@TEST file=E:\sampleDB.dmp full=y ignore=y

2 将d:\daochu.dmp中的表table1 导入

imp system/manager@TEST file=E:\sampleDB.dmp tables=(table1)

3. 导入一个完整数据库

imp system/manager file=bible_db log=dible_db full=y ignore=y

4. 导入一个或一组指定用户所属的全部表、索引和其他对象

imp system/manager file=seapark log=seapark fromuser=seapark imp

system/manager file=seapark log=seapark fromuser=(seapark,amy,amyc,harold)

5. 将一个用户所属的数据导入另一个用户

imp system/manager file=tank log=tank fromuser=seapark touser=seapark_copy

imp system/manager file=tank log=tank fromuser=(seapark,amy)

touser=(seapark1, amy1)

6. 导入一个表

imp system/manager file=tank log=tank fromuser=seapark TABLES=(a,b)

7. 从多个文件导入

imp system/manager file=(paycheck_1,paycheck_2,paycheck_3,paycheck_4)

log=paycheck, filesize=1G full=y

8. 使用参数文件

imp system/manager parfile=bible_tables.par

bible_tables.par参数文件:

#Import the sample tables used for the Oracle8i Database Administrator's

Bible. fromuser=seapark touser=seapark_copy file=seapark log=seapark_import

参数文件示例见附录

9. 增量导入

imp system./manager inctype= RECTORE FULL=Y FILE=A

不少情况下要先将表彻底删除,然后导入。

四.参数说明

4.1、8i EXP常用选项

1、FULL,这个用于导出整个数据库,在ROWS=N一起使用时,可以导出整个数据库的结构。例如:

exp sys file=./db_str.dmp log=./db_str.log full=y rows=n compress=y direct=y

2、BUFFER和FEEDBACK,在导出比较多的数据时,我会考虑设置这两个参数。例如:

exp new file=yw97_2003.dmp log=yw97_2003_3.log feedback=10000 buffer=100000000 tables=WO4,OK_YT

3、FILL和LOG,这两个参数分别指定备份的DMP名称和LOG名称,包括文件名和目录,例子见上面。

需要说明的是,EXP可以直接备份到磁带中,即使用FILE=/dev/rmt0(磁带设备名),但是一般我们都不这么做,原因有二:一、这样做的速度会慢很多,二、现在一般都是使用磁带库的,不建议直接对磁带进行 *** 作。至于没有使用磁带库的朋友可以考虑和UNIX的TAR结合使用。

如果你真想使用EXP直接到磁带,你可以参考Metalink文章“EXPORTING TO TAPE ON UNIX SYSTEMS”(文档号:30428.1),该文中有详细解释。

4、COMPRESS参数将在导出的同时合并碎块,尽量把数据压缩到initial的EXTENT里,默认是N,一般建议使用。DIRECT参数将告诉EXP直接读取数据,而不像传统的EXP那样,使用SELECT来读取表中的数据,这样就减少了SQL语句处理过程。一般也建议使用。不过有些情况下DIRECT参数是无法使用的。

5、如何使用SYSDBA执行EXP/IMP?

这是一个很现实的问题,有时候我们需要使用SYSDBA来执行EXP/IMP,如进行传输表空间的EXP/IMP,以及在9i下用SYS用户来执行EXP/IMP时,都需要使用SYSDBA才可。我们可以使用下面方式连入EXP/IMP:

exp "'sys/sys as sysdba'" file=1.dmp tables=gototop.t rows=n

6、QUERY参数后面跟的是where条件,值得注意的是,整个where子句需要使用""括起来,where子句的写法和SELECT中相同,如果是UNIX平台所有"和'都需要使用\u26469屏蔽它们的特殊含义:

exp gototop/gototop file=1.dmp log=1.log tables=cyx.t query="where c1=20 and c2=gototop"

如果是windows平台,则使用下面的格式:

exp c/c@ncn file=c.dmp log=c.log tables=t query="""where id=1 and name='gototop'"""

4.2、8i IMP常用选项

1、FROMUSER和TOUSER,使用它们实现将数据从一个SCHEMA中导入到另外一个SCHEMA中。

2、IGNORE、GRANTS和INDEXES,其中IGNORE参数将忽略表的存在,继续导入,这个对于需要调整表的存储参数时很有用,我们可以先根据实际情况用合理的存储参数建好表,然后直接导入数据。而GRANTS和INDEXES则表示是否导入授权和索引,如果想使用新的存储参数重建索引,或者为了加快到入速度,我们可以考虑将INDEXES设为N,而GRANTS一般都是Y。

另外一个EXP/IMP都有的参数是PARFILE,它是用来定义EXP/IMP的参数文件,也就是说,上面的参数都可以写在一个参数文件中,但我们一般很少使用。

4.4、Oracle9i EXP功能描述

Oracle9i EXP在原有的基础上新增了部分新的参数,按功能主要分为以下几个部分:

1、OBJECT_CONSISTENT - 用于设置EXP对象为只读以保持对象的一致性。默认是N。

2、FLASHBACK_SCN和FLASHBACK_TIME - 用于支持FLASHBACK功能而新增。

3、RESUMABLE、RESUMABLE_NAME和RESUMABLE_TIMEOUT - 用于支持RESUMABLE空间分配而新增。

4、TTS_FULL_CHECK - 用于在传输表空间时使用依赖性检查。

5、TEMPLATE - 用于支持iAS。

6、TABLESPACES - 设置表空间导出模式。个人觉得对于一般用户而言,这个才是新增参数中最实用的一个,可以让用户在原来的FULL、OWNER、TABLES的基础上多了一种选择,使得EXP更加灵活。

五、不同版本的EXP/IMP问题?

一般来说,从低版本导入到高版本问题不大,麻烦的是将高版本的数据导入到低版本中,在Oracle9i之前,不同版本Oracle之间的EXP/IMP可以通过下面的方法来解决:

1、在高版本数据库上运行底版本的catexp.sql;

2、使用低版本的EXP来导出高版本的数据;

3、使用低版本的IMP将数据库导入到底版本数据库中;

4、在高版本数据库上重新运行高版本的catexp.sql脚本。

但在9i中,上面的方法并不能解决问题。如果直接使用底版本EXP/IMP会出现如下错误:

EXP-00008: ORACLE error %lu encountered

ORA-00904: invalid column name

这已经是一个公布的BUG,需要等到Oracle10.0才能解决,BUG号为2261,你可以到METALINK上去查看有关此BUG的详细信息。

BUG归BUG,我们的工作还是要做,在没有Oracle的支持之前,我们就自己解决。在Oracle9i中执行下面的SQL重建exu81rls视图即可。

CREATE OR REPLACE view exu81rls

(objown,objnam,policy,polown,polsch,polfun,stmts,chkopt,enabled,spolicy)

AS select u.name, o.name, r.pname, r.pfschma, r.ppname, r.pfname,

decode(bitand(r.stmt_type,1), 0,'', 'SELECT,')

|| decode(bitand(r.stmt_type,2), 0,'', 'INSERT,')

|| decode(bitand(r.stmt_type,4), 0,'', 'UPDATE,')

|| decode(bitand(r.stmt_type,8), 0,'', 'DELETE,'),

r.check_opt, r.enable_flag,

DECODE(BITAND(r.stmt_type, 16), 0, 0, 1)

from user$ u, obj$ o, rls$ r

where u.user# = o.owner#

and r.obj# = o.obj#

and (uid = 0 or

uid = o.owner# or

exists ( select * from session_roles where role='SELECT_CATALOG_ROLE')

)

/

grant select on sys.exu81rls to public

/

六、其他问题

本文只讨论了Oracle8i和9i中的EXP/IMP的一些情况,对于之前的版本,在8.0.X中,除了QUERY参数不能用外,其它差别不大。针对没有QUERY的情况,我们可以先在数据库中使用查询条件建立临时中间表,然后使用EXP导出这个中间表即可。至于Oracle7因为目前使用的人较少,gototop不打算在此做详细解释了,如果读者朋友有需求,你可以参考Metalink文档:“Overview of Export and Import in Oracle7”(文档号:61949.1)。关于EXP/IMP的详细参数信息你可以通过EXP/IMP HELP=Y来获得。

另外关于传输表空间的更多信息可以参考下面的Metelink文档,本文不再详述。

[NOTE:77523.1] Transportable Tablespaces -- An Example to setup and use.

[NOTE:100698.1] Perform tablespace point-in-time recovery using Transportable Tablespace.

在进行并行EXP/IMP的时候,如果IMP过程建索引的话不建议同时运行5个以上的IMP,如果你想加快速度,可以在IMP的时候不建索引,这样只要内存允许,可以多跑几个,然后是SQL脚本创建需要的索引。

注意:

*** 作者要有足够的权限,权限不够它会提示。

数据库是否可以连上, 可以用tnsping TestDB 来获得数据库 TestDB 能否连上。

附录一:

给用户增加导入数据权限的 *** 作

第一, 启动sql*puls

第二,以system/manager登陆

第三,create user 用户名 IDENTIFIED BY 密码(如果已经创建过用户,这步可以省略)

第四,GRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW ,

DROP ANY VIEW,EXP_FULL_DATABASE,IMP_FULL_DATABASE,

DBA,CONNECT,RESOURCE,CREATE SESSION TO 用户名字

第五, 运行-cmd-进入dmp文件所在的目录,

imp userid=system/manager full=y file=*.dmp

或者 imp userid=system/manager full=y file=filename.dmp

附录二:

Oracle 不允许直接改变表的拥有者, 利用Export/Import可以达到这一目的.

先建立import9.par,

然后,使用时命令如下:imp parfile=/filepath/import9.par

例 import9.par 内容如下:

FROMUSER=TGPMS

TOUSER=TGPMS2 (注:把表的拥有者由FROMUSER改为TOUSER,FROMUSER和TOUSER的用户可以不同)

ROWS=Y

INDEXES=Y

GRANTS=Y

CONSTRAINTS=Y

BUFFER=409600

file==/backup/ctgpc_20030623.dmp

log==/backup/import_20030623.log


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12077521.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-20
下一篇2023-05-20

发表评论

登录后才能评论

评论列表(0条)

    保存