Oracle 与SQL SERVER概念
-----------------------------------------------------
·Oracle的服务和数据库 相当于 MS SQL的数据库服务;
·Oracle的服务= 后台进程+相关内存
·数据库= 数据文件的集合
Oracle的服务完全可以与数据库文件脱离开来;Oracle中的Schema与MS SQL中的数据库。
Schema“方案”是一个用户所拥有所有对象的集合。
“对象”包括表、视图、实例化视图、序列、过程、函数、程序包、同义词。

Oracle类似于MSSQL的数据库大致过程如下:
·建立数据库表空间(相当于MSSQL的数据库的数据文件)
·建立临时表空间(相单于MSSQL的数据库的事务日志文件)
·建立用户,它的缺省空间和临时表空间是刚建立的两个表空间
·给用户授权,最起码得角色权限是Connect的角色
·以该用户登陆,创建自己的表、视图、实例化视图、序列、过程、函数、程序包、同义词等。


关于Oracle Manager Server与MS SQL的Enterprise manager
-----------------------------------------------------
DBA Studio工具提供了与MS SQL的Enterprise manager同样的功用,但应该说两者有很大的区别。
对于一般是用来说,DBA Studio工具已经足够了。但这里有必要对Oracle Manager Server解释一下:

〉它是Oracle管理分布式数据库的服务,注意她是服务。
〉它缺省并不安装
〉它需要有自己管理所需要的资料库。在某个数据库中需要建立相应的用户
〉它的登陆需要身份验证,注意这里的身份验证,与管理所需要的资料库的用户不是一个概念,也不是数据库中的SYS,system;
它的默认用户是oem_temp sysman
> 使用她,在管理端要启动Manager Server服务和智能代理服务(OracleAgent),被管理的数据库服务器要启动智能代理服务(oracleagent).


关于Oracle的SYS,system的用户与MSSQL的Master比较
------------------------------------------------
MSSQL的Master数据库储存了当前数据库服务的一些配置信息,如数据库设备、字符集、数据文件、登陆帐号、拥有的数据库、整个服务参数配置等信息。
Oracle的sys存储了Oracle服务或者实例的信息及所有用户的数据字典信息。
Oracle的system用户拥有数据字典是视图信息,有了这些视图,我们查询数据库的信息就特别方便。缺省情况下,system用户拥有DBA系统角色权限,
而sys不仅拥有DBA的权限还拥有sysdba的权限。

DBA\SYSDBA系统角色的区别:
首先说明一下oracle服务的创建过程:创建实例、启动实例、创建数据库(SYSTEM表空间是必需的)
其次启动过程:实例启动、装载数据库、打开数据库



Oracle中新的数据库对象:实例化视图、快照、序列、程序包、同义词、抽象的数据类型
--------------------------------------------------------------------------------
·实例化视图又称显形图:实例化说明它有自己的存储空间;视图:说明它的数据源于其他表数据。
·实例化视图中的数据,设置为隔一段时间更新数据,更新的模式可以定义为完全更新和增量更新。
·快照基本上同实例化视图,只不过数据来源不同,快照数据来源于远程数据库,而实例化视图来源于本地数据表
·序列,相当于MSSQL中的identify列,它是一个数字顺序列表
·程序包:它是过程、函数、全局变量的集合;它封装了私有变量、私有过程和私有函数。如:DBMS_OUT包
·同义词:是对数据库中的对象的别名,同义词可以是全局的也可以是私有的(属于某个用户的)如:tab,col等
·抽象的数据类型:类似于C中的结构体或Pascal记录类型。

Oracle数据库连接和 Mssql远程连接
---------------------------------------------
两者都是为了实现分布式数据库的操作,两者都能实现分布式事务

Oracle回滚断和MSSQL的数据库事物日志文件
-----------------------------------------------
回滚段提供了事务回滚需要使用的数据变化以前的映象,这些映象是按条目储存的,如果这些条目过少,一个事务等待另一个事务的几率
增大,就会影响数据库的性能。缺省安装时,提供一个系统回滚段它在system表空间。
为了提高性能,system表空间不应储存有任何数据字典信息以外的信息。
MSSQL数据库事务日志文件功能类同于回滚段,只不过它是同特定的数据库密切相关的。

关于数据表的管理
-----------------

超大型数据表的管理:
oracle和MsSQL都提供了一种“把数据文件及其索引存放在一个特定的数据文件或表空间里”方法
Oracle将表及索引分区储存,即按字段值的范围进行分区存储。
·Oracle索引组织表和Sqlserver簇索引表 :两者的数据存放顺序都是按照索引值的顺序存放的
·无事务回滚概念的表,对这种表的操作不存在事务的概念;ORacle提供了建表参数nologging,使对该表的操作不参与事务的回滚。
·索引:oracle提供了多种MSSQL没有的索引类型,如:位图索引等

外连接
=------------------------------------

