引言
- 上篇:https://blog.csdn.net/z929118967/article/details/128468792
- 下篇:https://blog.csdn.net/z929118967/article/details/128481588?spm=1001.2014.3001.5501
PL/SQL块可以分为三类:https://kunnan.blog.csdn.net/article/details/128313118
- 无名块:动态构造,只能执行一次。
- 子程序:存储在数据库中的
存储过程
、函数
及包
等。当在数据库上建立好后可以在其它程序中调用它们。
过程(procedure)又叫存储过程(stored procedure),是一个有名称的PL/SQL程序块 。过程和函数都是能够永久存储在数据库中的程序代码块,应用时通过调用执行 。
过程相当于java中的方法, 它注重的是实现某种业务功能 。
函数(function)也相当于java中的方法,它注重计算并且总是有返回结果 。
- 触发器:当数据库发生操作时,会触发一些事件,从而自动执行相应的程序。
I PL/SQL (procedural language/sql)
pl/sql是编写数据库存储过程的一种过程语言,是对sql的扩展,使其增加了过程化语句功能。
归纳一些业务逻辑放在数据库编程(存储过程、触发器和函数)实现。
数据库编程可以减少网络流量并可更充分地利用数据库的预编译功能和缓冲功能。
1.1 pl/sql概述
pl/sql程序的基本结构是块,每个快完成一个逻辑操作。
- pl/sql块主要有两种类型,即
命名块
和匿名块
。
匿名块每次执行时都要进行编译,它不能存储到数据库中,也不能在其他的pl/sql块中引用。
存储过程
和函数
是命名快,他们被编译后保存在数据库中,可以被反复的调用,运行速度较快。
https://kunnan.blog.csdn.net/article/details/128313118
1.2 pl/sql的相关操作
- pl/sql的创建
create procedure 过程名(【参数1,参数2,...】)
as
<pl/sql块>
- 修改过程
alter procedure 过程名1 rename to 过程名2;
- 执行pl/sql
call /perform procedure 过程名(【参数列表】);
- 删除pl/sql
drop procedure 关系名();
1.3 存储过程的特点
- 存储过程因为sql语句已经预编译过了,因此运行的速度比较快
- 可保证数据的安全性和完整性。
- 可以降低网络的通信量。存储过程主要是在服务器上运行,这样可以减少客户机的压力。
- 存储过程可以接受和输出参数,并返回单个或多个结果集以及返回值,可以向程序返回错误原因。
- 存储过程可以包含程序流、逻辑以及对数据库的查询,同时可以对实体封装和隐藏数据逻辑。
1.4 存储过程与函数的区别
- 存储过程是用户定义的一系列sql语句的集合,设计特定的表或其他对象的任务,用户可以调用存储过程;
- 函数通常是数据库已定义的方法,它接受参数并返回某种类型的值并且不涉及特定的用户表。
II 触发器 (trigger)
trigger是用户定义在关系表上的一类由事件驱动的特殊过程。
2.1 创建触发器
create trigger <触发器名>
{before|after}<触发事件>on <表名>
foreach{row|statement}
[when <触发事件>]
<触发动作体>
foreach statement
是语句级,触发动作只发生一次,如果表的触发器是行级的话,触发动作将作用于所有的行。
如果是行级触发器,用户可再过程中使用new和old引用update、insert事件之后的新值和update、delete事件之前的旧值。如果为语句级触发器,则不可使用new和old进行引用。
- 触发动作体可以是一个匿名PL/SQL块,也可以是对已创建的存储过程的调用。
- 同一个表的多个触发器激活时遵循如下的执行顺序:
- 执行该表上的before触发器
- 激活触发器上的sql语句
- 执行该表上的after触发器
2.2 删除触发器
drop trigger <触发器名> on <表名>
III 总结
3.0 中间表、临时表和视图
- 中间表: 是存放统计数据的表,它是为数据仓库、输出报表或查询结果而设计的。
- 临时表是程序员个人设计的,存放临时记录,为个人所用。
基本表和中间表由dba维护,临时表由程序员自己采用程序来自动维护。
- 视图技术在数据库设计中的作用
- 视图是供程序员使用数据库的一个窗口,是一种虚表,视图依赖基本表而存在。它是基本表的数据综合的一种体现,是数据处理的一种方法,更是一种数据保密的手段。
- 为了进行复杂处理、提高运算速度和节省存储空间,视图的定义深度一般不得超过三层。如果超过三层视图还是不够用,则应该在视图上定义临时表,在临时表上再定义视图。
3.1 基本表的性质
- 原子性: 基本表中的字段是不可再分解的
- 原始性:基本表中的记录是原始数据的记录
- 演绎性: 由基本表与代码表中的数据可以派生出所有的输出数据。
- 稳定性:基本表的结构是相对稳定的,表中的记录是长期保存的。
3.2 好的E-R图标准
结构清晰,关联简洁、实体个数适中、属性分配合理和没有低级冗余。
3.3 主键与外键
一般而言,一个实体不能既无主键又无外键。在E-R图中处于叶子部位的实体,可以定义主键也可不定义主键(因为它无子孙),但必须要有外键(因为他有父亲)。主键是实体的高度抽象,主键与外键的配对表示实体之间的连接。
主键的取值方法:主键是供程序员使用的表间连接工具,可以是一个由程序实现的自动递增的序列(无物理意义的数字串),也可以有物理意义的字段名或字段组合。建议组合字段的个数不要太多,多了不但索引占用空间大,而且速度也慢。
雪花ID:https://blog.csdn.net/z929118967/article/details/128307222
3.4 正确处理多对多的关系
如果两个实体之间存在多对多的关系,则应该消除这种关系,消除的办法是在两者之阿增加第三实体
。
这样原来一个多对多的关系,现在变成两个一对多的关系。要将原来两个实体的属性合理地分配到三个实体中。
3.5 数据冗余
提倡高级冗余(派生性冗余),反对低级冗余(重复性冗余)。
高级冗余举例:消费流水表的字段有原余额、现余额和消费金额。其中原余额是冗余的,但是也要保留。
3.6 SQL优化
- 优化时,在既有选择操作和链接操作时,应当先做选择操作,这样参加连接的元组就可以大大减少。(代数优化)
- 选择操作算法有全表扫描和索引扫描,应当选用索引扫描。
- 表的连接采用index join代价页较小。这是物理优化。
3.7 提高数据库运行效率的方法
从数据库系统级优化、数据库设计级优化和程序实现级优化:
- 在数据库物理审计时,降低范式、增加高级冗余、少用触发器和多用存储过程。
- 当计算非常复杂,而且记录条数非常巨大时,复杂的计算要先在数据库外以文件系统方式采用编程语言处理完毕之后,最后才入库追加到表中。
- 如果表的记录太多,可以以主键的某个值为界限,将该表的记录分割为两个表;如果表的字段太多,则垂直分割表。
3.8 字段的设计
- 数据类型尽量用数字类型
- 数据类型尽量的小
- 尽量不允许null,可以使用not null 和default 来代替null
- 少用text和image类型的字段
- 自增字段要慎用,不利于数据迁移。
雪花ID:https://blog.csdn.net/z929118967/article/details/128307222
see also
gzh: iOS逆向