• 第01篇_Oracle

    第01章_Oracle概述

    第一节 Oracle简介

    1. 什么是Oracle?

    Oracle是美国甲骨文公司开发的一款关系型数据库管理系统(RDBMS),是市场上最流行的商业数据库之一。

     

    第二节 安装部署

    1. Windows版本安装

    详情见“部署文档”目录下相关文档说明!

     

    2. Linux版本安装

    详情见“部署文档”目录下相关文档说明!

     

    3. 配置文件

     

    4. 监听程序

    Oracle监听程序用于监听远程连接,在远程访问数据库时必不可少。

     

     

    第三节 客户端

    1. 命令行客户端

     

    2. 其它客户端

     

     

    第四节 体系结构

    29张图看清Oracle 19c 技术架构 - 墨天轮 (modb.pro)

     

    1. 磁盘文件

    Oracle数据库在运行过程中使用的一些文件如下:

     

     

    2. 逻辑结构

    Oracle逻辑结构从大到小依次分为:集群 -> 实例 -> 数据库 -> 用户/表空间/模式 -> 段 -> 区 -> 数据块等。

     

     

    3. 内存分区

    Oracle占用的内存大致可分为系统全局区(SGA)、进程全局区(PGA)、用户全局区(UGA):

     

     

    4. 主要服务/进程

    在Windows机器上,Oracle实例主要的服务如下(实例名为ORCL01):

     

    在Linux下,Oracle实例主要的进程如下(实例名为pdborcl):

    其它进程可通过ps -ef | grep oracleps -ef | grep ora_等查看。

    注意:

    1. 在专用服务器模式,客户端进程和服务端进程一一对应;在共享服务器模式,一个服务端进程可同时服务多个客户端进程。

    2. 进程监控(PMON)进程、系统监控(SMON)进程、数据写入(DBWR)进程、日志写入(LGWR)进程、检查点(CKPT)进程是必须启动的,否则实例无法启动成功。

     

     

    第五节 启动和关闭流程

    启动或关闭数据库需要以SYSDBA/SYSOPER权限登录:

     

    1. 三阶段启动

    Oracle数据库启动流程分为三个阶段:

     

    2. 转换启动阶段

    在进行某些特定的管理和维护操作时,需要处于特定的阶段:

    启动阶段可执行的操作
    nomount创建新的数据库、重建控制文件等
    mount重命名数据文件、添加删除或重命名重做日志文件、执行数据库的完全恢复操作、改变数据库的归档模式等
    open业务数据的增删改查等

    转换启动阶段命令如下:

     

    3. 四种关闭模式

    关闭Oracle数据库使用shutdown命令,它有四种模式:

     

    4. 会话受限状态

    在启动数据库时,如果加上restrict参数,将会进入受限状态,只允许具有restricted session或者create session权限的用户访问数据库。

    通过如下命令可进行受限状态的切换:

    若是启动数据库的时候设置为受限状态,在完成管理工作后,需要将数据库恢复为非受限状态:

     

     

    5. 读写/只读状态

    正常启动模式下,数据库默认处于读写状态,但有时候也需要将数据库设置为只读状态,保证用户只能查询数据,但不能以任何方式对数据库对象进行修改。

     

     

    6. 静默/挂起状态

    静默状态和挂起状态是两种特殊的数据库状态,利用这两种数据库状态,数据库管理员可以完成一些特殊的管理和维护操作。

    挂起状态与静默状态的区别是:挂起状态并不禁止非管理员用户进行数据库操作,只是暂时停止所有用户的I/O操作。

     

     

    第02章_实例管理

    第一节 数据库

    1. 查看数据库信息

     

    2. 新建/销毁数据库

     

    3. 打开/切换数据库

    在Oracle12c及之后,一个实例可以创建多个PDB数据库,打开和切换方式如下:

    注意:

    1. 在Oracle中,无法使用use xxx语法来切换数据库,必须执行 alter session 命令。

     

     

    4. 数据库配置参数

    常用数据库参数如下:

    参数名称参数描述
    sga_max_size指定 SGA 的最大大小
    sga_target指定 SGA 的目标大小
    pga_aggregate_target指定 PGA 的目标大小
    db_cache_size指定数据库缓存大小
    shared_pool_size指定共享池大小
    processes指定可以同时运行的用户进程数
    sessions指定可以同时连接到数据库的用户数
    undo_retention指定事务回滚数据保留时间

     

     

    第二节 用户

    1. 查询用户信息

    注:在创建实例时,会创建若干个内置用户,它们分别有不同的用途。

    • sys:权限最大的超级用户,相当于SQL server中的sa帐户,只能以系统管理员(sysdba)或系统操作员(sysoper)的权限登录。

    • system:通常用来创建一些用于查看管理信息的表或视图,权限比sys小,登陆时以normal权限登陆。

    • scott:Oracle提供的示例用户之一,为普通用户,默认密码为tiger。

     

    2. 创建新用户

     

    3. 删除或锁定用户

     

    4. 修改用户信息

     

    第三节 表空间

    1. 查询表空间信息

     

    2. 创建或删除表空间

     

    3. 修改表空间

     

     

    第四节 角色

    角色就是一组权限或者说是权限的集合。用户可以给角色赋予指定的权限,然后将角色赋给相应的用户,如:

    注意:

    1. SYSDBA角色在实例启动后就可以使用,可用其加载和打开数据,而DBA角色只有在数据库完全打开才有意义。

     

    1. 查询角色信息

     

    2. 创建或删除角色

     

    3. 使用角色

     

     

    第五节 权限

    权限指的是执行特定命令或访问数据库对象的权利,对数据库的安全性(系统安全性、数据安全性)有着至关重要的作用,可分为:

     

    1. 查询权限信息

     

    2. 授权与回收

     

    3. 权限的传递

    默认情况下,Oracle中的权限是不能传递的,如A授权给B,B不能再将权限授予给C,如需允许传递,需加如下一些选项:

     

     

    第六节 事务

    事务是一组独立不可分割的工作单元,事务中的操作要么全部执行,要么都不执行

     

    1.事务的四大特性(ACID)

     

     

    2. 事务的隔离级别

    注意:

    1. Oracle仅支持 读已提交(默认) 和 串行化 这两个事务隔离级别,而Mysql的InnoDB引擎都支持,默认为Repeatable Read

    2. 不可重复读一般因并发事务的UPDATE产生,幻读是不可重复读的一种特例,一般因并发事务的DELETEINSERT产生。

     

     

    3. 事务的开始和结束

    在Oracle中,默认是自动开启事务的,事务一般开始于session中的第一条DML语句,直到出现下列情形之一则提交或回滚事务:

    注意:

    1. Mysql中,可用START TRANSACTIONBEGIN 手动开启事务。

     

    4. 事务控制命令

     

     

    第七节 锁

    1. 锁的分类

    用于多事务场景下对共享资源的访问,以保证数据库的完整性和一致性。

    注意:

    1. SELECT语句(无for update等)不需要任何锁,即使记录被锁定,依然可以执行(oracle是用到undo的内容进行一致性读来实现的)。

    2. Oracle中,每行数据都有标志位来表示该行数据是否被锁定;而在MySql(InnoDB)中,行锁是加在索引上的,如果没有索引,将通过隐藏的聚集索引来对记录加锁。

     

     

    2. DML锁详解

    DML锁(数据锁)主要包括TM锁TX锁,其中TM锁称为表级锁(意向锁),TX锁称为行级锁(事务锁)。当Oracle执行INSERT/DELETE/ UPDATE/SELECT FOR UPDATE等DML语句时,首先申请表级锁,当表级锁获得后,才会申请行级锁。

     

    1) 表级锁

    不同类型的SQL语句需要申请不同类型的表级锁,简述如下:

    锁模式锁类型锁描述需申请该锁的SQL语句lock语法
    0NONE不存在锁  
    1NULL空锁(无冲突)SELECT 
    2RS行级共享锁 lock TABLE in row share mode
    lock TABLE in share update mode
    3RX行级排他锁INSERT、DELETE、UPDATE、SELECT FOR UPDATElock TABLE in row exclusive mode
    4S共享锁CREATE INDEX、CREATE VIEWlock TABLE in share mode
    5SRX共享行级排它锁 lock TABLE share row exclusive mode
    6X排它锁ALTER TABLE、DROP INDEX、TRUNCATE TABLE、lock TABLE in exclusive mode

    扩展:

    1. LOCK TABLE 语句后可接 NO WAIT,如果获取不到锁,将不会等待而是直接返回,放弃执行当前指令并抛出一个错误。

    2. LOCK TABLE 语句后也可接 WAIT num,表示最多等待多少秒。

     

    当表级锁相互兼容时,才可以加锁成功

     NULLRSRXSSRXX
    NULL------
    RS-----X
    RX---XXX
    S--X-XX
    SRX--XXXX
    X-XXXXX

    当出现不兼容时,就直接进入等待,而无需每次都逐行检查锁标志,大大提高了系统的效率。

     

    2) 行级锁

    行级锁只有排它锁(X锁)一种,作用是防止两个事务同时修改相同的数据行。

     

    3. 锁存器机制

    1) 锁存器机制简介

    锁存器(latch)用来保护对Oracle内存结构的访问,是一种特殊类型的锁,采用低层次的序列化技术,用以保护SGA中的共享数据结构。Oracle通过锁存器机制保证没有任何两个进程可以同时访问同一块数据结构。

    Latch按请求方式分为两种类型:

    DBA无法对 Latch 直接控制,也无相关的初始化参数可以调配。从性能优化的角度看,DBA需要注意锁存器的争用情况,如果 Latch 存在竞争,表明SGA的一部分正在经历不正常的资源使用。

     

    2) 查询锁存器争用

    视图v$latch记录了等待型和立即型两类锁存器的活动。以下查询可以检查latch争用情况,锁存器是否存在等待。

    另外通过v$system_event检查系统事件latch free是否出现来判断是否存在锁存器争用。

    以下统计latch争用导致的各类未命中:

     

     

    4. 锁的查询

    1) 锁相关的数据字典

     

    2) DML锁查询

    日常开发中,最常用的为DML锁的查询:

    会话ID会话序列号会话进程号所属用户客户端被锁对象被锁对象类型锁模式被锁时间(S)
    11033843417280KRMPHYX-PCSTK_CALENDARTABLERX52

     

    3) 从会话角度查询

     

    4)从被锁对象角度查询

     

     

    5. 释放锁

    当事务执行COMMIT或ROLLBACK操作,持有的锁都会被释放。此外,也可以强制释放锁:

     

    6. 锁分析案例

    1) 数据库连接与会话信息

     

    2) TM-S锁与TX-X锁

     

    3) TM-RS锁与TX-X锁

     

    4) TM-RX锁和TX-X锁

     

    5)TM-SRX锁和TX-X锁

     

    6) TM-X锁和TX-X锁

     

    7) for update和TX-X锁

     

    8) 死锁模拟

    当程序对所做的修改进行提交(Commit)或回滚(Rollback)后,锁住的资源便会得到释放,从而允许其他用户进行操作。如果两个事务,分别锁定一部分数据,而都在等待对方释放锁才能完成事务操作,这种情况下就会发生死锁。

    当Oracle检测到死锁时,中断并回滚执行死锁的相关语句,报[ORA-00060: 等待资源时检测到死锁]的死锁错误并记录在警告日志文件alert_<sid>.log中,同时会在user_dump_dest下产生一个跟踪文件,详细描述死锁的相关信息。

    死锁模拟如下:

    发生改错误后,可通过下面步骤来解决:

     

     

    第八节 数据字典

    数据字典用于存储和查看数据库的元数据信息,主要包含内部表(X$)、元数据表(xxx$)、元数据视图(DBA_xxx/ALL_xxx/USER_xxx)、动态性能视图(V$/GV$)等。

     

    1. 内部表

    内部表用于跟踪数据库的内部信息,是数据库的运行基础,在数据库启动时动态创建,且加密命名,用户无需过多关注。

     

    2. 元数据表

    元数据表用于存储普通表、索引、约束等数据库对象的结构信息,用户无法直接访问,执行DDL操作会对其进行修改,相应的,通过Oracle提供的工具包也可反向生成DDL语句。

     

    3. 元数据视图

    由于元数据表无法直接访问(防止用户恶意修改),因此提供了一系列的元数据视图,主要分为三类:

    以DBA_XXX为例,常用的元数据视图如下:

    数据字典名称说明
    dba_objects数据库中所有的对象
    dba_tablespaces表空间信息
    dba_segments段信息
    dba_extents区信息
    dba_users用户信息
    dba_tables数据表信息
    dba_views视图信息
    dba_tab_columns数据表和视图的列信息
    dba_indexs索引信息
    dba_ind_columns索引列信息
    dba_constraints约束信息
    dba_sequences序列信息
    dba_triggers触发器信息
    dba_source存储过程信息
    dba_data_files数据库文件的信息
    dba_synonyms同义词的信息
    dba_tab_grants/privs对象授权的信息

     

     

    4. 动态性能视图

    动态性能视图可以查询数据库运行时信息和统计数据,大部分是实时更新的,主要分为如下四类:

    动态性能视图的定义语句可通过如下SQL查询,如:

     

    常用的动态性能视图如下:

    数据字典名称说 明
    v$database描述关于数据库的相关信息
    v$datafile数据库使用的数据文件信息
    v$log从控制文件中提取有关重做日志组的信息
    v$logfile有关实例重置日志组文件名及其位置的信息
    v$archived_log记录归档日志文件的基本信息
    v$archived_dest记录归档日志文件的路径信息
    v$controlfile描述控制文件的相关信息
    v$instance记录实例的基本信息
    v$system_parameter显示实例当前有效的参数信息
    v$sga显示实例的 SGA 区的大小
    v$sgastat统计 SGA 使用情况的信息
    v$parameter记录初始化参数文件中所有项的值
    v$lock通过访问数据库会话,设置对象锁的所有信息
    v$session有关会话的信息
    v$sqltext记录 SQL 语句的详细信息
    v$bgprocess显示后台进程信息
    v$process当前进程的信息

    第九节 回收站

    回收站是一个数据字典表,保存着最近被删除的对象信息,在原数据没有被覆盖的前提下,能够通过闪回机制恢复被删除的对象。

     

    1. 开启和关闭回收站

     

    2. 查看回收站对象

     

    3. 还原回收站对象

    注意:

    1. “回收站-闪回”机制只适用于非系统表空间和本地管理的表空间,而系统表空间的对象会直接删除,而不是放入回收站。

    2. 该机制不适用于对象的外键约束以及基于该表的物化视图等特殊场景,这需要DBA手工重建。

    3. 对象能否恢复成功,取决于对象空间是否被覆盖重用,因此,回收站不是一个百分百保险的机制。

     

    4. 清空回收站

     

     

    第十节 备份恢复

    1. 逻辑备份-EXP/IMP

    EXP和IMP是客户端工具程序,可在客户端或服务端执行,一般用于Oracle10g之前的数据库备份/恢复。

     

    1) 备份数据库

    注意:

    1. Oracle新建的空表不占存储空间,不会分配extent/segment,逻辑备份可能无法导出。如下SQL可查询未分配extent的表:

    1. 对于未分配extent的表,需要手动执行如下SQL分配后才可导出。

     

    2) 恢复数据库

     

    3) 增量备份方案

    增量备份是一种常用的数据库备份方案,它只能对整个数据库来实施,并且必须作为SYSTEM来导出。增量导出包括三种类型:

    数据库管理员可以排定一个备份日程表,用数据导出的三个不同方式合理高效的完成。

    例如数据库的增量备份任务可以做如下安排:   星期一:完全备份(A)   星期二:增量导出(B)   星期三:增量导出(C)   星期四:增量导出(D)   星期五:累计导出(E)   星期六:增量导出(F)   星期日:增量导出(G) 如果在星期日,数据库遭到意外破坏,数据库管理员可按一下步骤来回复数据库:   第一步:用命令CREATE DATABASE重新生成数据库结构;   第二步:创建一个足够大的附加回滚。   第三步:完全增量导入A:imp system/manager inctype=RESTOREFULL=y FILE=A   第四步:累计增量导入E:imp system/manager inctype=RESTOREFULL=Y FILE=E   第五步:最近增量导入F:imp system/manager inctype=RESTOREFULL=Y FILE=F

     

     

    2. EXPDP/IMPDP逻辑备份

    EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLE服务端使用,不能在客户端使用(但可在客户端发起,服务端执行)。

     

    1) 创建逻辑目录

    使用EXPDP/IMPDP前必须先创建逻辑目录系统目录,并进行授权:

     

    2) 备份数据库

    注意:

    1. EXPDP支持加载参数文件,防止命令行过长,如:expdp user/pwd parfile=xxx.par logfile=a.log。

    2. EXPDP支持NETWORK_LINK导出远程数据库,如:expdp network_link=dl_monitor dumpfile=network_monitor.dmp。

    3. EXPDP支持交互式窗口命令,具体详情参考官方文档。

     

    3) 恢复数据库

     

     

    3. 物理备份-热备份

    1) 热备份简介

    热备份也叫联机备份,它是指数据库处于open状态下,对数据库的数据文件、控制文件、参数文件、密码文件等进行一系列备份操作,它要求数据库处在归档模式下。

    由于数据文件处于备份状态时重做日志后台进程要将这些文件的所有的变化数据块写到重做日志文件中,这对重做日志缓冲区和重做日志文件的压力都增大了,所以需要注意几下几点:

    热备份的优点:

    热备份的不足:

     

    2) 热备份流程

    注:

    1. 临时表空间的数据文件、日志文件不需要备份。

     

     

    4. 物理备份-冷备份

    1) 冷备份简介

    冷备份也叫脱机备份,其在关闭数据库后,将关键性文件拷贝到另外的位置,是最快和最安全的方法。注意其必须拷贝全部文件的备份,包括参数文件、所有控制文件、所有数据文件、所有联机重做日志文件。

    冷备份的优点:

    冷备份的不足:

    2) 冷备份流程

     

    3) 脱机恢复

    数据库恢复就是把数据库中备份出来的数据重新还原给原来的数据库。数据库恢复技术分为完全恢复和不完全恢复。完全恢复是指把数据库恢复到数据库失败时的数据库状态,不完全恢复是指将数据库恢复到数据库失败前的某一时刻的数据库状态。

    脱机恢复的步骤分为三步:

     

     

    第03章_数据对象

    第一节 数据类型

    1. 字符型

    数据类型说明
    CHAR(size)定长字符串,不足补空格,可存储1~2000个字节或字符
    VARCHAR2(size)变长字符串,可存储1~4000个字节或字符
    NCHAR/NVARCHAR2(size)以 Unicode 国际字符集存储的字符串

    注意:

    1. 定长字符串在实际存储数据时,会在右边补足空格,虽然浪费空间,但是存储效率更高,且能减少行迁移现象发生。

    2. 字符串类型可指定按字节字符计数,如CHAR(2 BYTE)、VARCHAR2(8 CHAR),默认值由NLS_LENGTH_SEMANTICS参数确定。

    3. 不要使用VARCHAR类型,虽然目前是VARCHAR2的同义词,但是后续版本可能修改为不同的语义。

     

    2. 数值型

    数据类型说明
    NUMBER(p,s)精确数值类型。Precison表示有效数字位数,最大为38位;Scale表示从小数点到最低有效数字的位数(正数时)或从最大有效数字到小数点的位数(负数时),取值范围为-84~127。
    INTEGERNUMBER的子类型,等同于NUMBER(38,0),用来存储整数。若插入、更新的数值有小数,则会被四舍五入。
    FLOAT(n)NUMBER的子类型,存储的精度是按二进制计算的,精度范围为二进制的1~126,在转化为十进制时需要乘以0.30103
    INT等同于NUMBER(22),用于兼容其它数据库,与之类似的还有decimal、numeric等。

    注意:

    1. 当整数部分位数大于 p-s 时,就会报错;当小数部分位数小于 s 时,就会舍入;

    2. 当 s 为负数时,将对小数点左 s 个数字进行舍入;

    3. 当 s > p 时, p表示小数点后第s位向左最多可以有多少位数字,如果大于p则报错,小数点后s位向右的数字被舍入。

     

    3. 日期/时间

    数据类型说明
    DATE包含年月日时分秒,固定按7个字节存储,默认格式由 NLS_DATE_FORMAT 或 NLS_TERRITORY 确定。
    TIMESTAMP(p)包含年月日时分秒小数秒,默认格式由 NLS_TIMESTAMP_FORMAT 或 NLS_TERRITORY 确定。
    其中 p 表示小数秒的精度,默认为 6 位,大小为7或11个字节。
    TIMESTAMP(p) WITH TIME ZONE时区的TIMESTAMP,大小固定为13个字节,默认格式由 NLS_TIMESTAMP_TZ_FORMAT 参数确定。
    TIMESTAMP(p) WITH LOCAL TIME ZONE以数据库时区存储的TIMESTAMP,但在查询时转换为会话时区。默认格式由 NLS_DATE_FORMAT 或 NLS_TERRITORY 确定,大小为7或11个字节。

     

    4. 其它数据类型

    数据类型说明
    LONG变长字符序列,最大长度2GB,不能建立索引和检索等,限制较多,推荐使用CBLOB。
    CBLOB存储字符串数据,最大4GB。
    BLOB存储二进制数据,最大4GB。
    BFILE用来把非结构化的二进制数据存储在数据库以外的操作系统文件中,大小与操作系统有关。
    RAW / LONG RAW长度大小为字节的原始二进制数据,最多可以存储2000/2GB字节的信息。

     

     

    第二节 数据表

    1. 定义表结构

     

    2. 查询和删除表结构

     

    3. 修改表结构

     

     

    第三节 约束

    约束是ORACLE提供的自动保持数据库完整性的一种方法,它通过限制字段中数据、记录中数据和表之间的数据来保证数据的完整性。

     

    1. 主键约束(Primary Key)

    主键约束用于定义数据表的主键,主键是表记录的唯一标识符,其值不能为NULL,也不能重复,以此来保证实体的完整性。

    注意:

    1. 约束名称子句 constraint pk_sid 可以省略,将会自动生成名称,其它约束也类似。

    2. 表中主键只能有一个,但可以由多个列构成。如:primary key(学号,科目编号)。

    3. 在创建主键时,如果主键字段不存在索引,则会生成一条唯一索引,在删除主键时,也会一并删除。

    4. 在创建主键时,如果主键字段存在索引(不管是否唯一),则不会再生成新的索引,在删除主键时,该索引依然保留。

     

    2. 唯一约束(Unique)

    唯一性约束用于指定一个或者多个列的组合值具有唯一性,以防止在列中输入重复的值。注意:使用唯一性约束的列允许空值

     

    3. 非空约束(Not Null)

    非空约束用于确保列不能为NULL。如果在列上定义了NOT NULL约束,那么当插入数据时,必须为该列提供数据;当更新列数据时,不能将其值设置为NULL。

     

    4. 默认值约束(Default)

    默认值约束用于指定列的默认值,在插入数据且没有输入该列的值时生效。可防止意外的空值输入。

     

    5. 检查约束(Check)

    检查约束对输入列或者整个表中的值设置检查条件,以限制输入值,保证数据库数据的完整性。

     

    6. 外键约束(Foreign Key)

    外键用于建立和加强两个表数据之间链接的一列或多列。外键约束是唯一涉及两个表关系的约束。

    注意:

    1. 设置外键约束时主表的字段必须是主键列或唯一列。

    2. 主从表中相应字段必须是同一数据类型。

    3. 从表中外键字段的值必须来自主表中的相应字段的值,或者为NULL值。

     

    7. 删除或禁用约束

     

     

    第三节 索引

    索引可以提升特定场景下查询的速度,Oracle支持B树索引位图索引反向索引基于函数的索引等多种索引。

    索引建立时应注意如下一些事项:

     

    1. 创建索引

     

    2. 查看和删除索引

     

    3. 索引合并与重建

     

     

    第四节 视图

    视图是一个逻辑数据结构,不存储实际数据,只存在它的定义语句。它可以简化查询语句的书写,进行权限的隔离,屏蔽基表的差异等。

     

    1. 定义视图

     

    2. 查看和删除视图

     

    3. 通过视图修改数据

     

     

    第五节 物化视图

    1. 物化视图简介

    物化视图是一种真实存在的,占实际空间的数据库对象,一般用来生成基于数据表的汇总表,可以提高数据查询的效率,并且对数据有一定的保护作用。

    注意:

    1. 物化视图可以查询表、视图以及其它的物化视图。当基表中的数据发生变化时,需要对物化视图进行刷新

    2. 一般来说,物化视图是只读的,如果想对其进行修改,必须使用高级复制功能。

    3. 物化视图是真实存在的,故可以为其创建索引,以及分区等操作。

     

     

    2. 创建物化视图

    创建物化视图的语法格式如下,后续对各部分进行详细说明。

    1) 创建时机

    2) 刷新方式

    4) 识别键

    5) 查询重写

    查询重写指当对物化视图的基表进行查询时,Oracle会自动判断能否通过查询物化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好的物化视图中读取数据。

    6) ON PREBUILD TABLE

    在创建物化视图时指明 ON PREBUILD TABLE 语句,可以将物化视图建立在一个已经存在的表上。

    这种情况下,物化视图和表必须同名。当删除物化视图时,不会删除同名的表。

    这种物化视图的查询重写要求参数 QUERY_REWRITE_INTEGERITY 必须设置为 trusted 或者 stale_tolerated 。

    7) ORDER BY

    在建立物化视图的时候可以指定ORDER BY语句,使生成的数据按照一定的顺序进行保存。不过这个语句不会写入物化视图的定义中,而且对以后的刷新也无效。

    扩展:物化视图日志

    1. Oracle通过一个物化视图日志还可以支持多个物化视图的快速刷新。

    2. 物化视图日志根据不同物化视图的快速刷新的需要,可以建立为ROWID或PRIMARY KEY类型的。

    3. 还可以选择是否包括SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。

     

     

    3. 查询物化视图

     

     

    4. 刷新物化视图

     

     

    5. 修改与删除物化视图

     

     

    7. 物化视图分区

    物化视图可以进行分区。而且基于分区的物化视图可以支持分区变化跟踪(PCT)。具有这种特性的物化视图,当基表进行了分区维护操作后,仍然可以进行快速刷新操作。对于聚集物化视图,可以在GROUP BY列表中使用CUBE或ROLLUP,来建立不同等级的聚集物化视图。

     

     

     

    第六节 序列

    序列用于产生一系列唯一数字。由于oracle中没有设置自增列的方法,所以我们在oracle数据库中主要用序列来实现主键自增的功能。

     

    1. 创建和修改序列

    注意:

    1. 创建或修改序列时需保证“最大值-最小值 >= (缓存值-1)*每次循环的值”。

    2. 在修改序列时,只有将来的序列值会被改变。

    3. 改变序列的初始值只能通过删除序列之后重建序列的方法实现。

     

    2. 查询和删除序列

     

    3. 使用序列

    注意:

    1. 序列在使用缓存、事务回滚、多表使用同一序列、系统异常等情形时,可能出现序列裂缝(不连续)。

    2. 使用alter system flush shared_pool 可以清空 cache 中缓存的序列值。

     

     

    第七节 数据库链接

    1. DB_LINK简介

    Database Link用于访问远程数据库对象,按可使用的对象分为:

     

     

    注意:

    1. 创建 DB_LINK 需要当前数据库的 CREATE DATABASE LINK 或 CREATE PUBLIC DATABASE LINK 权限,以及远程数据库的 CREATE SESSION 权限。

     

     

    注意:

    1. 使用DB_LINK时应注意事务问题,是否需要加上 set transaction read only 。

     

     

     

     

    第八节 同义词

    同义词数据库对象的一个别名,在使用同义词时,Oracle数据库将它翻译成对应Scheme对象的名字。大部分数据库对象,如表、视图、物化视图、序列、函数、存储过程、包、同义词等,都可以根据实际情况为它们定义同义词。

    Oracle的同义词有两种类型:

    同义词可以简化对象访问和提高对象访问的安全性,如操作其他用户的表时,不再需要通过user名.object名的形式。

    同义词还可以为分布式数据库的远程对象提供位置透明性,如访问数据库链接时不再需要通过object名@数据库链名的形式。

     

    1. 创建同义词

     

    2. 查询和删除同义词

     

    3. 使用同义词

    注意:

    1. 不能创建和数据库对象同名的私有同义词。

    2. 数据库对象(或私有同义词)和公有同义词同名时,优先访问数据库对象(或私有同义词)。

     

     

    第九节 分区表

    1. 分区表简介

    分区表即把某个大表按某种规则水平拆分成几个部分分开存储,各分区之间可独立查询,并建立各自的索引,不仅改善了查询性能,对数据的管理、备份和恢复也方便。

     

    2. 哈希分区

    对于那些无法有效的划分范围的表,可以使用 hash 分区。hash分区会将数据平均的分配到指定的几个分区表中,由于数据被平均分配到不同的分区,减少查询时对数据块的竞争,这样对于提高性能还是会有一些帮助,列所在的分区是依据分区列的hash值自动分配,因此不能控制,也不知道哪条记录被放到哪个分区中。

    注意:

    1. hash分区也可以支持多个依赖列。

    2. 建立散列分区最好使用2的冥次个分区表。

     

     

    3. 范围分区

    范围分区是使用最广泛的分区方式。它是以列值所属的范围来作为分区的划分条件,将记录存放到列值所在的 range 分区中。

     

    4. 列表分区

    列表分区也需要指定列的值,其分区必须明确指定,该分区列只能有一个,不能像range或hash分区那样同时指定多个列作为分区依赖列,但它的单个分区对应值可以是多个。使用列表分区,必须确定分区列可能存在的值,一旦插入的列值不在分区范围内,则插入/更新就会失败,因此通常建议使用list分区时,要创建一个default分区存储哪些不在指定范围内的记录,类似range分区中的maxvalue分区。  

     

    5. 间隔分区

    在Oracle10g中,没有定义间隔分区,只能通过范围分区实现间隔分区功能,如果要实现自动创建分区,只能通过创建JOB或者scheduler来实现;而在11g中,Oracle直接提供了间隔分区功能,大大简化了间隔分区的实现。

    上述sql语句创建了4个不等区间的分区,分别是2008年1月1日之前的所有数据、08年到09年的所有数据、09年上半年的所有数据、09年下半年的所有数据;同时,它也制定了在2010年1月1日之后,每个月单独创建一个分区。需要注意一点,间隔分区的键值只能是一个列,并且该列只能是Date类型或者number类型。

     

    6. 多级分区

    如果某表按照某列分区之后仍然较大,或者有一些其他的需求,还可以通过分区内再建子分区的方式将分区再分区,即组合分区的方式。

     

    7.分区索引

    分区之后虽然可以提高查询效率,但也仅是缩小了数据的范围,所以我们在有必要的情况下,需要在分区内建立索引,进一步提高效率。

    分区索引分为两类。一类叫做local。一类叫做global。

    还有一种就是自定义数据区间的前缀索引,这个是非常有意义的,自定义区间值必须使用MAXVALUE。另外一点是在分区上建立的索引必须是分区字段列。

     

    8. 分区维护

     

    第04章_增删改查

    第一节 数据修改

    1. 插入数据

     

    2. 删除数据

    注意:

    1. delete:是DML语言,逐条删除,不释放空间,会产生碎片,可以回滚和闪回。

    2. trunc:是DDL语言,先摧毁再重建,会释放空间,不产生碎片,不可以回滚和闪回。

     

     

    3. 修改数据

     

     

    4. 归并数据

     

     

    第二节 数据查询

    1. 简单查询

     

    2. 列表达式

     

     

    3. 结果排序

     

     

    4. 结果分组

    1) 依据单列分组

     

    2) 依据多列分组

     

    3) 分组过滤(having)

    注意:

    1. where语句在分组前对查询记录进行过滤,条件中不能包括聚合函数。

    2. having子句在分组后对组进行过滤,用于筛选满足条件的组,条件中常包含聚合函数。

     

    4) 分组聚合

    注意:

    1. 组函数默认忽略空值,可手动调用滤空函数来特殊处理。

     

    5) 高级分组

     

     

    在以上例子中,用 rollup 和 cube 函数都会对结果集产生null,这时候可用grouping函数来确认该记录是由哪个字段得出来的。

    image-20230925184734847

     

     

    5. 查询过滤

    1) 空值过滤

     

    2) 离散过滤

    注意:

    1. in后带有 null 将会被忽略,而 not in 后带有null,会导致表达式始终不成立。

     

    3) 连续过滤

    注意:

    1. between… and… 是双闭区间,等效:where SAL >=1000 and SAL <=2000;

    2. not between… and… 是双开区间,等效:where SAL < 1000 OR SAL > 2000;

     

    4) 模糊过滤

    扩展:

    1. escape ‘\’用来定义转义开始字符,也可以用其它字符,如 ! 号。

     

     

    6. 子查询

    1) 单行子查询与多行子查询

    注意:

    1. 单行子查询只能用单行比较操作符 (= < >),多行子查询只能用多行比较操作符 (in any all)。

    2. 单行/多行子查询只能通过主键(或唯一索引)保证。但一般在业务层面确定,与预期不一致时,将会因为操作符不匹配而报错。

     

    2) 相关子查询与非相关子查询

    上述例子都是非相关子查询,即子查询返回值给主查询使用,另一种子查询叫相关子查询,即主查询 通过别名 把主查询的值 传递给 子查询,每一行处理的过程分为三步解析:

     

    3) 使用子查询的一些注意事项

    注意:

    1. Mysql中子查询必须起别名,否则会报“ERROR 1248 (42000): Every derived table must have its own alias”错误。

     

    4) 子查询应用:TOP-N问题

    注意:

    1. TOP-N问题如果需要排序,应采用两层结构,因为rownum是属于服务器返回的结果集的固有属性,排序会打乱rownum的顺序

    2. 只能使用rownum<=3,而不能使用rownum>=3,因为没有产生第1行、第2行,就不可能出现满足条件的第3行、第4行。

    3. 与rownum相关的还有结果集的行地址rowid,唯一标识数据库中的一条表记录,用法如下:

     

    5) 子查询应用:分页问题

    扩展:分页问题解决思路

    • 内层:排序。

    • 中层:使用rownum选择前n条;并给rownum指定一个别名,以供最外层过滤使用。

    • 外层:去掉前m条结果。

     

     

    7. 关联查询

    image-20231202102156923

    1) 内连接

    内连接(INNER JOIN)分显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行。

     

    2) 外连接

    外连接分为左外连接右外连接以及全连接,其中左外连接表示除了返回自连接的结果外,还额外返回左表中不满足连接条件的行,此时结果集中这些行右表的数据为null。

    右外连接与左外连接类似,不同的是额外返回右表中不满足连接条件的行,全连接表示既返回左表又返回右表中不满足条件的行,关键字分别为right join和full join。

     

     

    3) 自连接

    一种特殊的连接,即对同一个表进行连接操作, 这个连接叫做自连接。

     

    4) 其它

    SQL99标准提供了一些新的连接方式,如:

     

     

    8. 递归查询

    递归查询也称结构化查询/分层查询,下面是一个示例:

    查询结果如下:

    image-20230922093803932

     

     

    9. 集合运算

    1) union/union all

    union用于返回两个集合去掉重复元素后的所有记录,union all直接返回两个集合所有元素,不进行去重。

     

    2) intersect

    intersect运算符返回同时属于两个集合的记录。

     

    3) minus

    minus返回属于第一个集合,但不属于第二个集合的记录。

     

    4) 集合运算的注意事项

     

    10. 公用表达式(CTE)

     

     

    第三节 内置函数

    1. 单行函数

    单行函数为查询的表或视图的每一行返回一个结果行。这些函数可以出现在SELECT列表、WHERE子句、START WITH和CONNECT BY子句以及HAVING子句中。

     

    1) 数值函数

    数值函数接受 numeric 值输入并返回 numeric 值,返回值精确到小数点后30~38位。

    注意:

    1. Mysql不支持trunc函数。

     

    2) 字符函数

    注意:

    1. Mysql字符串拼接只能用concat函数,不能用||+号拼接,但是可以输入多个参数,如:select concat('A','B','C')

    2. Mysql不支持initcaplengthb函数,并且length函数执行结果和Oracle不一致(Oracle返回字符数,Mysql返回字节数)。

    3. Mysql的子串截取函数,除了substr外,还可以用substring,功能和参数含义相同。

    4. 关于instr的区别:Mysql中instr('','')返回1,而Oracle中将''视为null,返回null。

    5. 关于substr的区别:Mysql中substr('abc',0,1)返回'',而Oracle中与substr('abc',1,1)效果一致,都返回'a'。

     

    3) 日期时间函数

    注意:

    1. Mysql和oracle都支持使用CURRENT_TIMESTAMP获取当前日期和时间。

     

    4) 类型转换函数

    注意:

    1. SYSDATE的默认显示格式为DD-MON-RR,其中RR表年份,与YY表示的年份在跨xx50年时会有所差别。

    2. 设置当前会话的默认日期/时间戳展示格式(如下第2/3行SQL经测试无效):

    3. Mysql中字符串转数值转换失败时不会报错,如CAST('中' AS SIGNED)'中'+1分别返回0和1,而Oracle中会报“无效数字”错误。

     

    5) 滤空函数

    注意:

    1. Mysql不支持Nvl和Nvl2,但有类似的IFNULL(NULL,'DEFAULT')函数。

    2. Mysql和Oracle都支持使用COALESCE函数进行滤空。

     

    5) 其它单行函数

    COLLECT、SET、CAST

     

     

    2. 窗口函数

    1) 窗口函数简介

    窗口函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行

    分析函数说明
    sum() over(partition by ... order by ...) 
    max() over(partition by ... order by ...) 
    min() over(partition by ... order by ...) 
    avg() over(partition by ... order by ...) 
    count() over(partition by ... order by ...) 
    row_number() over(partition by ... order by ...) 
    rank() over(partition by ... order by ...) 
    dense_rank() over(partition by ... order by ...) 
    first_value() over(partition by ... order by ...) 
    last_value() over(partition by ... order by ...) 
    lag() over(partition by ... order by ...) 
    lead() over(partition by ... order by ...) 

    下面是一些业务数据,将基于此对上述函数进行验证:

     

    2) 分区进行求和

    image-20230925134740006

     

    3) 分区进行累计求和

    image-20230925134649312

     

    4) 分区进行编号排名

    image-20230925135305200

     

    5) 分区取首尾记录

     

    6) 分区取前后数据

    image-20230925195623533

     

    3. 其它函数

    1) LISTAGG

     

     

    第05章_性能优化

    第一节 指标监控

    1. 机器负载

    1) CPU

     

    2) 内存

     

    3) IO

     

    4) 网络

     

     

    2. 数据库指标

     

     

    3. 调优参数

     

     

    第二节 执行流程

    SQL语句的执行大体上分为解析优化执行输出四步完成。

    image-20231104140251243

     

    1. 解析

    当我们将SQL语句通过客户端发送到服务端后首先要做的工作便是parser:

     

    2. 优化

    优化器是Oracle数据库中内置的一个核心模块,用于获取当前情形下最高效的执行计划。分为如下两种:

    优化器的模式用于决定在解析SQL时所用的优化器类型,以及决定使用CBO时计算成本值的侧重点,由参数OPTIMIZER_MODE来设置。

    https://blog.csdn.net/u011868279/article/details/128791911

     

    3. 执行与输出

     

     

    第三节 执行计划

    1. 执行计划简介

    执行计划是由Oracle数据库生成的,可以提供以下一些信息:

    通过分析执行计划,可以确定查询中的性能瓶颈和优化机会,了解查询的执行方式,以及根据需要进行调整和优化的方法。

     

    2. 获取执行计划

    执行计划可以通过多种方式获取,如使用EXPLAIN PLAN FOR语句、使用 SQL Trace 功能、使用 SqlDeveloper/PlsqlDeveloper 工具等。

     

    3. 字段说明

     

    4. Operation

     

    5. Predicate

    执行计划中的 Predicate Information 表示操作所用到的谓词信息,包括过滤条件、连接条件等。

     

     

    第四节 SQL建议

    1. 避免交互损耗

     

    2. 防止索引失效

     

     

    3. 减少耗时操作

     

     

    4. 优化执行路径

     

     

    5. 其它优化场景

     

     

    第五节 Hint优化

     

     

    第06章_PLSQL基础

    PL/SQL是一种程序语言,叫做过程化SQL语言(PL/SQL是面向过程语言),是Oracle数据库对SQL语句的扩展,在普通SQL语句的使用上增加了编程语言的特点(PL/SQL是对SQL语言的扩展)。

    PL/SQL是Oracle系统的核心语言,现在Oracle的许多部件都是由PL/SQL写成的,具有简单、高效、灵活、实用的特点。

     

    第一节 快速入门

    1. PL/SQL块

    块(block)是PL/SQL的基本程序处理单元,由三部分组成,分别是声明部分执行部分以及异常处理部分

     

    2. 第一个PL/SQL程序

     

    3. PL/SQL分类

     

     

    第二节 变量

    1. PL/SQL标识符

    当编写PL/SQL块时,为了临时存储数据,需要定义变量和常量。变量和常量的定义是需要满足标识符的限制要求的:

    注意:

    1. 尽量不把变量名声明和表中字段名一样,以防混淆。

     

    2. 变量的类型

     

    3. 变量的命名规范

    为了提高代码的可读性,建议遵从以下编码规则:

    标识符命名规则例子
    程序变量v_namev_sal
    程序常量c_namec_pi
    游标变量name_curroremp_curror
    异常标识e_namee_integrity_error
    记录类型name_recordemp_record

     

    4. 变量的大小写规范

    当编写sql语句和PL/SQL语句时,既可以采用大写格式,也可以采用小写格式。但是为了程序的可读性,应尽量按照以下规则:

     

     

    5. 代码缩进与注释

     

    6. 引用型变量与记录型变量

    在许多情况下,PL/SQL变量可以用来存储在数据库表中的数据。在这种情况下,变量应该拥有与表列相同的类型,如:

    引用型变量是指其数据类型与已经定义的某个数据变量的类型相同,或者与数据库表的某个列的数据类型相同。例:

    记录型变量:PL/SQL提供%ROWTYPE操作符,返回一个记录类型,其数据类型和数据库表的数据结构相一致。举例:

     

     

    第三节 运算符

    1. 算数运算符

     

    2. 关系运算符

    注意:

    1. 其它的关系运算符还有:=<>~=^=>=<=

     

    3. 比较运算符

     

    4. 逻辑运算符

    注意:

    1. 逻辑运算符只可以取TURE、FALSE或NULL。

     

    5. NULL的运算规则

     

     

    第四节 流程控制

    1. IF语句

     

    2. CASE语句

     

    3. 循环语句

    注意:关于循环退出

    1. EXIT语句用于直接退出当前循环,CONTINUE语句用于直接结束当前循环并继续下一次循环。

    2. EXIT WHEN语句和CONTINUE WHEN语句分别用于在满足特定条件时退出当前循环或继续下一次循环。

     

    4. 其它流程控制语句

     

     

    第五节 游标

    游标SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块,通俗的来讲游标就是一个结果集

     

    1. 显式游标

    显示游标是用户自定义的,显示创建的游标,主要是用于对查询语句的处理。显示游标的使用一般分为定义游标 -> 打开游标 -> 提取数据 -> 关闭游标四个步骤。语法如下:

     

     

    2. 游标属性

     

    3. 游标FOR循环

    当使用游标FOR循环时,Oracle会隐含地打开游标,提取数据并关闭游标

     

    4. 参数游标

    参数游标是指带有参数的游标。通过使用参数游标,使用不同参数值可以生成不同的游标结果集。

     

    5. 隐式游标

    隐式游标是由系统隐含创建的游标。主要用于对非查询语句,如修改,删除等操作,有Oracle系统自动地为这些操作设置游标并创建其工作区,对于隐式游标的操作,如定义、打开、取值及关闭操作,都有Oracle系统自动完成,无需用户进行处理。

    隐式游标的名字为SQL,这是由Oracle系统定义的。当系统使用一个隐式游标时,可以通过隐式游标的属性来了解操作的状态和结果,进而控制程序的流程。

    注意:

    1. 通过SQL游标名总是只能访问前一个DML操作或单行SELECT操作的游标属性。

     

     

    6. 使用游标修改或删除数据

    如果创建的游标需要执行更新或删除的操作必须带有FOR UPDATE子句。FOR UPDATE子句会将游标提取出来的数据进行行级锁定,这样在本会话更新期间,其他用户的会话就不能对当前游标中的数据行进行更新操作。

     

     

    第六节 异常处理

    异常是程序在正常执行过程中发生的未预料的事件。异常处理是为了提高程序的健壮性,使用异常处理部分可以有效地解决程序正常执行过程中可能出现的各种错误,使程序正常运行。

     

    1. 预定义异常

    预定义异常是指由PL/SQL所提供的系统异常,每个预定义异常对应一个特定的Oracle错误,当PL/SQL块出现这些Oracle错误时,会隐含地触发相应的预定义异常。

    常见的预定义异常如下:

    错误号异常错误信息名称说明
    ORA-00001DUP_VAL_ON_INDEX试图破坏一个唯一性限制
    ORA-00051TIMEOUT_ON_RESOURCE在等待资源时发生超时
    ORA-01001INVALID_CURSOR试图使用一个无效的游标
    ORA-01012NOT_LOGGED_ON没有连接到ORACLE
    ORA-01017LOGIN_DENIED无效的用户名及口令
    ORA-01403NO_DATA_FOUNDSELECT INTO没有找到数据
    ORA-01422TWO_MANY_ROWSSELECT INTO 返回多行
    ORA-01410SYS_INVALID_ROWID从字符串向ROWID转换发生错误
    ORA-01476ZERO_DIVIDE数字值除零时触发的异常
    ORA-01722INVALID_NUMBER转换一个数字失败
    ORA-06500STORAGE_ERROR内存不够引发的内部错误
    ORA-06501PROGRAM_ERROR存在PL/SQL内部问题
    ORA-06502VALUE_ERROR转换或截断错误
    ORA-06504ROWTYPE_MISMATCH宿主游标变量与 PL/SQL 游标变量的返回类型不兼容
    ORA-06511CURSOR_ALREADY_OPEN游标已经打开
    ORA-06530ACCESS_INTO_NULL未定义对象
    ORA-06531COLLECTION_IS_NULL集合元素未初始化
    ORA-06532SUBSCRIPT_OUTSIDE_LIMIT使用嵌套表或 VARRAY 时,将下标指定为负数
    ORA-06533SUBSCRIPT_BEYOND_COUNT元素下标超过嵌套表或 VARRAY 的最大值
    ORA-06592CASE_NOT_FOUNDCASE 中若未包含相应的 WHEN ,并且没有设置
    ORA-30625SELF_IS_NULL使用对象类型时,在 null 对象上调用对象方法

    对于预定义异常情况的处理,无需在程序中定义,只需在PL/SQL块的异常处理部分,直接引用相应的异常情况名,并对其完成相应的异常错误处理即可。

     

    2. 非预定义异常

    用于处理预定义异常所不能处理的ORACLE错误。此种异常需要在程序中定义。

    注意:

    1. SQLCODESQLERRM是oracle的异常处理函数,分别用来获取oracle错误号和错误信息,通过在异常处理部分引用,可以取得未预计到的oracle错误。

     

    3. 自定义异常

    如果你想在某个特定事件发生时向应用程序的用户发出一些警告信息,而事件本身不会抛出Oracle内部异常,这个异常是属于应用程序的特定异常,那么就需要自定义异常。

    自定义异常通过使用RAISE语句来抛出。当引发一个异常错误时,控制就转向到EXCEPTION块异常错误部分,执行错误处理代码。

     

    4. RAISE_APPLICATION_ERROR

    虽然我们通过DBMS_OUTPUT.PUT_LINE来输出异常信息,但是在实际的应用中,需要把异常信息返回给调用的客户端。

    RAISE_APPLICATION_ERROR将应用程序专有的错误从服务器端转达到客户端应用程序(其他机器上的SQLPLUS或者其他前台开发语言)。

     

     

    第07章_PLSQL对象

    存储过程存储函数是存储在数据库中的被命名的PLSQL块,供所有用户程序调用,完成特定功能的子程序。

     

    第一节 存储过程与存储函数

    1. 存储过程的创建

     

    1) 创建无参数的存储过程

     

    2) 创建带输入参数的存储过程

     

    3) 创建带输出参数的存储过程

     

    4) 创建带输入输出参数的存储过程

     

    2. 存储过程的调用

     

    3. 存储过程的删除

     

     

    第二节 存储函数

    1. 存储函数的创建

     

    1) 创建无参数的存储函数

     

    2) 创建带输入参数的存储函数

     

    3) 创建带输出参数的存储函数

     

    4) 创建带输入和输出参数的函数

     

    2. 存储函数的调用

     

    3. 存储函数的删除

     

    4. 存储过程和存储函数的比较

     

     

    第三节 包

    是一组相关过程、函数、变量、常量和游标等PL/SQL程序设计元素的组合。它具有面向对象程序设计语言的特点,是对PL/SQL程序设计元素(过程、函数、变量等)的封装。

    一个包由两个分开的部分组成:

    下面是一个简单的包应用示例:

     

    1. 包的创建

    一般来说,创建包分为创建包规范和创建包体两步:

     

    1) 创建包规范

     

    2) 创建包体

     

    2. 包的调用

    对包内共有元素(公共组件)一般采用包名.元素名称来进行调用。

     

    3. 包的删除

     

    4. 子程序重载

    所谓重载是指两个或多个子程序有相同的名称,但拥有不同的参数变量、参数顺序或参数数据类型。

     

    4. DBMS_OUTPUT包

     

    5. UTL_FILE包

    使用UTL_FILE包进行文件写入的案例如下:

     

     

    第四节 触发器

    触发器是指存放在数据库中,并且被隐含执行的存储过程。当发生特定事件时,Oracle会自动执行触发器的相应代码。

    触发器的类型有:DML触发器DDL触发器替代(instead of)触发器以及系统触发器

    触发器的组成:

    一个简单的触发器如下:

     

    1. DDL触发器

    当创建、修改或者删除数据库对象时,会引起相应的触发器操作事件,此时就可以利用触发器来对这些数据库对象的DDL操作进行监控。

    常见的DDL事件如下:

    NO.DDL事件触发时机描述 
    1ALTERBEFORE/AFTER修改对象的结构时触发
    2ANALYZEBEFORE/AFTER分析数据库对象时触发
    3ASSOCIATE STATISTICSBEFORE/AFTER启动统计数据库对象时触发
    4AUDITBEFORE/AFTER开启审核数据库对象时触发
    5COMMENTBEFORE/AFTER对数据库对象做注释时触发
    6CREATEBEFORE/AFTER创建数据库对象时触发
    7DDLBEFORE/AFTER针对出现的所用DDL事件都会触发
    8DISASSOCIATE STATISTICSBEFORE/AFTER关闭统计数据库对象时触发
    9DROPBEFORE/AFTER删除数据库对象时触发
    10GRANTBEFORE/AFTER通过SQL的GRANT命令赋权时触发
    11NOAUDITBEFORE/AFTER禁用审核数据库对象时触发
    12RENAMEBEFORE/AFTER通过SQL的RENAME命令对对象重命名时触发
    13REVOKEBEFORE/AFTER通过SQL的REVOKE语句撤销授权时触发
    14TRUNCATEBEFORE/AFTER通过SQL的TRUNCATE语句截断表时触发

     

    2. DML触发器

    基于DML操作的DML触发器可用于实现数据安全保护、数据审计、数据完整性、参照完整性、数据复制等功能。按触发频率分为:

     

    3. 替代触发器

    在简单视图上往往可以执行INSERT、UPDATE、DELETE操作。但在复杂视图上执行INSERT、UPDATE、DLETE操作是有限制的。为了在这些复杂的视图上执行DML操作,需要建立INSTEAD OF触发器。

    INSTEAD OF 触发器的限制:

     

    4. 系统触发器

    系统触发器是由特定系统事件(与例程或方案相关的数据库事件)所触发的触发器。常见的系统事件有: