Oracle学习笔记
🌞 🌞 🌞
游标,触发器,索引,表分区,数据库优化…
游标
一.游标概念:
游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。
游标充当指针的作用。尽管游标能遍历结果中的所有行,但他一次只指向一行。
概括来讲,SQL的游标是一种临时的数据库对象,即可以用来存放在数据库表中的数据行副本,也可以指向存储在数据库中的数据行的指针。
游标提供了在逐行的基础上操作表中数据的方法。
游标的一个常见用途就是保存查询结果,以便以后使用。
游标的结果集是由SELECT语句产生,如果处理过程需要重复使用一个记录集,那么创建一次游标而重复使用若干次,比重复查询数据库要快的多。
二.游标特点:
SQL语言是面向集合的,是对指定列的操作。如果要对列中的指定行进行操作,就必须使用游标。
当在PL/SQL块中执行查询语句(SELECT)和数据操纵语句(DML)时,Oracle会为其分配一个上下文区
(Context Area)
游标是指向上下文区的指针,它为应用提供了一种对具有多行数据查询结果集中的每一行数据分别进行单独
处理的方法
三.显式游标
1).显式游标则用于处理SELECT语句返回的多行数据。
2).显示游标可以分为四个阶段:
%ISOPEN
用于确定游标是否已经打开。如果游标已经打开,则返回值为TRUE;否则返回FALSE 。
%FOUND
检查是否从结果集中提取到数据。如果提取到数据,则返回值为TRUE;否则返回FALSE 。
%NOTFOUND
与%FOUND属性恰好相反,如果提取到数据,则返回值为FALSE;否则返回TRUE 。
%ROWCOUNT
返回到当前行为止已经提取到的实际行数。
4).静态游标
书写格式
1 | --静态游标 静态的select语句 |
游标示例
1 | --循环打印部门为10的人员信息编号和名称 |
table类型提取
1 | --循环打印dept表中数据 使用table结构一次性提取 |
带参游标
带参游标:在定义了参数游标之后,当使用了不同参数值多次打开游标时,可以生成不同的结果集,定义参数游标 时,游标参数只能指定数据类型,而不能指定长度。
1 | --输入部门编号,打印人员信息编号和名称(带参游标) |
游标for循环
- 可直接用子查询
1 | --获取每个部门的部门名称(for in循环)隐式打开,关闭 |
5).动态游标
打开游标时指定其对应的select语句,只有动态游标可以返回。
书写格式
1 | --动态游标 打开游标时指定其对应的select语句,只有动态游标可以返回 |
游标示例
1 | --输出所有部门(,员工)名称 |
6).练习
①——
1 | --创建一个存储过程,以部门号为参数,输出入职日期最早的10个员工信息 |
②——
1 | DECLARE |
四.隐式游标
1).隐含游标用于处理SELECT INTO 和DML语句。
2).隐含游标:
- 当执行一条DML语句或者SELECT…INTO语句时(非SELECT查询语句),都会创建一个隐含游标 。
- 隐含游标的名称是SQL,不能对SQL游标显式地执行OPEN、FETCH和CLOSE语句。
- Oracle隐式地打开、提取,并总是自动地关闭SQL游标 。隐式游标针对紧邻的SQL语句。
- 隐式游标属性包括SQL%FOUND、SQL%NOTFOUND、SQL%ROWCOUNT。
1 | -- 隐式游标,不需要自行打开,关闭,名为SQL(针对相邻的sql语句) |
触发器
一.触发器概述:
触发器是在事件发生时隐式地自动运行的PL/SQL程序块,不能接收参数,不能被调用,触发器是指被隐含执行的 存储过程,它可以使用PL/SQL进行开发; 当发生特定事件(如修改表数据、登录到数据库)时,Oracle会自动执行触发器的相应代码。
- 对于同一个对象,事件可以有多个触发器
- 达到触发条件全部执行,执行顺序和创建顺序无关
- 当一个触发器出现错误时,之后所有触发器都不执行
- 触发器可以调用函数,过程,但其中不能使用commit,rollback
二.触发器组成:
触发事件
DML或DDL语句。
触发时间
是在触发事件发生之前(before)还是之后(after)触发
触发操作
使用PL/SQL块进行相应的数据库操作
触发对象
表、视图、模式、数据库
触发频率
触发器内定义的动作被执行的次数。
语句级的在事件发生时执行一次,行级的影响几条记录执行几次
三.触发器的限制:
- 触发器代码的大小不能超过32K。
- 如果确实需要使用大量的代码创建触发器,则应该首先创建过程,然后在触发器中使用CALL语句调用过程
- 触发器代码只能包含DML(INSERT、UPDATE和DELETE)语句。
- 不能包含DDL语句(CREATE、ALTER和DROP)和事务控制语句(COMMIT、ROLLBACK和SAVEPOINT)。
四.触发器基本语法
自定义错误:
RAISE_APPLICATION_ERROR用法:
RAISE_APPLICATION_ERROR(errorNumber,errorString)
errorNumber是数值在-20000到-20999之间,errorString为自定义的错误信息
1 | --语法 |
五.触发器类型:
1).DML触发器
在对数据库表进行DML操作时触发,并且可以对每行或者语句操作上进行触发。
before触发器
- 示例
1 | --周一,周五不能修改emp表 |
- 条件谓语(inserting,updating,deleting)
1 | --周一,周五emp表不可增删改 |
行级触发器
FOR EACH ROW选项说明触发器为行触发器。
行触发器和语句触发器的区别表现在:
行触发器要求当一个DML语句操作影响数据库中的多行数据时,对于其中的每个数据行,只要它们符合触发器约束条件,均激活一次触发器;
而语句触发器将整个语句操作作为触发事件,当它符合约束条件时,激活一次触发器。当省略FOR EACH ROW选
项时,BEFORE和AFTER触发器为语句触发器,而INSTEAD OF触发器则只能为行触发器。
1 | --行级触发器(可以指定条件,视图触发器一般都是) |
after触发器
如果指定了AFTER关键字,则表示在执行DML操作之后触发触发器 利用行触发器实现级联更新。
在修改了主表dept中的deptno之后(AFTER),级联的、自动的更新子表emp 中原来在该部门的deptno。
1 | -- after触发器(级联操作,备份) |
2).替代触发器
是oracle8专门为进行视图操作的一种触发器。
3).系统触发器
对数据库系统事件进行触发,如启动、关闭等。
1 | --系统触发器 |
4).练习
①——
1 | --周六周日,不能修改emp表,不在早八点到晚六点也不能修改emp表;提示:非工作时间不能修改emp表 |
②——
1 | --主键自增,可以使用序列+触发器完成主键自增 |
数据库优化
一.SQL语句
1).使用大写
2).尽量避免sql语句进行全表扫描
1 | -- 1).值不要为空(null),可以添加默认值 |
二.数据库设计
1).对于常用操作,可以使用视图/函数/过程简化操作;
2).尽量减少使用中文(性别,状态等);
索引
一.索引特点:
- 跟表相关的数据逻辑结构,用来调高数据的检索效率
- 索引表相当于一个键值集合,键是唯一的,用于查找对应的值
二.书写格式
- 对于常用来当作查询条件的列可以创建索引
1 | CREATE 索引类型 INDEX [SCHEMA.] 索引名称 ON 表名 |
三.分类:
1.单列索引和复合索引
2.唯一索引和非唯一索引
1 | --B树索引 |
表分区
一.范围分区
1 | --范围分区:将数据按照指定的范围保存在不同的空间上 |
二.列表分区
1 | --列表分区:按照值分配到不同空间 |
三.散列分区
1 | --散列分区:将数据信息按照Hash值分区 |
四.本地索引分区
1 | --本地索引分区(本地索引会区分表结构) |
五.全局索引分区
1 | --全局索引分区 |
- 本文作者:
腾飞
- 本文链接:
https://www.tengfei.eu.org/article/b28af766.html
- 版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!