·MSSQL支持两种形式表之间连接
(1)从SYSBASE继承来的形式:
1)字段1*=字段2(左连接)
2)字段1=*字段2(右连接)
3)没有这种形式的全外连接语法
(2)标准的外连接语法:
1)left[outer] join on 逻辑表达式
2)right[outer] join on 逻辑表达式
3)full[outer] jion (全外连接) on 逻辑表达式
·Oracle不支持标准的外连接语法,也没有全外连接(这是他的缺陷)。
1)字段1=字段2(+)(左连接)
2)字段1(+)=字段2(右连接)
·使用外连接语句的用处
(1)不想因为表连接而使主表数据行丢失
(2)查找某条记录在表A存在,而在B表不存在,按常规做法用not in(select...查询语句)语法。
使用not in 最大的缺点就是速度慢,原因是每行都去做select查询语句;而使用如下语句则会更好:
select tu_company.* from TU_company left
join TU_Comp_agent on
TU_company.id=tu_comp_agent.compCode where TU_comp_agent.id is null;


触发器
=====================
·MSSQL仅有表的触发器,而且触发时机不够丰富,如插入触发器不区分单条插入还是多条插入;也不区分插入前触发还是插入后触发。碰到
多条数据的插入,需要使用游标处理每条插入的数据。

·Oracle提供的触发器不仅有基于表的触发器,而且还有其它类型的,例如数据库计的触发器:数据库的启动、数据库关闭。对于表级的触发器
区分单条插入还是多条插入,也区分插入前触发还是插入后触发


表数据复制
-------------
·库内数据复制
·MSSQL
Insert into 复制表名称 select 语句(复制表已经存在)
select 字段列表 into 复制表名 from 表(复制表不存在)
·Oracle
Insert into 复制表名称 select 语句(复制表已经存在)
create table 复制表名称 as select 语句(复制表不存在)
·文本文件转入,转出的批量处理
·MSSQL
BCP命令行程序
·Oracle
SQLLDR命令行程序


多表更新、删除
-------------------
一条更新语句是不能更新多张表的,除非使用触发器隐含更新,这里的意思是说:根据其他表数据更新你要更新的表。
·MSSQL
update a set 字段1=B表子段表达式,字段2=B表子段表达式,。。。。from B where 逻辑表达式

·ORACLE
update a set 字段1=(Select子段表达式 from B where ...),字段2=(Select子段表达式 from B where ...),...from B where 逻辑表达式
就以上问题来看假如A需要多个子段更新,MSSQL更简练!



关于存储过程或函数中使用的临时表
---------------------------------
两者都有这个功能。临时表最主要的好处是,操作不留任何痕迹、不产生日志,所以速度快。
·MSSQL
Create table #表名(...),或者select 字段表达式列表 INTo #表名称 FRom 表名称前加#,这些临时表都是旨在一个数据库连接会话期间有效。

·ORACLE
create [global] temporary table,加上[global]就是全局的临时表(所有数据库连接会话都是可见的),否则为私有(在一个数据库连接会话期间有效)。


动态执行SQL语句
------------------
·在存储过程中的参数中传递一个表名或者在过程体力动态生成一个SQL语句。

MSSQL: 
declare @count int 
declare @Sql nvarchar(200) 
set @sql=N'select count(*) from sysobjects' 
exec sp_executesql @sql,N'@i int output',@count output


ORACLE:
(1)程序包DBMS_SQL,执行一个语句的过程:
打开游标(OPen_cursor,对于非查询语句,无此过程)
分析语句(parse)
绑定变量(bind_variable)
执行语句(execute)
关闭游标(close_cursor,对于排序查询语句,无此过程)
(2)Execute immediate ls_SQL


数据库备份和恢复
-----------------------------------------------
MSSQL:
(1)数据库导入导出DTS工具,如果数据源和目的都是MSSQL则可以完全复制数据库的结构(表、视图、索引、触发器、规则、默认、存储过程、自定义函数、表数据等)
(2)数据库备份和还原命令:
BackUp database
Restore database
导出的数据文件还可以压缩,数据库备份和还原方式可以是增量和完全的。
(3)数据库的附加attach
只要数据库的原始数据和日志文件没有破坏,就可以使用命令:SP_ADDACH_DB.这种情况有时候回出现问题:比方说你见了登陆帐号,
不是使用缺省的登陆帐号SA,由于登陆帐号的信息存放在master数据库中,所以使用原来建立的账号就等不上,需要以下后部工作。
ORACLE:
(1)导入导出工具:Exp工具、Imp工具
导入导出的参数很多
(2)冷备份或者脱机备份,备份的时候数据库是停止的
备份所有的数据文件、日志文件、控制文件
(3)热备份或者联机备份
数据库处在archivelog模式,注意缺省情况下都是archivelog恢复时可以选择完全恢复、时间点恢复、SCN点恢复、用户自由干预的
CANCEL恢复可以说是它的热备份功能是非常强大。
(3)RMAN恢复管理期

作者: 陆岛工作室