企业版,标准版,标准版1,简化版。
Oracle 11g 的g代表网格计算
服务器功能:
1 在多用户网络环境中管理大量数据,保证许多用户同时访问相同的数据。
2 防止没有授权的访问。
3 提供有效的故障恢复解决方案。
4 Oracle的逻辑结构和数据结构是分离的,对物理结构的管理可以不影响对逻辑结构的访问。
Oracle 数据库是第一个为企业网格计算而设计的数据库系统。网格计算是一种新的IT结构,方便开发企业信息系统,已网格形式设计和实现的系统可以提供更高质量的服务,更低的成本,更大的灵活性。
网格计算和其他计算方式的区别:
2 提供:用户通过虚拟层申请资源。
网格计算模型将IT资源集合看做一个池,在集中资源管理和资源控制之间实现最佳平衡。
网格资源管理包括:
Oracle数据库的逻辑结构可分为:1.表空间 2.方案。(方案和表空间都可以包含表,索引,视图等逻辑对象)
物理结构:表空间由数据文件组成。
逻辑结构:表空间由段组成,段由区组成,区则由数据块组成。
示例表空间(Example Tablespace) | 储存实例数据表,建库时若创建实例方案,则会创建示例表空间 |
大文件表空间(bigfile tablespace) | 只能包含大文件,文件大小可达4G个数据块 |
系统表空间(SYSTEM Tablesspace) | Oracledb必须有的部分,创库时自动创建,DB打开时即在线,存放数据字典表,表空间名称,表空间的数据文件等,另外存放PL/SQL中的部分程序单元(存储过程,自定义函数,包和触发器等) |
辅助表空间 (SYSAUX Tablespace) | SYSTEM Tablespace的辅助表空间,一般为存储数据的默认位置,创建或升级数据库时,SYSAUX Tablespace 表空间自动创建,使用可减少默认创建表空间的数量,一般不允许删除更名。 |
还原表空间(Undo Tablespace) | 可包含多个,每个实例都指定一个(且只有一个)Undo Tablespace,撤销的数据在UNdo表空间使用UNDo区间(由Oracle自动创建维护)管理,即事务中对数据库的改变保存在UNDOTablespace中,回滚可恢复。 |
临时表空间(Tempporary Tablespase) | 用于存储临时表,若系统表空间是本地的,则create database 时必须要创建一个默认临时表,若删除所有临时表,则SYSTEM表空间被当做临时表空间 |
用户表空间(User Tablespace) | 存储用户的私有数据 |
本地管理表空间(Locally Managend Tablespace) | 使用本地位图来管理的表空间,所有表空间都可以实现本地管理 |
3.在创建表空间时,系统默认创建小文件表空间(Smallfile Tablespace),SYSTEM和SYSAUX表空间只能是小文件表空间,可能同时包含Bigfile和Smallfile 表空间。
4.在线(Online)和离线(Offline)表空间:无论数据库是否打开,都可以设置离线/在线状态,在数据库打开后,SYSTEW一直在线(数据字典)。发生特定错误时,Oracle可以自动的将表空间切换到离线状态。
5.表空间一般在线,在备份,恢复和维护数据数据表时,DBA可以设置为表空间离线(离线状态,不允许任何SQL语句访问表空间数据)
6.表空间和方案的关系:
a.同一方案中的对象可以存储在不同的表空间中。(方案对象的意思)点击打开链接
b.表空间可以存储不同方案的对象。
7.数据库,表空间和数据文件的关系:
a.每个表空间由数据文件(在物理上存储表空间中所有逻辑结构的数据)组成。
b.表空间的存储容量=表空间中数据文件的大小之和。
c.数据库的存储容量=数据库中表空间的存储容量之和。
8.临时表空间组(允许user使用多个表空间中的临时空间):
a.临时表空间组至少包含一个表空间。
b.共享临时表空间命名空间,所以不能与表空间同名。
c.删除表空间组所有成员,该组自动解散。
临时表空间的好处:可以在并行操作中有效利用多个临时表空间。
段:由一段区间组成,自动分配。
Oracle 11g 数据段类型:
数据段 | 不在簇中的表都有一个数据段,每个簇都有一个数据段(簇中每个表的数据都存储在簇的数据段中)。 |
索引段 | 每个索引都有一个索引段,存储所有的索引数据 |
临时段 | 执行SQL语句时,Oracle创建临时段 |
回滚段 | 在手动重做管理模式中,DBA需要创建回滚段 |
1.是数据库存储空间中分配的一个逻辑单元,由一组相邻的数据块组成,是Oracle分配磁盘空间的最小单位。
1.是Oracle管理数据库存储系统的最小数据存储单位。标准的数据块大小由初始参数DB_BLOCK_SIZE指定。
2.即是逻辑单位也是物理单位。
数据块格式:
公共的变头长:数据块的通用信息(块地址,段类型) |
表目录:有行数据的表的信息 |
行目录:实际行数据的信息(行数据片的地址) |
空闲空间:插入新行是需要的存储空间 |
行数据:表或索引数据(可以跨越数据块) |
物理结构由构成数据库的操作系统文件(提供物理存储)所决定,Oracle由三种文件组成,数据文件,日志文件,和控制文件
(一)控制文件(.CPL)
Oracle 数据库有一个控制文件,记录数据库的物理结构。包含数据库名,数据库数据文件和日志文件的名字,位置和数据库建立日期等信息(记录各种名字,物理结构)。用于标识数据库和日志文件,DB操作时必须打开,自动更改,Oracle DB服务器必须可写控制文件,没有控制文件,DB将无法装载,恢复也很困难。
(二)数据文件(.DBF)
(1).Oracle DB的数据文件包含全部数据库文件。逻辑数据物理的存储在数据文件中,特征:
(2).数据库操作系统从数据文件中读取数据,存储在Oracle的内存缓存区。(新建或更新数据由数据库写入进程(DBWn)决定在适当的时间一次性写入到数据库文件中,(降低磁盘访问))。
(三)日志文件(.LOG)
(1)数据库有两个或多个日志文件组(收集数据库日志)日志的主要功能:记录对数据所做的全部修改。可以利用日志文件得到修改记录 。
(2)日志文件主要是防止故障,Oracle可以镜像日志,在不同磁盘上维护两个或多个日志副本。
用于和操作系统进行联系的标识,也就是说数据库和操作系统之间的交互使用的是数据库实例。Oracle实例=SGA(分配的内存区域,叫系统全局区)+Oracle进程(程序运行的集合,动态的)
(二)每个运行的OracleDB 都对应一个实例(例程),每个Oracle_Instance 都有一个STSTEM标识符SID,通常SID与DB名相同。服务器进程的命名也与SID相匹配。
(三)Oracle实时应用集群(RAC)是一个多实例系统。
(四)Oracle数据库实例支持四种状态:打开(OPEN),关闭(CLOSE),已装载(MOUNT),和已启动(NOMOUNT)。
系统全局区(SYSTEM Global Area,SGA)+程序全局区(Program Global Area ,PGA)
1.SGA(系统全局区)(共享全局区(Shared Global Area)):一组共享内存结构,包含一个Oracle数据库例程及控制信息。
2.SGA包含数据结构:
3.PGA(程序全局区=堆栈区+数据区):包含Oracle进程数据和控制信息的内存区域,PGA为Oracle进程的私有内存区域,不能共享。
1.进程(作业或任务):操作系统的一种机制,它可以执行一系列在操作结构,(有自己专用存储区)
2.user访问Oracle数据库例程的两个模块代码:
3.Oracle是多进程系统,系统中的进程可分为两大类:
4.服务器进程(处理连接到数据库例程的用户进程的请求)工作:
1.分析运行应用程序中的SQL语句。
2.若需要的数据不在SGA中,则把它从数据文件中读取到SGA的共享数据库缓存区中。
3.返回应用程序需要的结果。
5. 后台进程
Oracle后台进程的名字及说明
DBWn | 数据库写入进程,把缓存区中在内容写入到数据文件中 |
LGWR | 日志写入教程,把重做日志缓存区中的内容写入重做日志文件中 |
GKPT | 检查点进程。太多啦,就先不打了!! |
SMON | 系统监控进程 |
PMON | 进程监控进程 |
ARCn | 归档进程 |
RECO | 恢复进程 |
Jnnn | 作业队列进程 |
Dnnn | 调读进程 |
LMS | 锁管理服务器进程 |
QMNn | 队列监控进程 |
Snnn | 共享服务器进程 |
八.应用程序结构
1.客户/服务器结构
数据库应用程序和数据库被分为两个部分:
一般情况客户端与服务器位于不同的计算机,Oracle数据库系统的服务器和客户端通过Oracle Net Services 进行通信。
2.多层结构
客户端————应用程序服务器(为客户端提供数据,类似于接口)————数据库服务器。
客户端提出一个请求,在数据库服务器上执行相应在操作。客户端可以是Web浏览器,也可以是用户进程。多层结构中,客户端通过一个或多个应用程序服务器与数据库服务器相连。
3.Oracle Net Services
Oracle Net Services 提供了企业级分布式连接方案,可以实现从客户端应用程序到Oracle数据库的网络会话。使用各种网络广泛的通信协议或者 应用程序接口(APi),为Oracle数据库提供分布式数据库和分布式进程管理。
分布式数据库:是指利用高速计算机网络将物理上分散的多个数据存储单元连接起来组成一个逻辑上统一的数据库。分布式数据库的基本思想是将原来集中式数据库中的数据分散存储到多个通过网络连接的数据存储节点上,以获取更大的存储容量和更高的并发访问量。近年来,随着数据量的高速增长,分布式数据库技术也得到了快速的发展,传统的关系型数据库开始从集中式模型向分布式架构发展,基于关系型的分布式数据库在保留了传统数据库的数据模型和基本特征下,从集中式存储走向分布式存储,从集中式计算走向分布式计算。
九。Oracle数据库用户概述:
1.Oracle数据库哟用户类型:
数据库管理员 | 安装升级,分配存储系统,创建DB存储结构,创建DB对象,修改DB结构,管理用户,安全,控制,监视,优化,备份,恢复,维护,联系。 |
安全官员 | 管理用户,控制,监视用户对数据库的访问,维护安全 |
网络管理员 | 管理网络产品 如 Oracle Net Sevyices |
应用程序开发员 | 设计开发应用程序,估算数据库存储空间,提供数据管理员,调整,安全性检测。 |
应用程序管理员 | 对指定的应用程序进行管理 |
数据库用户 | 在权限范围内添加,修改和删除数据,生成统计报表 |
2.默认数据库管理员user
(一).数据库管理员的操作系统账户:数据库管理员必须能够执行操作系统命令。
(二).数据库管理员的用户名:在创建数据库时,有如下两个用户被自动创建
SYS:默认密码为(change_on_install)创建一个Oracle数据库时,默认创建SYs用户并授予DBA,数据字典中的基本表和视图都存放在SYS方案中。不被修改。
SYSTEM:默认密码(manager),与SYS一样,用于创建显示管理信息的表或视图。
(三)数据库管理员的权限:(SYSDBA+SYSOPER)系统权限。
SYSDBA权限;
SYSOPER权限可以执行的操作:
第二章,安装和卸载Oracle数据库
Oracle ORCL VSS Writer Service |
Oracle 卷映射拷贝写入服务,VSS能够让储存基础设备(如磁盘,阵列等)在多卷或单卷创建映射副本, |
OracleDBConsoleorcl |
Oracle数据库控制服务台,orcl是数据库服务器标识,在运行OEM时需要启动 |
OracleJobSchedulerORCl | Oracle作业调度服务,Orcl是Oracle实例标识,默认设置为禁用 |
OracleOraDb11g_home1TNSListener | 监听器服务,服务只有在数据库需要远程访问时才需要,服务默认设置为自动启动 |
OracleServiceORCL | 数据库服务,这个服务会自动地启动和停止数据库。Orcl是实例标识,默认自动启动 |
环境变量名 | 说明 |
NLS_LANG | 使用的语言。SIMPLIFIED CHINESE简体中文,CHINA中文日期格式,ZHS16GBK表示编码 |
ORACLE_MASE | 安装Oracle服务器的顶层目录(默认C:\app\administrator) |
ORACLE_BUNDLE_NAME | Oracle 11g的版本(默认:Enterprise) |
ORACLE_HOME | 安装Oracle11g软件的目录(默认:C:\app\adminisstrator\product\11.2.0\dbhome_1) |
PATH | Oracle可执行文件的目录(默认:C:\app\administrator\product\11.2.0\db_1\bin) |
一,Oracle Enterprise Manager
Oracle Enterprise Manager简称OEM,是Oracle的web的管理工具,可以通过Web浏览器连接到Oracle数据库服务器,对Oracle数据库进行查看,维护和管理。
启动Enterprise Manager II时,要检查Oracle数据库控制台服务OracleDBCConsoleorcl是否启动,orcl代表Oracle实例名,如果默认的Oracle实例不是Orcl,服务器会发生相应变化。
启动服务后,可以在Web浏览器中按下面的格式访问Enterprise Manager 11g:https://
在进入OEM中,选择身份可以选择Normal,SYSOPER,SYSDBA。
在OEM中可以通过7个页面对Oracle数据库进行监测和管理,分别是:主目录,性能,可用性,服务性器,方案,数据移动,以及软件和支持。
二,SQL Plus
打开方式:可以从程序打开,也可以在命令行窗口执行sqlplus;用户名 AS 连接身份;
1,SQL Plus 是用户和服务器之间的一种接口,用户可以通用他使用SQL语句交互式地访问数据库,功能:
2,查看所有Oracle数据库的名称和创建日期:SELECT NAME,CREATED FROM V$DATABASE(Oracle系统视图,用于显示数据库的基本信息);
3,SQL Plus窗口是一个行编辑器,需要输入命令指定SQL Plus进行相应操作
命 令 | 描 述 |
@@ | 运行脚本。此命令与@命令相似,但是他可以在调用脚本相同的目录下查找指定的脚本 |
/ | 执行SQL命令或PL/SQL块 |
ACCEPT(接受) | 读取输入的一行,并把它存储在指定的用户变量里 |
APPEND(附加,贴上) | 向缓存区中的当前行尾部添加指定的文本 |
ARCHIVELOG(归档模式) | 启动或停止对在线重做日志文件的自动归档,对指定重做日志文件进行手动归档,显示重做日志文件的信息 |
ATTRIBUTE(标志) | 指定不同类型的列属性的特征,列出单个属性或所有属性的当前显示特征 |
BREAK(突破,打破) | 指定在报告中的什么位置发生变化,以及发生变化的形式,也可以显示当前的BREAK定义 |
BTITLE(尾标题) | 在每个报告页在底部设置一个标题,并对指定标题设置格式,也可以用来显示当前的BTITLE定义 |
CHANGE() | 在缓存区的的当前列中进行文本替换 |
CLEAR() | 删除或重置当前句子,或者设置特殊的选项,例如BREAK 或COLUMN |
COLUMN() | 设置指定列的显示特征,也可以列出单个列或所有列的当前显示。 |
COMPUTE() | 计算或显示汇中行 |
CONNECT() | 使用指定用户连接到数据库 |
COPY() | 将查询结果复制到本地或远端的数据库表中 |
DEFINE() | 定义用户变量,默认为CHAR类型,也可以用来显示单个变量或所有变量的值和变量类型 |
DEL() | 删除一行或多行 |
DESCRIBE() | 显示指定表,视图,过程,或函数的列定义 |
DISCONNECT() | 向数据库提交挂起请求,记录当前用户,但并不退出SQL Plus环境 |
EDIT() | 打开所在操作系统的文本编辑器,显示指定文件的内容,或当前缓存区的内容 |
EXECUTE() | 执行一条PL/SQL语句 |
EXIT() | 退出 SQL Plus,返回操作界面 |
GET() | 把所有在操作系统的文件装载到缓存区中 |
HELP() | 访问SQL Plus帮助系统 |
HOST() | 在SQL Plus环境中执行所在操作系统的的命令 |
INPUT() | 在当前行后添加一行或多行文本 |
LIST() | 显示缓存区中的一行或多行 |
PASSWORD() | 修改口令,但是并不在显示器上显示口令 |
PAUSE() | 显示指定文本,等待用户按回车键 |
PRINT() | 显示指定变量的当前值 |
PROMPT() | 发送指定信息到用户屏幕 |
QUIT() | 终止SQL Plus环境中执行所在操作系统的命令 |
RECOVER() | 执行表空间,数据文件或整个数据库的介质恢复 |
REMARK() | 在脚本中标记注释信息的开始 |
REPFOOTER() | 替换或定义指定报告底部的页脚格式,也可以用来显示REPFOOTER的定义 |
REPHEADER() |
替换或定义指定报告顶部的页眉格式,也可以用来显示REPHEADERR的定义 |
RUN() | 显示并运行当前缓存区中的SQL命令或PL/SQL块 |
SAVE() | 将当前缓存区的内容保存为脚本 |
SET() | 设置系统变量,给变当前的SQL Plus环境 |
SHOW() | 显示SQL Plus系统变量的值或当前的SQL Plus环境 |
SHUTDOWN() | 关闭当前运行的Oracle例程 |
SPOOL() | 将查询的结果保存到文件中,可以选择将比例程连接到一个数据库 |
START() | 运行指定脚本中的SQL Plus语句,只能重SQL Plus工具中调运脚本 |
STARTUP() | 启动一个Oracle例程,可以选择将此例程连接到一个数据库 |
STOER() | 将当前的SQL Plus 环境的属性保存为脚本文件 |
TIMING() | 定义时钟记录一段时间内的时间数据。可以显示当前的时钟名和时间数据,也可以显示当前活动时钟的数量 |
TYITLE() | 替换或定义指定报告顶部的标题格式,也可以用来显示TTITLE的定义 |
UNDEFINE() | 删除一个或多个用户变量,这些用户变量是通过DEFINE的定义 |
VARIABLE() | 声明一个变量,可以在PL/SQL程序中使用 |
WHENEVER OSERROR() | 如果操作系统命令产生错误,则退出SQL Plus |
WHENEVERSQLERROR() | 如果SQL命令或PL/SQL程序产生错误,则退出SQLPlus |
@ | 运行指定脚本中的SQL Plus 语句。可以从本地文件系统或Web服务器调用脚本,
|
4,视图:PRODUCT_COMPONENT_VERSION中包含三列
5,查看视图PRODUCT_COMPONENT_VWRSION中Oracle数据库及其组件版本信息:COL 列名 FORMAT 大小;SELECT * FROM PRODUCT_COMPONENT_VWRSION;,
6,返回最后的SQL语句 LIST;
7,使用SAVE命令保存SQl语句得到方法:SAVE c:\SELECT.SQL
三,网络配置工具
Oracle是网络环境下的数据系统,支持网络中数据库的访问,使用Net Manager 可以对网络环境进行配置和管理。
1,Oracle数据库服务和数据库实例标识
a.一个数据库可以与一个或多个数据库服务器相关联。在客户端看来,数据库服务名就代表它们要访问Oracle数据库,服务器可以在初始化参数SERVICE NAME 中去设置。
B.数据库服务器名:默认条件下,数据库服务器名等于全局数据库名(区分与其他数据库的唯一标识,由数据库名+域名组成)<数据库名>.<域名>例sales(数据库名).oracleserver.com(域名)
C.连接描述符:连接Oracle数据库服务,客户端必须通过连接描述符来提供数据库的位置和数据库服务的名称,
例(DESCRIPTION(描述)=
(ADDRESS(地址)((PROTOCOL(协议)=tcp)(HOST(主机名)=oracleserver)(PORT(端口号)=1521))
(CONNECT_DATA(连接)=(SERVICE_NAME(数据库服务名)=sales.oracleserver.com)
(INSTANCE_NAME=salesl)(如果连接指定的数据库实例,客户端可在连接时指定INSTANCE_NAME参数)
(SERVER=shared)))使用指定服务处理器类型的客户来说,可以指定所使用的服务处理器类型,(共享服务器,默认)专用服务器为(dedicated)
连接服务器的地址部分实际上是监听器的协议地址客户端连接
D.客户端连接数据库服务途径:客户端——联系——数据库服务器上的监听器进程——传输——数据库服务器。
E.监听器收到请求后,选择一个已注册的服务处理器执行操作1,直接将连接请求传递给调度器进程,2向客户端发送一个重新定向消息,3生成一个专用服务器进程,一但完成连接操作,就不需要监听器参与。
2.连接字符串的命名方法
A.用户通过连接字符串来初始化到Oracle服务器的联接请求:CONNECT 连接字符串(用户名,口令,连接标识符)
B.连接字符串:包括用户名,口令和连接标识符(连接标识符可以是连接描述符,也可以是代表连接描述符的名称)。定义连接字符串的方法称为命名方法。
C.最常用的连接标识符是网络服务台,例:CONNECT SCOTT/TIGER@连接描述符 ,CONNECT SCOTT/TIGER@sales(定义网络服务名,在连接过程中,Oracle会将网络服务器替换成它定义的连接描述符)
D.创建客户端会话的过程:
连接标识符初始化一个连接请求——通过命名方法将连接标识符解析成连接描述符——客户端根据连接描述符中的地址生成一个连接请求——监听器接受到连接请求,并将它转向指定的数据库服务器——数据库服务器接受请求。
E.Oracle支持下面四种命名方法:
(1)本地命名:在本地的名为tnsnameS.ora的配置文件中保存网络服务名和连接描述符。
(2)目录命名:将连接描述符存储在一个中央目录服务器,用于访问数据库服务。
(3)简单连接命名:允许客户端通过TCP/IP连接字符串连接Oracle数据库(上面)TCP/IP,连接字符串是由主机名,端口号和服务名组成(后两可选)例:CONNECT username/password@host[:port][/service_name],不需要配置,可直接使用。
(4)外部命名:将网络服务名以支持的非Oracle命名服务方式存储,支持3方服务包括网络信息服务(NIS),外部命名和分布式计算环境(DCE)单元目录服务(CDS)。
Oracle Net的主要功能是建立,维护客户端应用程序和Oracle数据库服务器之间的连接,客户端和数据库服务器是通过一系列网络协议组成的协议栈实现通信的常见的客户端与Oracle数据库服务器的连接方式有【客户端/服务器应用程序连接,Java应用程序连接和web客户端连接】。
1,客户端/服务器应用程序连接中的通信栈:
也就是通常说的C/S结构应用程序。当客户端与数据库服务器建立连接后通信结构基于OSI通信模式(计算机之间的通信以栈的方式进行,信息通过多层代码在节点之间传送,包含物理层,数据链路层,网络层,传输层,会话层,表示层和应用层),
1.1客户端/服务器应用程序连接中的组成部分:
2.Java应用程序连接中的通信栈
3.Web客户端连接中的通信栈
Oracle数据库支持多种表示层,可以被Web客户端使用访问数据库的内部属性。
4,本地网络配置文件
默认情况下,Oracle使用一组本地配置文件来保存网络服务信息。
配置文件名 | 说明 |
cman.ora | 位于Oracle连接管理器运行的计算机上,保存以下配置信息:
|
listener.ora | 位于数据库服务器上,为监听器提供配置信息,主要包括:
|
sqlnet.ora | 位于客户端和数据库服务器计算机上,主要配置信息包括:
|
tusnames.ora | 主要位于客户端,包含映射到连接描述符的网络服务名,此文件在本地命名方法中使用 |
通常配置文件(Oracle数据库使用一组本地配置文件来保存网络信息)保存在¥ORACLE_HOME\nerwork\admin目录下。Oracle Net可以在不同位置搜索配置文件,搜索顺序1,环境变量TNS_ADMIN指定的目录。2,$ORACLE_HOME\network\admin目录。
5,Oracle Net Manager
Oracle Net Manager是配置和管理Oracle网络环境的一种工具,配置和管理功能:
4.2配置数据库:
1,查看和设置内存(SGA+PGA)参数
1.使用CEM查看和设置SGA和PGA的参数。
2.使用V$SGAINFO视图查看SGA基本信息(包含字段NAME(SGA统计项目的名称),BYTES(统计项目的大小,以字节为单位),RESIZABLE(是否允许调整大小))。语句:SELECT * FROM v$SGAINFO; Granule Size 项目表示粒度的大小。
3.使用V$SGASTAT视图查看SGA的统计信息(包含字段POOL(SGA组件驻留的池),NAME(SGA组件名称),BYTES(内存大小,单位字节))。语句:SELECT * FROM v$SGASTAT;
4,配置自动还原管理
Oracle 可以维护用于取消对数据库所做的更改的信息,这种信息由事物操作的记录组成,称还原。Oracle使用还原操作来回退有效的事务处理,恢复中断的事务处理,提供读取一致性。以及从逻辑错误中进行恢复,自动还原管理是基于还原表空间(undo tablespaces)的。基于OEM进行设置。
5,初始化参数文件
(定义参数,静态限制参数,动态性能参数,控制或修改数据库和数据库实例操作的参数)当Oracle数据库实例启动时,系统需要从初始化参数文件中读取初始化参数,初始化参数决定了Oracle实例的特性。
Oracle 11g的初始化参数文件可以是只读的文本文件:文本参数文件(Text initalization)又称为被称为PFILE文件,易于查看和修改。也可以是可读写的二进制文件:服务器参数文件(Server Parametter File)SPFILE,T它始终存放在数据服务器上。
文本初始化参数文件(PFILE):默认的文本初始化参数文件名为:init当前数据库实例名.ora,默认路径为:Oracle数据库安装的产品目录\database。
常用的初始化参数:
1,全局数据库名称:用户自定义的本地数据库名称(由初始化参数DB_NAME定义)+数据库在网络结构中的位置信息(由DB_DOMAIN定义域信息):DB_NAME=orcl + DB_DOMIN=mydomain.com==全局数据库名(orcl.mydomain.com).如果数据库实例启动时初始化参数DB_NAME与控制文件中的数据文件名不同,则无法启动。
2,定义闪回恢复区:闪回恢复区是Oracle数据库用来存储和管理与备份/恢复相关的文件的位置,它区分与数据库区(管理当前数据库文件的位置),闪回恢复区包含的初始化参数:DB_RECOVERY_FILE_DEST:定义闪回恢复区的位置,可以是目录,文件系统或自动存储管理磁盘组(ASM);DB_RECOVERY_FILE_DEST_SIZE:指定闪回恢复区的最大字节数,只有DB_RECOVERY-FILE_DEST有效时才能指定此参数。
3,指定控制文件:使用初始化参数CONTROL_FILES可以为数据库指定控制文件名。当执行CREATE DATABASE创建数据库时,将创建CONTROL_FILES中指定的控制文件列表。如果在初始化参数文件中没有CONTROL_FILES,则Oracle数据库使用默认的文件名来创建控制文件。
4,指定数据块的大小:使用初始化参数DB_BLOCK_SIZE 可以指定数据块的标准数据块大小,数据块大小可以在SYSTEM表空间和其他表空间中被默认设置 使用,一般设置为4kb或8kb
5,管理SGA:初始化参数SGA_MAX_SIZE可以指定SGA的最大内存数量,初始化参数SGA_TARGET用于指定SGA的实际大小。设置SGA_TARGET后,SGA的组件大小被自动设置。包括SHARED_POOL_SIZE(共享池) ,LARGE_POOL_SIZE(大池), JAVA_POOL_SIZE(java池), DB_CACHE_SIZE和STREAMS_POOL_SIZE(数据流池)等。
6,设置最大进程数量:使用初始化参数PROCESSES决定了操作系统中可以连接到oracle数据库的最大进程数量。
7,指定还原表空间(undo space)的管理方式:使用初始化参数UNDO_MANAGEMENT可以设置是否启动自动还原管理模式,在自动还原管理模式中。还原数据被保存在还原表空间中,默认值为:MANUAL...。如何指定为AUTO ,则UNDO TABLESPACE用于指定当前实例的还原表空间。
服务器参数文件SPFILE:
可以把SPFILE看做是在Oracle数据库服务器上维护的初始化参数的容器,它是服务器端的初始化参数文件,在一个数据库实例运行过程中,如果SPFILE的初始化参数被修改,则需要关闭数据库实例再启动后才能生效。
初始化参数管理:
使用SHOW PARAMETERS语句显示初始化参数。
使用V$PARAMETER 视图查看初始化参数信息。
使用ALTER SYSTEM语句设置初始换参数,ALTER SYSTEM SET 参数名=参数值 SCOPE=SPFTLE;
4.3维护数据库实例:
使用SHUTDOWN命令关闭数据库实例,
1,正常关闭数据库实例:SHUTDOWN NORMAL;
2,以事务方式关闭数据库实例:SHUTDOWN TRANSACTIONAL;
事务:包含一个或多个SQL语句的逻辑单元,事务中的SQL语句是一个完整的整体,它们要么全部提交(Commit),要么全部回滚(Rooiback)撤销。
3,立即关闭数据库:SHUTDOWN IMMEDIATE;终止关闭数据库:SHUTDOWN ABORT;
4,使用STARTUP命令启动数据库实例:以指定的初始化参数文件来启动实例,STARTUP PFILE=初始化参数文件,启动数据库实例,但不装载数据库:STARTUP;启动数据库实例,装载数据库:STARTUP MOUNT;强制启动数据库实例:STARTUP FORCE ;以限制模式启动数据库实例:STARTUP RESTRICT .在数据库启动时开始介质恢复:STARTUP RECOVER;
5,使用ALTER DATABASE 命令来改变启动模式:使用ALTER DATABASE 命令可以改变数据库实例的启动模式。切换到MOUNT模式:ALTER DATABASE MOUNT ;切换到OPEN模式:ALTER DATABASD OPEN;以只读方式打开数据库实例:ALTER DATABASE OPEN READ ONLY;
第五章,数据库存储管理:
一,表空间管理:
查看表空间信息,创建表空间,设置和修改表空间的属性使用只读表空间,重命名和删除表空间
1,通过oracle Enterprise manager查看表空间信息,
2,通过Oracle视图查看表空间信息
V$TABLESPACE | 控制文件中保存的所有表空间名称和属性 |
DBA_TABLESPACES | 所有表空间的属性和在线状态信息 |
USER_TABLESPACES | 所有用户可以访问表空间的描述信息 |
DBA_TABLESPACE_GROUPD | 所有表空间组及其所属的表空间信息 |
DBA_SEGMENTS | 所有表空间中的区间信息 |
USER_SEGMENTS | 所有用户表空间中的区间信息 |
DBA_FREE_SPACE | 所有表空间中的空闲区间信息 |
USER_FREE_SPACE |
所有用户表空间的空闲区间信息 |
V$DATAFILE | 所有数据文件信息 |
V$TEMPFILE | 所有临时文件信息 |
DBA_DATA_FILES | 显示所有属于表空间的数据文件信息 |
DBA_TEMP_FILES | 显示所有属于临时表空间的临时文件信息 |
|
|
(1)使用V$TABLESPACE视图查看完整的表空间信息
字段名 | 数据类型 | 说明 |
TS# | NUMBER(数字类型) | 表空间编号 |
NAME | VARCHAR2(30)(变长字符串) | 表空间名称 |
INCLUDED_IN_DATABASE_BACKUP | VARCHAR2(3) | 缩写INC,表明该表空间是否包含在完整的数据库备份中 |
BIGFILE | VARCHAR2(3) | 缩写BIG是否为大文件表空间 |
FLASHBACK_ON | VARCHAR2(3) | 缩写FLA表空间是否参见FLASHBACK DATABASE(数据回滚)操作 |
ENCRYPT_IN_BACKUP | VARCHAR2(3) | 缩写ENC,ON 表示表空间级别加密,OFF表示关闭,NULL表示为明确指定 |
(2)查看表空间的属性和在线状态
字段名 | 数据类型 | 说明 |
TABLESPACE_NAME | VARCHAR2(30) | 表空间名称 |
BLOCK_SIZE | NUMBER | 表空间数据块大小 |
INITIAL_EXTENT | NUMBER | 默认初始区间大小 |
NEXT_EXTENT | NUMBER | 默认区间自动增长量 |
MIN_EXTENTS | NUMBER | 默认最小区间数量 |
MAX_EXTENTS | NUMBER | 默认最大区间数量 |
PCT_INCREASE | NUMBER | 默认的自动增加的区间大小的百分比 |
MIN_EXTLEN | NUMBER | 表空间中最小区间的大小 |
STATUS | VARCHAR2(9) | 表空间状态包括,ONLIEN,OFFLINE和READ,ONLY |
CONTENTS | VARCHAR2(9) | 表空间的内容,包括UNDO,PERMANENT(永久)和TEMPORARY(临时) |
LOGGING | VARCHAR2(9) | 默认登录属性,包括LOGGING和NOLOGGING |
FORCE_LOGGING | VARCHAR2(3) | 表明表空间是否属于强制登录模式下 |
EXTENT_MANAGEMENT | VARCHAR2(10) | 表明表空间中的区间处于数据字典管理模式(DICTIONARY),还是本地管理模式 |
ALLOCATION_TYPE | VARCAHR2(9) | 表空间中区间的分配方式,包括SYSTEM,UNIFORM(统一)和USER |
PLUGGED_IN | VARCHAR2(2) | 表明表空间是否接入 |
SEGMENT_SPACE_MANAGEMENT | VARCHAR2(2) | 表明表空间中空闲和已使用的区间是使用空闲列表(MALNUL)来管理。还是使用位图(AUTO)来管理。 |
DEF_TAB_COMPRESSION | VARCHAR2(8) | 表明是否启动默认的表压缩选项 |
RETENTION | VARCHAR2(11) | 指定撤销表空间中撤销保留时间, |
BIGFILE | VARCHAR2(3) | 表明表空间是否为大文件表空间 |
(3)查看表空间组及其所属的表空间信息。
字段名 | 数据类型 | 说明 |
GROUP_NAME | VARCHAR2(30) | 表空间组名称 |
TABLESPACE_NAME | VARCHAR2(30) | 表空间名称 |
表空间组(tablespace Group):可以包含一个或多个表空间,user可以通过表空间组使用多个表空间的临时空间,一个表空间组至少包含一个表空间,不限制包含的最大表空数量
(4)查看表空间中所包含的段的信息;DBA_SEGMENTS;
字段名 | 数据类型 | 说明 |
OWNER | VARCHAR2(30) | 段所有者的用户名 |
SEGMENT_NAME | VARCHAR2(30) | 段的名称 |
PARTITON_NAME | VARCHAR2(30) | 对象分区名 |
SEGMENT_TYPE | VARCHAR2(18) | 段的类型:包括PARTITION,TABLEPARTITION,TABLE,CLUSTER,等 |
BYTES | NUMBER | 段的大小,单位为字节 |
TABLESPACE_NAME | VARCHAR2(30) | 包含段的表空间名称 |
BLOCKS | NUMBER | 段的大小,单位为数据块 |
EXTENTS | NUMBER | 分配给段的区间的数量 |
NEXT_EXTENT | NUMBER | 下一个要分配给段的区间的大小,单位为字节 |
MIN_EXTENTS | NUMBER | 段中允许包含的最小区间数量 |
MAX_EXTENTS | NUMBER | 段中允许包含的最大区间数量 |
(5)查看表空间中空闲区间的信息:DBA_FREE_SPACE视图;
字段名 | 数据类型 | 说明 |
TABLESPACE_NAME | VARCHAR2(30) | 表空间的名称 |
FILE_ID | NUMBER | 包含区间的文件的标识符 |
BLOCK_ID | NUMBER | 区间中起始数据块的编号 |
BYTES | NUMBER | 区间的大小,单位为字节 |
BLOCKS | NUMBER | 区间的大小,单位为数据块 |
RELATIVE_FNO | NUMBER | 包含区间文件的相对文件号 |
1,统计所有表空间的总空间大小
系统视图DBA_DATA_FILES中包含数据文件所属的表空间和数据文件单位大小,按表空间分组,求所有数据文件的大小之和:
SELECT tablespace_name AS 表空间名,SUM(bytes) FROM DBA_DATA_FILES
GROUP BY tablespace_name;
2,统计所有表空间的空闲空间大小
将系统视图DBA_DATA_FILES和DBA_FREE_SPACE相结合,统计表空间的空闲空间大小:
SELECT a.tablespace_name,NVL(SUM(b.bytes),0) bytes FROM DBA_DATA_FILES a,DBA_FREE_SPACE b
WHERE a.tablespace_name=b.tablespace_name (+) and a.file_id=b.file_id (+)
GROUP BY a.tablespace_name;
NVL()函数:如果参数字段值为空,则显示0;
3,统计表空间使用情况的SELECT语句
SELECT c.tablespace_name "表空间"
ROUND(a.bytes/1024/1024,2) "表空间大小"
ROUND(a.bytes-b.bytes/1048576,2) "已使用的表空间"
ROUND(b.bytes/1048576,2) "剩余空间"
ROUND(b.bytes/a.bytes * 100,2)||'%' "剩余百分比"
FROM (SELECT tablespace_name,SUM(bytes) bytes FROM DBA_DATA_FILES GROUP BY tablespace_name ) a,
(SELECT a.tablespace_name,NVL(SUM(b.bytes),0) bytes FROM DBA_DATA_FILES a,DBA_FREE_SPACE b
WHERE a.tablespace_name=b.tablespace_name(+) and a.tablespace_name=c.tablespace_name ORDER BY ROUND(b.bytes/1024/1024,2);
Oracle数据库导入表;
1,在磁盘下新建一个名为Oracle文件的文件夹,存放要导入的表文件到该文件夹,
2,创建表空间:
CREATE TABLESPACE 表空间名
[DATAFLIE ''(定义表空间中包含的数据文件) SIZE 整数[k|m](指定数据文件大小)
MININUM EXTENT 整数 [k|m]](指定表空间中包含区间的最小值)
BLOCKSIZE 整数[k](用于指定不标准的数据的大小)
LOGGING 子句(指定表空间上所有用户的日志属性)
FORCE LOGGING(指定表空间进入强制日志模式)
DEFAULT(是否压缩数据段) 存储子句(用于指定缺省的存储信息)
[online|offline](指定表空间的在线状态。online指定表空间在创建后立即生效,Offline指定无效)
[PERMANENT|TEMPORARY](参数指定表空间类型,永久表空间and临时表空间)
AUTOEXTEND ON NEXT 100M //指定为自动增量
MAXSIZE 20480M //整数 [k|m]](指定最大扩展量)
区间管理子句:指定表空间如何管理区间,使用local选项指定本地管理表空间。使用autoallocate选项表示由表空间自动分派空间,用户不能指定区间大小。
段管理子句:指定表空间如何管理段,通常使用SEGMENT SPACE MANAGEMENT AUTO 子句指定自动管理段。
例:create tablespace libsys_datalogging
datafile'E:\ORACLE文件\libsys_data.dbf'
size 10240m
autoextend on next 100m
maxsize 20480m
extent management local;
1,。本地管理表空间;本地管理表空间将表空间中所有得区间信息以位图的方式记录。所有的表空间都可以被本地管理。在CREATE TABLESPACE语句中使用EXTENT MANAGEMENT LOCAL子句,可以创建本地管理表空间。
例:CREATE TABLESPACE Oracles01 //定义表空间名
DATAFILE 'C:\ORACLE\Oracles01.dbf' SIZE 50M //指定表空间的数据文件及大小
EXTENT MANAGEMENT LOCAL AUTOALLOCATE; //指定本地管理表空间。指定表空间由系统管理,表空间自动分配区间,最小区间64kb。与AUTOALLOCATE子句相对应的是UNIFORM子句,使用它可以指定最小区间的大小。
2.。大文件表空间,是由唯一的非常巨大的数据文件组成的,只能包含一个数据文件。
例:CREATE BIGFILE TABLESPACE 大文件表空间名
DATAFILE 指定表空间的数据文件(绝对路径+文件名)SIZE 10g;
3,。创建临时表空间: 使用TAMPORARY关键字可以创建临时表空间,在创建临时表空间时,不允许使用AUTOALLOCATE关键词,因此表空间的区间大小必须使用UNIFORM子句手动指定。
CREATE TEMPORARY TABLESPACE 临时表空间名 (创建临时表空间指定临时表空间名)
TEMPFILE '文件路径\文件名'(指定临时文件的绝对路径和文件名)
SIZE 整数 [k|m]](指定数据文件大小) REUSE(指定临时文件可以重用)
AUTOEXTEND ON NEXT 整数 [k|m]](指定表空间为自动扩展及扩展单位量)
MAXSIZE 整数 [k|m]](指定最大扩展量)
EXTENT MANAGEMENT 管理方式 (指定表空间的管理方式,默认的是local)(在oracle数据库中:extent management 有两种方式 extent management local(本地管理); extent management dictionary(数据字典管理))UNIFORM SIZE 区间大小;(指定区间大小)
4,。定义表空间的段管理方式:表空间由段组成,在创建表空间时,可以指定段空间的管理方式,有自动和手动两种,在CREATE TABLESPACE语句中使用SEGMENT SPACE MANAGEMENT 子句定义段空间管理方式。
例:CREATE TABLESPACE 表空间名
DATAFILE 指定表空间的位置 SIZE 大小
ETENT MANAGEMENT LOCAL AUTOALLOCATE//指定表空间为本地管理表空间,表空间自动分派区间,
SEGMENT SPACE MANAGEMENT MANUAL /AUTO //指定表空间段的管理方式为手动/自动
5,。创建撤销表空间:维护信息由事务前的提交的操作记录组成,这些信息被称为撤销记录,可完成回滚操作(ROLLBACK),恢复数据库,使用闪回查询分析以前时间点的数据。使用闪回技术从逻辑破坏中恢复数据。
例:CREATE UNDO TABLESPACE 撤销表空间名
DATAFILE 指定数据文件的位置 SIZE 大小 REUSE (重用)
3,设置和修改表空间属性
使用ALTER TABLESPACE 语句修改表空间的属性
(1)重命名表空间:使用RENAME TO 子句:ALTER TABLESPACE 原表空间名 RENAME TO 新表空间名;
(2)向本地管理表空间添加数据:使用 ADD DATAEFILE 子句:ALTER TABLESPACE 表空间名 ADD DATAFILE 增加的数据文件 SIZE 数据文件大小;
(3)修改大文件表空间的属性:使用 RESIZE 子句:ALTER TABLESPACE 表空间名 RESIZE 表空间大小 ;
(4)向临时表空间中添加文件:使用ADD TEMPFILE 子句:ALTER TABLESPACE 临时表空间名 ADD TEMPFILE '临时文件名' SIZE 临时文件初始大小。
(5)设置表空间的状态:表空间的状态可以分为脱机和联机两种,一般设置为脱机状态的情况。
SYSTEM,UNDO,TEMPORARY表空间不能被设置为脱机状态。
使用 ALTER TABLESPACE 表空间名 OFFLINE/ONLINE 语句设置脱机/联机状态。
(6)设置只读表空间:为保护表空间不被修改,可以将其设置为只读表空间,为了避免对数据库中大量静态数据进行备份和恢复操作,保护历史数据不被修改。 在操作的表空间必须是处于联机状态。
使用 ALTER TABLESPACE 表空间名 WRITE/READ WRITE语句设置表空间为只读/可读写状态。
4,删除表空间;
删除表空间可同时删除表空间内容(表空间中的段)和数据文件。
删除表空间:DROP TABLESPACE 表空间名;
删除表空间同时删除其段:DROP TABLESPACE 表空间名 INCLUDING CONTENTS;
删除表空间同时删除其段和数据文件:DROP TABLESPACE 表空间名 INCLUDING CONTENTS AND DATAFILE;
回滚段是Oracle非常重要的逻辑存储结构,用于临时储存数据库的还原信息,
1,查看回滚段信息
使用视图DBA_SEGMENTS可以查看当前数据库中的所有段的信息,回滚段的类型(SEGMENT_TYPE)值为ROLLBACK.
COL 回滚段名 FOR A20
SELECT SEGMENT_NAME 回滚段名,TABLESPACE_NAME 所在表空间, BYTES 大小 //定义别名
FROM DBA_SEGMENTS WHERE SEGMENT_TYPE='ROLLBACK';
查看回滚段的基本信息,使用视图V$ROLLNAME和视图V$ROLLSTAT查看回工段的使用状态,
USE | NUMBER | 回滚段编号 |
NAME | VARCHAR() | 回滚段名称 |
USN | NUMBER | 回滚段编号 |
EXTENTS | NUMBER | 回滚段中包含的区间的数量 |
RSSIZE | NUMBER | 回滚段的大小,单位为字节 |
WRITES |
NUMBER | 向回滚段中写入的字节数 |
XACTS | NUMBER | 活动事务的数量 |
STATUS | NUMBER | 回滚段的状态,ONLINE,OFFLINE,PENDING和FULL |
CUREXT | NUMBER | 当前区间数量 |
CURBLK | NUMBER | 当前数据块区数量 |
2,使用连接查询查看当前回滚段的工作情况
COL NAME FPR A12
SELECT S.USN,N.NAME,S.EXTENTS,S.RSSIZE,S.STATUS
FROM V$ROLLSTAT S,V$ROLLNAME N WHERE S.USN=N.USN:
3,查看和设置回滚段的管理模式(默认为auto):使用初始化参数UNDO_MANAGEMENT可以设置管理回滚段的方式,利用 SHOW PARAMETER UNDO_MANAGEMNT;可以查看参数的值,
修改参数的值:ALTER SYSTEM SET UNDO_MANAGEMENT=MANUAL SCOPE=SPFILE;(表示初始化参数的修改应用与SPFILE)
4,创建回滚段:用户可以为不同的表空间创建专用的回滚段,必须将回滚段的管理模式设置为MANUAL;
CREATE [PUBLIC(公用)] ROLLBACK SEGMENT 回滚段名称
TABLESPACE 所属表空间名
STORAGE (INITAL(初始大小) 5M NEXT(增量) 2M MAXEXTENTS(最大区间) UNLIMITED(不限制数量);存储选项
通常情况下,建议由Oracle自动对回滚段进行管理
5,修改回滚段属性:需要将初始化参数UNDO_MANAGEMENT设置为MANUAL(手动)。
1.修改回滚段在线状态:联机(ONLINE)+脱机(OFFLINE):ALTER ROLLBACK SEGMENT 回滚段名称 回滚段状态;
查看回滚段状态:SELECT NAME,STATUS FROM V$ROLLNAME,V$ROLLSTAT
WHERE V$ROLLSTAT.USN=V$ROLLNAME.USN;
2.手动收缩回滚段:ALTER ROLLBACK SEMMENT 回滚段名 SHRINK TO 回滚段的初始大小;
3.删除回滚段:删除回滚段前要设置为脱机状态。:ALTER ROLLBACK SEGMENT 回滚段名 OFFLINE;
DROP ROLLBACK SEGMENT 回滚段名;
用户与模式(方案)的概念:Oracle通过模式来组织和管理数据库对象(表,视图,索引),用户是用来连接数据库对象。而模式用是用创建管理对象的。模式跟用户在oracle 是一对一的关系。
模式(方案):是一系列逻辑数据结构或对象的集合,模式是数据库对象的集合。模式对象是数据库数据的逻辑结构。(把数据库对象用模式分开成不同的逻辑结构)一个模式只能够被一个数据库用户所唯一拥有,模式名与用户名相同。且用户的所有模式对象都保存在自己的模式中。模式对象主要包括表,索引,触发器,PL/SQL包,视图,java类,其它用户要使用模式对象,则需要在对象名前加上他所属的模式名。非模式对象主要包括表空间,用户,和角色。
Oracle用户是用连接数据库和访问数据库对象的。(用户是用来连接数据库访问数据库)。默认情况下,用户所创建的数据库对象都保存在自己的模式中。
6.2用户管理:
select * from dba_users; 查看数据库里面所有用户,前提是你是有dba权限的帐号,如sys,system
select * from all_users; 查看你能管理的所有用户!
select * from user_users; 查看当前用户信息 !
1.创建用户:
CREATE USER 用户名 IDENTIFIED BY 密码
DEFAULT TABLESPACE 指定表空间名
TEMPORARY TABLESPACE 临时表空间名
(如果不设置默认表空间和临时表空间,则使用SYSTEM作为默认表空间,使用TEMP做为临时表空间)
创建用户后,系统将同时创建一个同名的方案,用户对同名方案下的数据库对象有管理的权限。
2,修改用户:
修改密码:ALTER USER 用户名 IDENTIFIED BY 新密码;
使用PASSWORD EXPIRE 关键词设置密码过期:ALTER USER USERMAN PASSWORD EXPIRE;(下次登录必须修改密码)
使用ACCOUNT LOCK关键词锁定用户:ALTER USER 用户名 ACCOUNT LOCK;(无法登录到数据库)
使用ACCUNT UNLOCK关键词解锁用户:ALTER USER 用户名 ACCOUNT UNLOCK;
3,为用户分配表空间配额:DBA可以为用户分配表空间的配额,即该用户在指定的表空间中可以占用的空间大小,防止用户无限度的占用资源:ALTER USER 用户名 QUOTA 表空间配额大小 ON 表空间;为用户在表空间中分配多少的配额。
4.删除用户:DROP USER 用户名;
5,授予用户权限:
授予系统权限:使用GRANT授予系统权限:GRANT 系统权限 TO 用户名或角色名;
授予对象权限:使用GRANT授予数据对象权限:GRANT 数据对象权限 ON 数据对象 TO 用户名或角色名;
赋权: grant dba,connect ,resource to libsys;
grant
to
name
>;
关闭sqlplus。打开运行界面cmd,切换到根目录输入imp 用户/密码 file=表路径+文件名 ignore=y full=y;
6,撤销用户的角色权限:REVOKE 权限 FROM 用户名或角色;
三,数据库文件管理
SCN(System Change Number):Oracle的重要机制,可以用来记录和标识执行数据操作的先后顺序,一个 只能增大的大整数,SCN保存在Oracle数据库文件中,创建控制文件时,可以指定记录SCN的规则,
SCN的工作原理:当用户修改Oracle数据库的数据时,开始事务在SGA的数据库缓存区中查找修改的数据,如果没有,在数据文件中找到并加载到数据库缓存区修改,,用户提交数据时(修改数据块后),LGWR(日志写入进程)进程会将数据库缓存区中的数据和新生成的SCN写入到重做日志文件中(将此时的数据称为脏数据),为了减少I/O操作(设备与cpu连接的接口电路的操作),Oracle不会立即将脏数据写入到数据文件中。当发生检查点事件时,CKPT(检查点进程)进程会触发DBMn(数据库写入进程)进程将把SGA中的所有改变的数据库缓存区写入到数据文件中,即更新数据库中的所有数据文件和控制文件,标记最新的检查点,下一次更新从最新的检查点开始。
在执行SHUTDOWN NORMAL(正常方式关闭数据库)和SHUTDOWN IMMEDIATE(立即方式关闭数据库)语句时,会触发Checkpoint, 在发生Checkpoint事件时,Oracle数据库会将SCN写入到4个地方,将SCN更新为最新的值。
1.系统检查点SCN(System Checkpiont SCN ):当一个Checkpoint完成时,Oracle会将系统检查点SCN保存到控制文件中,可以通过系统视图V$DATABASE中查看系统检查点的值(CHECKPOINT_CHANGE#);
2.数据文件检查点SCN(Datafile Checkpoint SCN):当checkpoint完成时,Oracle会将每个数据文件检查点SCN保存到控制文件中,SELECT NAME,CHECKPOINT_CHANGE# FROM V$DATAFILE;
3.启动SCN(Start SCN):Oracle把每个数据文件的检查点SCN存储在每个数据文件的头文件中,称为启动SCN。实例启动时Oracle会检查每个数据文件的启动SCN与控制文件的检查点SCN是否一致,如果不一致,则重做日志文件会找到丢失的SCN,重新写入到数据文件中进行恢复。SELECT NAME,CHECKPOINT_CHANGE# FROM V$DATAFILE_HEADER;
4,.结束SCN(Stop SCN):每个数据文件的结束SCN都保存在控制文件中。正常情况下,所有处于联机读写模式下的数据文件的结束都为NULL。SELECT NAME, LAST_CHANGE# FROM V$DATAFILE;
Oracle正常启动时并运行时,控制文件检查点SCN,数据文件检查点SCN和每个数据文件的启动SCN都是相同的,控制文件中每个数据文件的结束都是为空的。系统会根据时间戳(TIMESTAMP)自动生成最新的SCN,可以从dual表中查看:SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM dual(伪表);
控制文件管理:控制文件是一个小的二进制文件。用来记录数据库的物理结构。包含:数据库名称,相关数据文件和重做日志文件的名称和位置。数据库创建的时间戳。当前的日志序列号,检查点信息。Oracle数据库必须可写控制文件。
查看控制文件信息:V$CONTROLFILE ,V$CONTROLFILE_RECORD_SECTION,V$PARAMETER;
创建控制文件:恢复控制文件:删除控制文件。
数据文件管理:在OEM中可以查看数据文件信息,
利用视图V$DATAFILE可以查看数据文件信息
FILE# | 文字标识符 |
CREATION_TIME | 创建数据文件的时间戳 |
TS# | 所属表空间编号 |
STATUS | 文件的状态 OFFLINE(),ONLINE(),SYSTEM(),RECOVER(),SYSOFF(表空间脱机文件) |
ENABLED | 表示SQL语句如何访问,DISABLED(不允许SQL访问),READ ONLY(不允许更新访问),READ WRITE(允许完全访问),UNKNOWN(文件破坏) |
BYTES | 数据文件大小,单位为字节,若0,不可访问 |
BLOCKS | 数据文件的大小,单位为数据块,若0 ,不可访问 |
BLOCK_SIZE | 数据文件中数据块的大小 |
NAME | 数据文件名称 |
数据文件是与表空间一起创建的。可以使用ALTER TABLESPACE 语句修改表空间时使用 ADD DATAFILE 添加数据文件,ALTER TABLESPACE 表空间名 ADD DATAFILE 逻辑文件名 SIZE 大小; 修改数据文件大小:使用ALTER DATABASE DATAFILE 数据文件名 RESIZE 大小;。修改数据文件的在线状态:ALTER DATABASE DATAFILE 数据文件名 ONLINE/OFFLINE;删除数据文件:ALTER DATABASE DATAFILE 逻辑文件名 OFFLINE DROP;
重做日志管理:
重做日志用于保存数据库的所有变化信息,Oracle数据库的每个实例 都有一个相关的重做日志,由重做日志文件由重做记录组成,而每个重做记录由一组变化元素组成,变化元素中记录了数据库中每个单独的数据块的变化情况。可以使用重做记录来恢复数据库的变化。保护回滚数据。当恢复数据时数据库从重做记录中读取变化元素,然后将变化应用到相关的数据块中。
数据库中至少包含两个重做日志,一个始终保持可写状态,记录数据变化,另一个用于归档操作(当数据库 处于ARCHIVELLOG(归档)模式时)
Oracle记录重做日志,LGWR日志写入进程负责记录重做日志,在在线重做日志文件中顺序循环写入,当最后一个被填充满了,则LGWR会将变化数据写入到 第一个重做日志文件中。为防止重做日志文件被破坏,oracle提供一种多元重做日志 ,系统在不同的位置上自动维护重做日志的两个或更多副本。多元性通过创建重做日志组实现的,组包括重做日志文件和它的多元副本。每个重做日志组由数字定义
LGWR不会同时写入不同组的日志文件,如果写入,则将写入成员标记为INVALID.
MAXLOGFILES:在CREATE DATABASE 语句中使用MAXLOGFILES参数可以指定每个数据库重做数据文件组的最大数量。
MAXLOGMEMBERS:在CREATE DATABASE 语句中使用MAXLOGMEMBERS参数可以指定每个日志文件组中包含的日志文件的最大数量。
查看重做日志信息:
查询视图V$LOG显示控制文件中重做日志组的信息,查询视图V$LOGFILE,显示重做日志的成员文件。
创建重做日志组和成员。使用ALTER DATABASE 语句中 ADD LOGFILE 子句创建重做日志组。:ALTER DATABASE ADD LOGFILE [ GROUP 数字] ('LOG1.rdo','LOG2.rdo') SIZE 5000K;创建重做日志[组]文件;使用ALTER DATABASE ADD LOGFILE MEMBER 'log.rdo' TO GROUP 10;创建重做日志成员,将重做日志文件添加到10的重做日志组中。
当从数据库中删除重做日志文件时,操作系统文件不会被删除,数据库的控制文件不会被跟新,从数据库结构中删除重做日志文件。删除重做日志成员后,确认删除成功。然后可以手动删除相关重做日志文件。
归档日志管理:
归档重做日志:Oracle将被填充满的重做日志文件保存到一个或多个离线位置,称为归档重做日志(ARCHIVE),简称归档日志,将重做日志转换为归档重做日志称为归档。只能在APCHIVELOG(归档模式)模式下数据库进行。
归档日志文件:归档日志文件是重做日志文件文件组的备份,由重做项目和唯一的日志序列号组成,当数据库处于归档模式时,,写入日志进程(LGWR)不能对未归档的重做日志组进行重写和改写操作。如果设置了自动归档模式。则后台进程ARCN将自动地执行归档操作 。可以使用归档日志文件达到恢复数据库,更新备用数据库,使用LOGminer获取数据库历史信息的目的。
查看数据库实例的归档模式:SELECT NAME,LOG_MODE FROM V$DATABASE;
查看归档日志信息:ARCHIVE LOG LIST;
查看归档日志的名称,序列号和状态:SELECT NAME,SEQUENCE#,STATUS FROM V$ARCHIVED_LOG;
第六章,数据库安全管理
Oracle认证方法:通过认证,Oracle提供的身份认知的方法有,操作系统身份认证,网络身份认证,Oracle数据库身份认证和数据库管理员认证等。
数据库管理员认证(操作系统认证+密码文件认证):
操作系统认证方式:
忘记DBA口令的解决办法:
1,在操作系统页面以SYSDBA身份登录到SQL Plus。sqlplus“/as sysdba”.
2,在SQL plus中执行 ALTER USER SYS IDENTIFIED BY 口令;COMMIT 修改口令。
3,CONN SYS/ AS SYSDBA ;连接到数据库。
6.3角色管理;
角色:对用户的类管理的一种分类管理办法,不同角色的用户可以分为不同的角色。Oracle系统提供预定义的系统角色。
CONNECT | 授予最终用户的基本权限,主要包括ALTER SESSION(修改会话),CREATE CLUSTER(建立聚簇),CREATE DATABASE LINK(建立数据库链接),CREATE SEQUENCE(建立序列),CREATE SESSION(建立会话),CREATE STNONYM(建立同义词),CREATE TRIGGER(),CREATE TYPE()等权限。 |
RESOURCE | 授予开发人员的基本角色,主要包括CREATE CLUSTER(),CREATE PROCEDURE(),CREATE SEQUENCE(创建序列),CREATE TABLE(创建表),CREATE TRIGGER(创建触发器),CREATE TYPE(创建类型)等权限 |
DBA |
拥有所有系统级管理权限 |
IMP(EXP)_FULL_DATABASE | 导入,导出数据库所需要的角色,主要包括BACKUP ANY TABLE(备份表),EXECUTE ANY PROCEDURE(执行过程),SELECT ANY TABLE(查询表) 等权限。 |
DELETE_CATALOG_ROLE | 删除sys.and$记录的权限,sys.and$表中记录着审计后的记录, |
SELECT_CATALOG_ROLE | 具有从数据字典查询的权限 |
EXECUTY_CATALOG_ROLE | 具有从数据字典中执行部分的过程和函数的权限 |
视图DBA_ROLES可以查询角色的信息:
ROLE | 角色名 |
PASSWORD_REQUIRED | 表示角色名是否需要使用口令来启动 |
创建角色:通常只需要使用系统预设的角色即可,也可以手动创建。语法:CREATE ROLE 角色名 IDENTIFIED BY 验证口令;
指定用户的角色:GRANT 角色名 TO 用户名;
撤销用户角色:REVOKE 角色名 FROM 用户名;
修改(取消)角色的验证方式:ALTER ROLE NOT IDENTIFIED;
删除角色:DROP ROLE 角色名。
第七章,数据库对象管理
配置管理数据库对象的用户:
对用户进行授权:GRANY CONNECT,RESOURCE TO 用户名;(CONNECT与RESOURCE是最基本的角色)
GRANY SELECT ANY DICTIONARY TO 用户名;(SELECT ANY DICTIONARY 系统权限允许用户读取任意一个数据字典)
execute MGMT_USER.MAKE_EM_USER('USERMAN');(配置指定用户可以登录OEM)
表管理
数据类型:
数据类型 | 最大长度 | 说明 |
CHAR(size) | 200Byte | 固定字符串长度,size表示存储的字符数量 |
NCHAR(size) |
2000Byte | 固定长度的NLS国家语言支持字符串,size表示存储字符串的数量。 |
NVARCHAR2(size) | 4000Byte | 可变长度的NLS字符串,size表示存储的字符数量 |
VARCHAR(size) | 4000Byte | 可变长度字符串 |
LONG | 2GB | 可变长度字符串,不建议使用 |
RAW | 2000Byte | 可变长度二进制字符串 |
LONGRAW | 2GB | 可变长度二进制字符串,不建议使用 |
数据类型 | 说明 |
NUMBER(p,s) | 包含小数位的数值类型。p表示精度,s表示小数点后的位数。例如number(10,2)小数位两位,总共10位。 |
NUMERIC(p,s) | 同上 |
FLOAT | 浮点数类型。属于近似数据类型,他并不存储为精确值,存储最近似值 |
DEC(P,S) | 与number(p,s)相同 |
DECIMAL(p,s) | 与number(p,s)相同 |
INTEGER | 整数类型 |
INT | 同上 |
SMALLINT | 短整形 |
REAL | 实数类型,与float一样 |
DROUBLE | 双精度类型 |
日期时间类型:DATE 日期类型。
大对象型(LOB):BFILE,BLOB,CLOB,NCLOB.
Rowid型:ROWID,UROWID(size).
创建表:CREATE TABLE [方案名.]表名(列名 数据类型 约束,列名 数据类型 约束……);
修改表:
添加列:ALTER TABLE 表名 ADD (列名 数据类型 约束);。
修改列名:ALTER TABLE 表名 RENAME COLUMN 原表名 TO 新表名;
删除列:ALTER TABLE 表名 DROP COLUMN 列名;
设置列不可用:ALTER TABLE 表名 SET UNUSED 列名;
删除不可用列:ALTER TABLE 表名 DROP UNUSED COLUMNS;
删除表:DROP TABLE 表名;
插入数据:INSTER INTO 表名 [(列名,列名,列名……)] VALUES(值,值,值……) ;
修改数据:UPDATE 表名 SET 列名=值,列名=值,列名=值,……WHERE 更新条件表达式。
删除数据:DELETE 表名 WHERE 删除条件表达式;
表特性
1.TABLESPACE子句
当创建表时,Oracle会自动从指定的表空间中为新建的表创建一个数据段,以便为表提供存储数据的空间。用户在创建表时为表指定所处的表空间,需要在CREATE TABLE语句中用TABLESPACE子句。TABLESPACE 表空间名;为表指定表空间时,用户必须在相应的表空间中拥有足够的配额,或拥有UNLIMITED TABLESPACE系统权限。②在Oracle中创建用户时,可以规定用户的默认表空间,TABLESPACE是可选的。③如果用户在创建用户账户时未指定其默认的表空间,并且也未使用TABLESPACE子句,则创建的表将存储在SYSTEM表空间中。将用户放在SYSTEM表空间会导致一系列问题:<1>数据库混乱。<2>空间争用。
2.STORAGE子句
当用户在Oracle中创建对象模式(如表)时,Oracle允许用户规定该对象如何使用磁盘上的存储空间,需要使用对象的存储参数来完成如果仅为表指定了表空间,而没有设置存储参数,它将自动采用所属表空间的默认存储参数设置。(但并不一定对表空间中的每个表都适合)。当表所需的存储参数与表空间的默认存储参数不同时,需要在创建表时显示指定存储参数以替换表空间的默认存储设置。
对存储参数的设置可以通过CREATE TABLE语句中的STORAGE子句来实现,在该子句中可以设置以下5个存储参数。
(1)INITIAL:指定为表中的数据分配的第一个盘区大小(KB或MB)。默认为5个Oracle数据块的大小。当为已知数量的数据建立表时,可以将INITIAL设置为一个可以容纳所有数据的容量,这样可以将表中所有数据存储在一个盘区中,以免产生碎片。
(2)NEXT:指定为存储表中的数据分配的第二个盘区大小(KB或MB)默认值为5个Oracle块大小,当表的第一个盘区被填满后,NEXT参数将控制Oracle为随后的盘区分配空间大小。
3)PCTINCREASE:从第二个盘区之后,每个盘区相对于上一个盘区的增长百分比,每次分配盘区的时候,下一个盘区的大小都要根据
PCTINCREASE比例增长,通常情况下,建议将PCTINCREASE设置为0.
(4)MINEXTENTS:指定允许为表中的数据所分配的最小盘区数目。
(5)MAXEXTENTS:指定允许为表中的数据所分配的最大盘区数目,默认值为UNLIMITED。
CREATE TABLE Employee
( EMP_ID NUMBER(5),name VARCHAR2(10),Job VARCHAR2(10),Age NUMBER(3),DEP_ID NUMBER(5)
) TABLESPACE USERS
STORAGE
( INITIAL 64K
NEXT 50K
MINEXTENTS 1
MAXEXTENTS unlimited
PCTINCREASE 10
);
3.设置数据块子句
对于一般不带LOB类型数据的表来说,一个数据块可存放表的多个记录行。用户可以设置的数据块空间管理参数主要有两类:
(1)PCTFREE和PCTUSED:这两个参数用于控制数据块中空闲空间的使用方法,其中PCTFREE用于控制数据块的更新预留的空间,而PCTUSED用于控制数据块在删除时释放空间的门槛。 ① PCTFREE参数为数据块中行的更新预留了空闲空间的最小百分比,默认值为10.② PCTFREE值越小,则为现行行更新所预留的空间越少,但其设置的太高,则会浪费磁盘空间,若设置的太低,会导致产生迁移记录。设置PCTFREE为20 ,说明在该表的数据段内每个数据块的20%被作为可利用的空闲空间,用于更新已在数据块内存在的数据行,其余80%用于插入新的数据行。③ PCTUSED参数设置了数据块是否空闲的界限,当数据块的使用空间低于PCTUSED的值时此数据块标志为空闲,仅用于插入新的记录。如果数据块的使用空间已经达到了由PCTFREE所确定的上限,该数据块被标示为不可用,无法插入新记录。④为表设置PCTFREE与PCTUSED参数时,
PCTFREE与PCTUSED两个参数的值的和必须等于或小于100,一般来说,它们的和与100相差越大,对应于大多数情况来说,能够获得越高的存储效率。⑤当在实际的应用中UPDATE操作较多时,且更新操作会增加记录的大小时,可将PCTFREE值设置得大一点,而将PCTUSED值设置的比较小;当在实际的应用中使用INSERT和DELETE操作较多时,且UPDATE操作不会增加记录的大小时,可将PCTFREE参数设置的比较小,PCTUSED参数值设置得比较大。指定PCTUSED为40,则当数据块的使用空间大于或等于40%时,该数据块标示为不可用,无法插入新记录。
(2)INITRANS和MAXTRANS:这两个参数用于控制能够并发访问数据块的事务数量,同时也会影响到数据块头部的空间使用情况。在创建表时,Oracle会在表中每个数据块头部分配可以存储INITRANS个事务条目的空间(永久的)只能用于存储事务条目,当数据块的头部空间已经存储了INITRANS个事务条目后,若还有其它事务要访问这个数据块,Oracle将在数据块的空闲空间中为事务分配空间(动态的),当事务结束后,会被回收以存储其它数据。
4.重做日志子句
当使用CREATE TABLE语句创建表时,如果使用了NOLOGGING子句,则对该表的操作不会保存到日志中,这种表称为非日志记录表。而在创建表时,默认情况下使用LOGGING子句,则对表的所有操作都记录到重做日志中。【注】当使用NOLOGGING子句时,可以节省重做日志文件的存储空间,并减少创建表时所需要的时间,但如果没有在重做日志文件中记录对表的操作,可能会无法用数据库恢复操作来恢复丢失的表。
5.CACHE和NOCACHE
当oracle执行全表搜索时,读入缓存的数据块会存储在最近最少使用列表(LRU)的最近最少使用的一端,若进行查询操作,且必须向缓存中读取数据的时候,就会将这些数据块换出缓存。在创建表时,若使用了CACHE子句,则如果对其进行全表搜索时,会将读入的数据块放置到LUR中最近最常使用的一端。(不会立即换出,提高查询效率)。默认情况下使用NOCACHE子句。
数据完整性(约束)
查看所有表约束:利用视图USER_CONSTRAINTS和USER_CONS_COLUMNS.
例:SELECT TABLE_NAME,CONSTRAINT_NAME,COLUMN_NAME FROM USER_CONS_COLUMNS;
设置默认属性:DEFAULT('默认值')在为字段设置默认值时,可以使用常数也可以使用表达式。
表约束:是Oracle提供的一种强制实现数据库完整性的机制。
列级约束:可以直接在列定义后面添加约束,列名 数据类型 CONSTRAINT 约束名 约束类型;
表级约束:也可以在末尾使用:CONSTRAINT 关键字定义约束,并指定约束的名称。CONSTRAINT 约束名 约束类型(列名); 非空约束不适用。
在Oracle系统中,可通过CONSTRAINT关键字为约束命名,若用户没有为约束指定名称,Oracle将自动为约束建立默认的名称。在定义约束时,可以通过指定ENABLE或DISABLE关键字将约束的初始状态设置为激活或禁用状态,Oracle默认约束为激活状态。
还可以使用对于创建好的表使用:ALTER TABLE 表名 ADD CONSTRAINT 约束名 约束类型(列名)。非空约束不适用。
PRIMARY KEY(主键约束):主键是表中的一列或一组列,它的值可以唯一标识一个元组(一行)。列级定义(单字段)+表级定义(多字段)。
列级定义:字段+类型+CONSTRAINT 约束名 PRIMANRY KEY ;表级定义: CONSTRAINT 约束名 PRIMANRY KEY(字段1,字段2……);
删除表的PRIMARY KEY约束,用带有DROP CONSTRAINT的ALTER TABLE语句完成。:ALTER TABLE 表名 DROP CONSTRAINT 约束名;
NOT NULL(非空约束):指定的列值不允许为空。ALTER
UNIQUE KEY(唯一约束):保证除外键以外其他列数据的唯一性,一防止在列中输入重复的值。被定义为UNOQUE的字段,Oracle会自动为其建立一个唯一索引。如果在一个字段上仅定义了UNIQUE约束,而没有定义NOT NULL约束,则该字段可以包含多个NULL值。
CHECK(检查约束): 指定表中一列或多列可以接受的数据值或格式,CHECK约束是通过检查输入到表中的数据值来维护域的完整性,即检查输入的每一个数据,只有符合条件的数据才允许输入到表中。
CHECK约束的特点:
(1)在CHECK约束的表达式中,必须引用表中一个或多个字段,并且表达式的运算结果必须是一个布尔值。
(2)CHECK约束既可以在列级定义,也可以在表级定义。
(3)对于同一个字段,可以定义多个CHECK约束,而且对于同一个字段,可以定义CHECK约束和NOT NULL约束。
例:CREATE TABLE TTB1(
USRTID NUMBER PRIMARY KEY,
USERNAME VARCHAR(40),
USERPWD VARCHAR(40),
CONSTRAINT 约束名 CHECK(LENGTH(USERPED)>=6));
LENGTH()是Oracle的函数,求字符长度,使用ALTER TABLE TTB1 ADD CONSTRAINT 约束名 CHECK(LENGTH(USERPWD)>=3 );也可以创建检查约束。
FOREIGN KEY(约束):用于建立和加强两个表数据之间
连接的一列或多列,通过将表中的主键添加到另一个表中。创建两个表的连接。该主键就为另一个表的外键。
ALTER TABLE USER1
ADD CONSTRAINT 约束名 FOREIGN KEY (外键列名) REFERENCES 主表名(主表主键列名))
FOREIGN KEY特点:
(1)被定义了FOREIGN KEY约束的字段的取值只能为相关表中引用字段的值或NULL值。
(2)可以为一个字段定义FOREIGN KEY约束,也可以为多个字段的组合定义FOREIGN KEY约束。
(3)定义了FOREIGN KEY约束的外键字段和被引用的主键字段可以存在于同一个表中,这种情况称为“自引用”。
(4)对于同一个字段可以同时定义FOREIGN KEY约束和NOT NULL约束。
在Oracle系统中,约束具有如下两种状态:
(1)激活状态(ENABLE):在激活状态下对表进行操作时,如果操作与约束规则冲突,则操作被取消。
(2)禁用状态(DISABLE):在禁用状态下对表进行操作时,即使操作与约束规则冲突,操作也会得到执行。
一般情况下,为保证数据库在数据的完整性,表中的约束应当始终处于激活状态。默认情况下,约束的初始状态为激活状态。如果在定义约束时使用关键字DISABLE(加在约束类型后面),则约束的初始状态变为禁用状态。例:ALTER TABLE employee DISABLE UNIQUE(phone);//将phone的唯一索引变为禁用状态
ALTER TABLE employee DISABLE CONSTRINT PK_ID ;//将约束名为pk_id的约束禁用。
禁用UNIQUE约束和PRIMARY KEY约束时,Oracle默认为删除约束对应的唯一索引,而在重新激活约束时,Oracle将会自动建立唯一索引。
数据查询:SELECT FROM 来源 WHERE 查询条件 GROUP BY 分组条件 HAVING 分组过滤 ORDER BY排序条件
使用JOIN连接的语法格式为:
SELECT [ ALL|DISTINCT] <字段列表> FROM <表1> INNER JOIN <表2> ON 联接条件[,<表3>…]
WHERE <条件表达式>
有三种连接类型:(1)内连接(2)外连接(3)交叉连接
1)内连接是最常用的一种连接,也称为自然连接(普通连接)。内连接使用比较运算符(最常用的是等号,即等值连接),根据每个表共有列的值匹配两个表中的行。只有每个表中都存在相匹配列值的记录才出现在结果集中。内连接的分类:①等值与不等值连接等值连接:在连接条件中使用等于(=)运算符比较被连接的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。2.不等值连接不等值连接:连接条件使用除等于运算符以外的其他比较运算符比较被连接的列的值。这些运算符包括>、>=、<、<=、!>、!<、<>。
语法格式如下:
SELECT [ ALL|DISTINCT] <字段列表>FROM <表1> INNER JOIN <表2> ON 联接条件[,<表3>…]
WHERE <条件表达式>
自然连接在连接条件中使用等于运算符比较被连接列的值,但它使用选择列表指出查询结果集合中所包含的列,并删除连接表中的重复值。【注】自然连接为具有相同名称的列自动进行记录匹配,不必指定任何同等连接条件,SQL实现方式将判断出具有相同名称的列然后形成匹配。自然连接时根据两个表中同名的列进行连接的,当列不同名时,自然连接将失去意义。
(1)左外连接:在结果中除了满足连接条件的行外,还包括JOIN左侧表的所有行。语法:FROM 表名1 LEFT [OUTER] JOIN 表名2 ON 连接表达式
(2)右外连接:结果包含JOIN右侧表的所有行,SELECT 列表列名FROM 表名1 RIGHT [OUTER] JOIN 表名2 ON 表名1.列名=表名2.列名
(3)完全连接:结果包含JOIN左侧和右侧两侧表的所有行;
3)交叉连接两个表进行交叉连接,生成来自这两个表的各行的所有可能的组合。(1)交叉连接不带WHERE子句时,返回的是被连接的两个表中所有数据行的笛卡尔积,即返回到结果集中的数据行等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件烦人数据行数,所以,交叉连接也称为矢量积或笛卡尔积。(2)当交叉连接带有WHERE子句时,返回两个表的笛卡尔积中满足WHERE子句限定条件的所有行。【注】交叉连接在FROM子句中多个表名之间不用逗号,而是用CROSS JOIN关键字隔开,不用ON限定连接条件,将连接条件用WHERE限定。
定义显示标题:AS.
统计函数,count(),avg(),sum(),max(),min();
7.4视图
视图是虚拟的表,它在物理上不存在,可以把表或其他视图的数据按照一定的条件组合起来。
创建视图:CREATE VIEW 视图名 AS SELECT 语句;
修改视图:CREATE OR REPLACE VIEW 视图名 AS SELECT 语句;
实体化视图:包含查询结果的数据库对象。它可以是远程数据的本地备份,也可以用于根据基础表中的数据来创建汇总表,储存数据基于远程表的实体化视图也被称为数据库快照,数据库快照是只读的。
实体化视图可以查询表,视图,或其他实体化视图,在大型数据库中可以提高部分函数的查询速度。在实体化视图上创建了统计,查询优化器将自动的使用实体化视图管理,这种特性被称为查询重写(QUERY REWRITE).
实体化视图管理存储数据,占据数据库的物理空间,查询实体化视图可以直接访问其中保存的数据,一般视图的数据保存在基础表中,查询视图相当对基础表进行查询。
索引:
数据库索引:对表的一列或多列进行排序的结构,索引提供指针以指向存储在表中指定列的数据值,然后根据指定的排序次序排练这些指针,数据库通过搜索索引找到特定的值,然后跟随指针到达包含该值的行。
Oracle支持以下几种索引:
索引针对查询操作较多,修改删除等操作较少的列。不经常使用或者数据量较大的表不适合,因为索引会增加存储空间,同时降低添加,修改和删除数据的效率。
创建索引:可以使用CREATE INDEX语句创建索引,语法:CREATE [UNIQUE | BITMAP] INDEX [方案名.]索引名 ON [方案名.]表名 [表别名](列名)[ASC|DESC ] INDEX子句 INDEX属性;
INDEX 子句可以用于指定保存索引的表空间, 例:Oracle分区索引
1. Local Index
就是索引信息的存放位置依赖于父表的Partition信息,换句话说创建这样的索引必须保证父表是Partition
1.1 索引信息存放在父表的分区所在的表空间。但是仅可以创建在父表为HashTable或者composite分区表的。
LOCAL STORE IN (tablespace) ;
为表中的普通列创建普通索引:CREATE INDEX 索引名 ON 表名(列名) TABLESPACE 表空间名;
创建主键索引,唯一索引可以在创建表时创建,约束名即为索引名。
使用CREATE UNIQUE INDEX 创建唯一索引:CREATE UNIQUE INDEX 索引名 ON 表名(列名) TABLESPACE 表空间名;
修改索引:
使用:ALTER INDEX 索引名 UNUSABLE;(设置索引不可用);ALTER INDEX 索引名 REBUILD ;(重新使用索引);
重新命名索引:ALTER INDEX 旧索引名 RENAME TO 新索引名;
删除索引:DROP INDEX 索引名;
簇:保存表数据的一种可选方式。它由共享相同的数据块组成。即部分表共享公共的列,把同时访问的表在物理 的存储在一起。保存在簇中的表称为簇表,簇表中相关的列被称为簇键。以后再创建增加到簇表中的表时,都需要指定相同的簇键,每个簇键值在簇中仅存储一次。可向簇中创建表,但在向簇表中插入数据之前,必须创建聚簇索引。
对于单独访问且不执行联合查询的不应该创建为索引。簇表中的数据应该经常被链接查询,设计较好的簇键应该包含足够多的唯一值,从而使每个键对应的一组记录都可以恰好填充一个数据块。簇和簇索引可以分别保存在不同的表空间(磁盘上),这样系统就可以并行访问不同介质上的数据。
创建簇:使用CREATE CLUSTER 语句可以创建簇,
CREATE CLUSTER [方案名.]簇名(键列1 数据类型,键列2 数据类型……)
PCTUSED 整数;(每个数据块中使用空间的最小比例)
PCTFREE 整数;(每个数据块中空闲空间的最小比例)
INITRANS 整数;(指定数据块首部中事务表的初始空间)
MAXTRANS 整数;(指定数据块首部中事务表的最大空间)
SIZE 整数;(指定估计的平均簇键及其相关行所需要的字节数)
TABLESPACE 表空间名;(指定簇所属的表空间名)
STORAGE 子句;(指定簇的存储属性)
创建簇表:在CREATE TABLE 语句中使用CLUSTER 创建簇表。可以指定簇表所属的方案,该方案可以与簇所属的方案不同。
例:CREATE TABLE USERMAN.Deptinfo(
Dep_id NUMBER PRIMARY KEY,
DeP_name VARCHAR(100) NOT NULL
)CLUSTER 方案名.簇名(簇键);
使用DBA_CLUSTERS视图查看簇信息:
OWNER | 簇的所有者 | CLUSTER_NAME | 簇的名字 |
TABLESPACE_NAME | 簇所属表空间名 | PCT_FREE | 数据块空闲空间的最小比例 |
PCT_USER | 数据块使用空间的最小比例 | KEY_SIZE | 簇键及其相关行的估算 |
INI_TRANS | 事务的初始大小 | MAX_TRANS | 事务的最大数量 |
INITAL_EXTENT | 初始区间大小,单位为字节 | MIN_EXTENTS | 段中允许包含的最小区间数量 |
NEXT_EXTENT | 下一个区间大小,单位字节 | MAX_ECTENTS | 段中允许包含的最大区间数量 |
PCT_INCREASE | 区间大小增长百分比 | AVG_BLOCKS_PER_KEY | 每个簇所占的用的数据块数量 |
CLUSTER_TYPE | 簇的类型 |
修改簇:拥有ALTER ANY CLUSTER 系统权限的用户才可以修改簇
可以使用ALTER CLUSTER 语句修改簇属性,与创建类似:ALTER CLUSTER 簇名 SIZE……;
修改簇表:可以使用ALTER TABLE 语句修改簇表,但只能添加,修改或删除非簇键列,增删启停完整性约束。
删除簇:可以是使用DROP CLUSTER [方案名.]簇名 [INCLUDING TABLESC(删除簇+簇表) [CASCADE CONSTRAINTS(删除簇+簇表+外键约束)]];
序列管理:
序列号是一个Oracle整数,最多可以有38个数字,作用是自动生成整形数值,作为标识字段的值。
创建序列:在创建序列时,需要定义包含序列名,上升或下降,序列号的间距,Oracle 使用序列生成器来生产序列号。
CREATE SEQUENCE [方案名.]序列名
MINVALUE 1(序列最小值为1,NOMAXVALUE是默认选项,代表没有最小值定义,这时对于递减序列,系统能够产生的最小值是,?10的26次方;对于递增序列,最小值是1。)
NOMAXVALUE(默认选项,代表没有最大值定义,递增Oracle序列,系统能够产生的最大值是10的28次方;对于递减序列,最大值是-1。)
START WITH 1(定义序列的初始值(即产生的第一个值),默认为1)
INCREMENT BY 1(定义步长,省略,则默认为1,出现负值,则代表Oracle序列的值是按照此步长递减的。)
NOCYCLE (表示当序列生成器的值达到限制值后是否循环。CYCLE代表循环,NOCYCLE代表不循环。如果循环,则当递增序列达到最大值时,循环到最小值;最小值为1。对于递减序列达到最小值时,循环到最大值。如果不循环,达到限制值后,继续产生新值就会发生错误。)
CACHE 20(表示高速缓存(序列占内存块的大小)大小为20,默认为20。NOCACHE表示不对序列进行内存缓冲。对序列进行内存缓冲,可以改善序列的性能。 缓存选项会造成数据丢失,当实例异常关闭时。)
修改序列:ALTER SEQUENCE [方案名.]序列名 MINVALUE 1000……对参数的修改;(不能修改序列的初始值)
删除序列:DROP SEQUENCE [方案名.]序列名;
使用序列:所有的序列定义存储在SYSTEM表空间的数据字典中,所以所有序列中是可用的。可以在SQL语句中使用序列生成一个新的序列号。用户会话中的序列号只为该会话使用。序列号的使用独立于表,所以同一序列生成器可以用于一个或多个表。所生成的序列号可用于生成唯一的主键。
序列的新值表示:序列名.NEXTVAL;
CURRVAL:返回序列的当前值。NEXTVAL:序列递增,返回下一值。
SELECT ASD_S.NEXTVAL FROM DUAL;SELECT ASD_S.CURRVAL FROM DUAL;
例:INSERT INTO 方案名.表名(列值……) VALUES(方案名.序列名.NEXTVAL……);
查看序列:SELECT * FROM USER_SEQUENCES/ALL_SEQUENCES/DBA_SEQUENCES;
PL/SQL语言基础:
PL/SQL语言是结构化程序设计语言,块(block)是PL/SQL的最基本结构,所有的PL/SQL程序都是由块组成的。PL/SQL的块是由变量声明(DECLARE,定义常量,变量,游标等),程序代码(BEGIN……END;,编写PL/SQL语句,函数等)和异常处理(EXCEPTION)代码三部分构成,
SET ServerOutput ON;//设置环境变量serveroutput为打开状态,使PL/SQL程序能够在SQL*plus中输出结果,
DECLARE //声明段的开始:声明变量,常量,游标等,
//标识符不区分大小写,不能使用关键字,以字符开头。可以包含数字,下划线,$和#,数据类型与Oracle相同
常量名 constant 数据类型 :=值;
变量名 数据类型 [(宽度):=初始值];
BEGIN //主程序体的开始:赋值,流程控制,SQL语句和游标语句。
赋值语句://赋值操作符:=;
条将语句IF:IF 条件表达式 THEN 执行语句[ELSIF 条件表达式 THEN 执行语句 ] ELSE 执行语句] END IF;//ELSIF和ELSE子句是可选项。
分支语句:CASE 变量 WHEN 表达式 THEN 值 WHEN 表达式 THEN 值 WHEN 表达式 THEN 值 ELSE 值//switch语句同理
循环语句1:LOOP 程序块1 IF 条件表达式 THEN EXIT; END IF; 程序块2 END LOOP;//重复执行循环体的程序块,直到执行EXIT语句,退出循环。
循环语句2:LOOP 程序块1 EXIT WHEN 条件表达式; 程序块2 END LOOP;//执行EXIT WHEN 跳出循环
循环语句3:WHILE 条件表达式 LOOP 程序块 END LOOP;
循环语句4:FOR 循环变量 IN 初始值……终止值(计数器) LOOP 程序块 END LOOP;
EXCEPTION //标记异常处理部分开始
WHER 异常情况名 THEN 异常处理代码
WHER 异常情况名 THEN 异常处理代码
……
WHEN OTHERS THEN 异常处理代码
例:SET SERVEROUTPUT ON;
DECLARE
X NUMBER;
BEGIN
X :='A123'
EXCEPTION
WHEN VALUE_ERROR THEN
DBMS_OUTPUT.PUT_LINE('数据类型错误');
异常情况名 | ORA代码 | SQL代码 | 说明 |
ACCESS_INTO_NULL | ORA-06530 | -6530 | 试图赋值到一个未初始化的对象 |
COLLECTION_IS_NULL | ORA-06531 | -6531 | 试图使用未初始化的嵌入表或变长数组 |
CURSOR_ALREADY_OPEN | ORA-06511 | 试图打开一个以打开的游标 | |
DUP_VAL_ON_INDEX | ORA-06511 | 试图向表中插入数据,但该行数据不符合索引约束 | |
INVALID_CURSOP | ORA-01001 | 试图进行游标操作,但不能打开游标 | |
INVALID_NUMBER | ORA-01722 | 字符向数字转换失败 | |
LOGIN_DENIED | ORA-01017 | 试图和Oracle建立联系,但是不能提供有效的的用户名和口令 | |
NO_DATA_FOUND | ORA-01403 | 100 | 执行SELECT INTO 语句,但没有匹配的行数据 |
NOT_LOGGED_ON | ORA-01012 | 试图进行数据库操作,但没有登录 | |
PROGRAM_ERROR | ORA-06501 | PL/SQL内部错误 | |
ROWTYPE_MISMATCH | ORA-06504 | PL/SQL返回的游标变量和主游标不匹配 | |
SELF_IS_NULL | ORA-30625 | 试图执行对象例程的一个成员方法,但例程为空 | |
STOPAGE_ERROR | ORA-06500 | 存储空间错误 | |
SUBSCRIRT_BEYOND_COUNT | ORA-06533 | 试图通过使用索引来引入嵌入表,但此索引比表中要素的数值还要大 | |
SUBSCRIPT_OUTSIDE_LIMIT | ORA-06532 | 使用的子脚本程序中用到的变长数组的范围已经超过了该数组声明时所定义的范围 | |
SYS_INVALID_ROWID | ORA-01410 | 试图将一个字符串传递给ROWID,但操作失败 | |
TIMEOUT_ON_RESOURCE | ORA-00051 | 当Oracle等待分配资源时,资源已耗尽 | |
TOO_MANY_ROWS | ORA-01422 | 执行一条SELECT INTO语句,但返回了多行数据 | |
VALUE_ERROR | ORA-06502 | 当试图将一个值存进一个变量时,此变量不接受这个值。可能是由于该值太大或变量类型不匹配 | |
ZERO_DIVIDE | ORA-01476 | 试图用零做除数 |
END;//标识主程序体结束
使用DBMS_OUTPUT.PUT_LINE();
'/'命令用于提交执行的PL/SQL语句块。
常用函数:
ABS():返回数字表达式的绝对值.
CEIL():返回大于或等于所给数字表达式的最小整数。向上取整
FLOOR():返回小于或等于所给数字表达式的最大整数。向下取整
POWER();返回给定表达式指定次方的值//POWER(2,3)2的3次。
ROUND():返回数字表达式并四舍五入为指定的长度或精度。//ROUND(123.456,2);
字符型函数:
ASCII();返回字符表达式最左端字符读的ASCII代码值。
LENGTH();返回给定字符串表达式的字符个数。不包括空格。
UPPPER():返回将小写字符数据转换为大写字符表达式。
日期型函数:
SYSDATE():返回当前日期和时间。
TO_CHAR():转换日期为字符串。
LAST_DAY():返回指定日期所在月份的最后一天的日期。
MONTHS_BETWEEN:返回两个日期之间月的数目。
统计函数:
COUNT():函数返回组中项目的数量。
MAX():返回表达式最大值。
MIN():返回表达式最小值。
游标,存储过程和触发器
游标:一种定位并控制结果集的机制,是映射在结果集中的一行数据上的位置实体,游标可以访问结果集中任意一行的数据,将游标放置到某行后,即可对该行数据进行操作。提取数据等。
Oracle游标分为显式游标(需要声明,在使用之前需要打开游标,完成关闭游标)和隐式游标(不需要声明,打开古关闭)。
显示游标:
声明游标:DECLARE CURSOR 游标名 [(参数列表)] IS SELECT 语句;//定义游标名及游标中使用的SELECT语句
打开游标:OPEN 游标名 [(参数列表)];//执行声明游标时定义的SELECT语句,把查询结果装入内存,游标位于结果集的第一条记录位置。
读取数据:FETGH 游标名 INTO 变量列表;//从结果集的游标当前位置处读取数据,执行完成后游标后移一行。
关闭游标:CLOSE 游标名;//释放结果集和游标占用的内存空间
SET SERVEROUTPUT ON;
DECLARE
变量名1 数据类型;
变量名2 数据类型;
CURSOR 游标名(游标参数 参数类型) IS SELECT子句;
BEGIN
OPEN 游标名(参数);
FETCH 游标名 INTO 变量1,变量2;
CLOSE 游标名;
DBMS_OUTPUT.PUT_LINE('输出读取的数据');
END;
/
隐式游标:在SELECT 语句中增加INTO声明,把结果集自动读取到指定的变量中,例
SET SERVEROUTPUT ON;
DECLARE 变量名 模式名.表名.字段名%TYPE;//声明PL/SQL变量可以存储数据库表中的数据,变量应该拥有与表列相同的类型。使用<列名>%TYPE作为数据类型来定义变量,即可使变量拥有与<列名>相同的数据类型。
BEGIN
SELECT 字段 INTO 变量名 FROM 模式名.表名
WHERE 查询条件;
DBMS_OUTPUT>PUT_LINE(变量名);
END;
/
游标属性
Oracle游标有4个属性:%ISOPEN,%FOUND,%NOFOUND和%ROWCOUNT.在程序中使用属性,避免出现错误,提高程序的灵活性。
1,%ISOPEN属性:判断游标是否被打开,打开(TRUE),反之(FALSE);
//IF 游标名%ISOPEN = FALSE THEN OPEN 游标名(参数) END IF;
2,%FOUND属性和%NOTFOUND属性:判断游标所在行是否有效,有效(TRUE),反之(FALSE);
//WHILE 游标名%FOUND LOOP 程序体 END LOOP --如果游标有效则执行循环体
%NOTFOUND属性的使用方法与%FOUND相似,只是功能相反。
3,%ROWCOUNT属性:返回当前位置为止游标的记录行数;
// IF 游标名%ROWCOUNT = 2 THEN EXIT;如果游标读取两条记录,退出PL/SQL块。
游标FOR循环
游标for循环是显式游标的一种快捷方式,当for循环开始时游标被自动打开,每循环一次,系统自动读取游标当前行的数据,退出for循环时,游标自动关闭。
PL/SQL记录:类似于c中的结构体,数据项组的逻辑单元,PL/SQL记录并不保存在数据库中,它与变量一样,保存在内存空间中,使用记录时需要先定义记录的结构,然后声明记录变量。可以把PL/SQL看做是用户自定义的数据类型;定义一次就可以。语法:
定义记录类型:TYPE 记录类型名 IS RECORD(字段声明(字段声明包括字段名 +数据类型) [,字段声明] );
定义记录变量: 记录变量名 记录变量类型名 ;
在声明记录中数据项类型时,可以直接定义,也可以使用“方案名.表名.列名%TYPE”来表示列中的类型。可以使用:记录名.字段名;的方式访问记录中的字段。如果要声明的记录与某个表或视图结构完全相同,可以直接使用%ROWTYPE属性来定义记录变量。变量名 表名%ROWTYPE;
记录和游标结合实例:
SET SERVEROUTPUT ON;
DECLARE
TYPE USER_TYPE IS RECORD( USERID USERS.USERID%TYPE,USERNAME USERS.USERNAME%TYPE);
VARUSER USER_TYPE;
CURSOR MYCUR(VARTYPE NUMBER ) IS SELECT USERID,USERNAME FROM USERS WHERE USERID = USERID;
BEGIN
IF MYCUR%ISOPEN = FALSE THEN OPEN MYCUR(1); END IF;
LOOP
FETCH MYCUR INTO VARUSER; EXIT WHEN MYCUR%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(VARUSER.USERID||VARUSER.USERNAME);
END LOOP;
CLOSE MYCUR; END; /
典型游标for循环需要对游标进行声明,然后才可以使用,语法:
DECLARE
CURSOR 游标名 IS SELECT 子句
FOR 记录名 IN 游标名 LOOP
语句;
END LOOP; END; /
可以直接使用select子句代替游标名,带子查询的游标for循:FOR 记录名 IN (SELECT 子句) LOOP 语句1;LOOP END;
引用游标
引用游标是一种动态游标,不依赖指定的select语句,可以与不同的查询语句相关联,也可以使用游标变量。引用游标有两种类型,强型游标(返回指定的结果集)和弱型游标(没有返回类型)。例(强型游标)
DECLARE
TYPE CURSOR_TYPE IS REF CURSOR RETURN RETURN_TYPE;
--指定引用游标类型CURSOR_TYPE和返回结果类型RETURN_TYPE
CURSOR_VAR CURSOR_TYPE;--定义引用游标变量
SING_VAR RETURN_TYPE; CURSORS 方案名.表名%ROWTYPE--定义返回结果变量和游标查询结果集的变量
OPEN CURSOR_VAR FOR SELECT语句;--打开并查询游标变量;可以添加条件语句,关联不同的SQL语句;
LOOP FETCH CURSOR_VAR INTO 记录变量;--获取游标中的数据;
EXIT WHEN CURSOR%NOTFOUND;//循环判断
……--//处理得到的数据;
END LOOP;
CLOSE CURSOR_VAR;
在弱类型游标中可以关联到不同的sql语句,甚至可以访问不同的表。通过条件语句实现;
管理游标结果集
在定义游标时,可以使用指定允许更新和删除游标结果集中的行,从而对游标集进行管理;修改、删除游标集中的行
修改游标结果集中的行:定义游标时可以使用FOR UODATE 子句指定可以更新的行;语法
DECLARE CURSOR 游标名[(参数列表)] IS SELECT 语句 FOR UPDATE OF 可以更新的列名;
在程序体中的游标操作中语法:UPDATE 表名 SET 更新子句 WHERE CURRENT OF 游标名;
删除游标结果集中的行:同样定义游标时指定允许更新,在操作中:DELETE 表名 WHERE CURRENT OF 游标名;
例:DECLARE CURSOR 游标名(参数) IS SELECT 子句 FOR UPDATE OD 更新的列名;
BEGIN FOR TEMP(局部记录变量) IN 游标名(参数) LOOP
UPDATE 表名 SET 更新子句 WHERE CURRENT OF 游标名;
END LOOP;
END; /
存储过程
以一种形式存储的用户程序,需要人为的执行调用;将需要的程序编写好存储起来。PL/SQL有三种存储过程:过程(由过程名,参数,程序体构成),函数(有返回值的过程),程序包(一组相关的PL/SQL过程和函数,由包名,说明部分和包体组成)。
过程:使用CREATE PROCEDURE 语句创建;语法:
CREATE [OR REPLACE] PROCEDURE 过程名
[(参数列表)] IS | AS --参数声明格式:参数名 [IN| OUT | IN OUT] 数据类型 [:=初始值]
//IN 表示传入的值,OUT表示传出,IN OUT 皆具有
[局部变量声明] --局部变量只在过程体有效;
BEGIN 过程体 END [过程名] ;/
例:CREATE OR REPLACE PROCEDURE 过程名(参数名 IN NUMBER) AS
BEGIN SQL语句 END; /
EXECUTE [方案名.]过程名(参数);- -调用过程;
DROP PROCEDURE [方案名.]过程名; - -删除过程;
函数:使用 CREATE FUNCTION语句创建函数;语法:
CREATE [OR REPLACE] FUNCTION 函数名[(参数列表)]
[RETURN 函数返回值数据类型 ]IS | AS [局部变量声明]//与过程不一样的地方
BEGIN 函数体 RETURN 函数值 END [过程名];
在程序中可以调用函数,使用DROP FUNCTION 函数名;可以删除函数;
例 CREATE FUNCTION 函数名(参数) RETURN 返回值类型 AS 局部变量声明
BEGIN SQL语句 RETURN 返回值 ; END; /
程序包:PL/SQL中程序包是由包的说明部分和包体组成的。
包的说明部分语法: CREATE [OR REPLACE] PACKAGE 程序包名 IS | AS [声明部分] END [程序包名];
//声明部分可以包含类型,变量,函数,游标的说明即函数过程的对应声明部分
包体部分语法:CREATE PACKAGE BODY 程序包名 IS |AS [声明部分][过程图][函数体][初始化部分] END [程序包名];
调用程序包中的过程与函数: 方案名.程序包名.过程名/函数名;
删除程序包体 :DROP PACKAGE BODY 程序包名;
删除程序包说明部分:DROP PACKAGE 程序包名;
包体例:CREATE PACKAGE BODY 程序包名 IS
PROCEDURE 过程名(参数名 IN NUMBER) AS BEGIN SQL语句 END;
FUNCTION 函数名(参数) RETURN 返回值类型 AS 局部变量声明 BEGIN SQL语句 RETURN 返回值 ; END;
END 程序包名;/
包说明例:CREATE [OR REPLACE] PACKAGE 程序包名 IS
PROCEDURE 过程名(参数名 IN NUMBER);
FUNCTION 函数名(参数) RETURN 返回值类型;
触发器
是一种特殊的存储过程,执行是由事件触发的,而普通存储过程是由命令调用执行的。触发器的不同由触发事件决定;
触发事件:
DML语句事件:执行INSERT,UPDATE,DELETE 语句时触发的事件(对数据的操作)
DDL语句事件:执行CREATE,ALTER,DROP语句时触发的事件。(对对象的操作)
数据库事件:执行STARTUP(启动),SHUTDOWN(关闭),LOGON,LOGOFF等操作时触发的事件。
系统错误:当Oracle数据库系统出现错误时触发的事件。
触发时间:BEFORE:在指定的事件之前执行的触发器,AFTER: 在指定的事件之后执行的触发器。
触发级别:行触发:对触发事件影响的每一行都执行触发器。语句触发:对于触发事件只能执行触发器一次。
创建触发器(使用CREATE TRIGGER语句):
1,创建语句触发:CREATE [OR REPLACE] TRIGGER 触发器名 [BEFOER |AFTER] 触发事件 ON 表名 | 视图名 PL/SQL程序体;
触发事件可以是DML语句事件,PL/SQL程序体是触发器触发时要执行的程序包。OR REPLACE 表示存在就更改,例
CREATE TABLE LIBSYS.TEST( ID INTEGER, NAME VARCHAR2(50) );
CREATE TABLE LIBSYS.LOGTABLE( LOG_DATE DATE, ACTION VARCHAR2(50) );
CREATE OR REPLACE TRIGGER LIBSYS.TRIGGERS - -创建触发器triggers
AFTER INSERT OR UPDATE OR DELETE ON LIBSYS.TEST - - 指定表TEST的触发条件为 INSERT,UPDATE,DELETE事件
DECLARE
LOG_ACTION VARCHAR2(50);
BEGIN
IF INSERTING THEN LOG_ACTION :='iNSERT'; - - INSERTING 表示执行插入操作
ELSIF UPDATING THEN LOG_ACTION := 'UPDATE'; - -UPDATING 表示执行更新操作
ELSIF DELETING THEN LOG_ACTION :='DELETE'; - - SELETING 表示执行删除操作
ELSE DBMS_OUTPUT.PUT_LINE('..');
END IF;
INSERT INTO LIBSYS.LOGTABLE(LOG_DATE,ACTION) VALUES(SYSDATE,LOG_ACTION); - -触发器触发后对表的操作
END;
/
INSERT INTO LIBSYS.TEST VALUES(1,'INSERT');UPDATE TEST SET NAME = 'UPDATE' ;DELETE FROM TEST;
COMMIT;
创建test和logtable表,表test为基表,logtable表用于记录test表的操作,在test表中执行DML语句时激活语句触发器triggers。
Oracle数据库里面有DCL语句(Data Control Language),一共有四个关键字,commit、rollback、grant和revoke。它们执行的时候,你都不会有什么感觉。commit在数据库编程的时候很常用,当你执行DML操作时,数据库并不会立刻修改表中数据,这时你需要commit,数据库中的数据就立刻修改了,如果在没有commit之前,就算你把整个表中数据都删了,如果rollback的话,数据依然能够还原。oracle的commit就是提交数据(这里是释放锁不是锁表),在未提交前你前面的操作更新的都是内存,没有更新到物理文件中。执行commit从用户角度讲就是更新到物理文件了,事实上commit时还没有写date file,而是记录了redo log file,要从内存写到data物理文件,需要触发检查点,由DBWR这个后台进程来写,锁有很多种,一般我们关注的都是DML操作产生的,比如insert,delete,update,select...for update都会同时触发表级锁和行级锁 ,insert以后commit之前是锁表的状态,其他事务无法对该表进行操作。DML需要提交(insert、update、delete) DDL会自动提交(create、alter ...)
2.创建行触发器:行触发器在受影响的每一行上执行。FOR EACH ROW表示当前触发器为行触发器
语法:CREATE [OR REPLACE] TRIGGER 触发器名 [BEFORE | AFTER ] 触发事件 ON 表名|视图名 FOR EACH ROW PL/SQL程序体;
例:CREATE OR REPLACE TRIGGER MYTRIGGER AFTER INSERT ON TEST
FOR EACH ROW
BEGIN
INSERT INTO LOGTABLE VALUES(SYSDATE,'cha ru');
END;
/
:NEW和:OLD:表示两个虚拟的表,:NEW表示执行DML语句后的新表,:OLD表示执行DML语句之前的的旧表,可以访问触发器执行前后的表的数据。
3,创建INSTEAD OF 触发器:CREATE[OR REPLACE] TRIGGER 触发器名 INSTEAD OF 触发事件 ON 表名 | 视图名 PL/SQL程序体;
是面向更新的触发器,可以利用:new和:old实现更新视图通过触发器更新基表的操作。
4,创建LOGON和LOGOFF触发器:LOGON在用户登录时被触发,LOGOFF在用户注销时被触发。
语法:CREATE [OR REPLACE] TRIGGER 触发器名 AFTER LOGON/LOGOFF ON 表名 | 视图名 PL/SQL程序体;
启用和禁用触发器:
禁用:ALTER TRIGGER 触发器名 DISABLE; ALTER TABLE 触发器名 DISABLE ALL TRIGGER(禁用表上全部触发器)
启用:ALTER TRIGGER 触发器名 ENABLE; ALTER TABLE 触发器名 ENABLE ALL TRIGGER(启用表上全部触发器)
编译触发器:
查错:SELECT * FROM DBA_ERRORS WHERETYPR = 'TRIGGER';
重新编译:ALTER TRIGGER 触发器名 COMPILE;
删除触发器:DROP TRIGGER 触发器名;