PL/SQL程序控制结构及在PL/SQL中更改数据和管理事务
1. 条件控制
A. IF 条件分支语法:
if ( 条件 1) then
语句 ;
elsif ( 条件 2) then
语句 ;
elsif ( 条件 3) then
语句 ;
else
语句 ;
end if;
B . case 条件分支:等值比较、条件比较、 case 表达式
a. 等值比较语法:
CASE 条件判断
WHEN 条件值的表达式 THEN 要执行的条件操作 ;
…….
[ELSE ……..]
END CASE;
b. 条件比较语法:
CASE
WHEN 不同比较条件 THEN 要执行的条件操作 ;
…….
[ELSE ……..]
END CASE;
2. 循环控制
A. 基本循环:无论是否满足条件,语句至少执行一次
语法: LOOP
……..
EXIT [WHEN 条件语句 ];
END LOOP;
B. WHILE 循环:只有条件为真时,才会执行
语法: WHILE 条件语句 LOOP
…………………………………..
END LOOP;
C. FOR 循环
语法: FOR 循环计数器 IN [REVERSE] 下限 .. 上限 LOOP
……………………………………………………………………………………
END LOOP;
D. 嵌套循环和标号:定义标号: << 标号名称 >>
3. 顺序控制
A.GOTO 语句:用于跳转到指定 << 标号 >> 去执行语句。
缺点是会增加程序的复杂性,降低可读性,所以 Oracle 建议昼不要使用。
B. NULL 语句:空语句,执行没有任何实际效果,通常占位置用
4. 异常处理
A. 异常有两种类型:
a. 预定义异常 : 当 PL/SQL 程序违反 Oracle 规则或超越系统限制时隐式引发
b. 用户定义异常 : 用户可以在 PL/SQL 块的声明部分定义异常,自定义的异常通过 RAISE 语句显式引发
B. 定义异常语法:异常名称 EXCEPTION;
PRAGMA EXCEPTION_INIT( 异常名称 , 错误号 );
C. 抛出异常语法
a. RAISE 异常名称 ;
b. RAISE_APPLICATION_ERROR( 错误号 , 错误描述 [, {TRUE|FALSE}]);
D. 处理异常语法
EXCEPTION
WHEN …….THEN
…………….
WHENTHEN
WHEN OTHERS THEN
………….
5. DML 操作的游标属性
A. 隐式游标
a. 名称: SQL
b. 属性: SQL% 属性名
c. 常见属性
SQL%FOUND: 操作到数据
SQL%NOTFOUND :没有操作到数据
SQL%ROWCOUNT :操作的记录数
B. DML 语句的 RETURNING 字句:返回 SQL 执行以后的结果
6. 用 ForAll 语句批量执行 DML
A. ForAll 语句语法
ForAll 索引 in 开始 .. 结束
sql 语句 ; -- 注意,只有一句!
B . 在 INSERT 语句上使用批量绑定:首先要给集合元素赋值,然后再使用 ForAll 语句批量绑定
C. ForAll 的游标属性
a. SQL%FOUND: 操作到数据
b. SQL%NOTFOUND :没有操作到数据
c. SQL%ROWCOUNT :操作的记录数
d. SQL%BULK_ROWCOUNT :返回批量执行时第 i 个元素所作用的行数
7. PL/SQL 中的数据库事务管理
A. 事务概念:事务就是一个完整的逻辑工作单元,由多个操作组成。所有操作要么全部成功,要么全部失败
B. 事务特点: ACID :原子性、一致性、隔离性、 ( 永 ) 持久性
C. 事务控制流程
开始事务
自动执行第一条 SQL 开始
执行 SQL
可能执行多条 SQL
提交或回滚
commit 或 rollback
D. 锁的概念:锁是数据库用来控制共享资源并发访问的机制、锁用于保护正在被修改的数据、直到提交或回滚了事务之后,其他用户才可以更新数据
E. 锁的类型:行级锁、表级锁
a. 行级锁:对正在被修改的行进行锁定。其他用户可以访问除被锁定的行以外的行
在使用以下语句时, Oracle 会自动应用行级锁:
a. INSERT
b. UPDATE
c. DELETE
d. SELECT … FOR UPDATE
使用 COMMIT 或 ROLLBACK 语句释放锁
b. 表级锁:锁定整个表,限制其他用户对表的访问
语法: LOCK TABLE table_name IN mode MODE;
F. 死锁:当两个事务相互等待对方释放资源时,就会形成死锁、 Oracle 会自动检测死锁,并通过结束其中的一个事务来解决死锁
8. 事务隔离级别
A. 分类
a. 未提交读
读其它用户没有提交的数据,又称脏读
b. 提交读: Oracle 支持,这也是默认支持的级别(可能会发生不可重复读数据异常)
c. 可重复读: Oracle 不支持(可能会发生幻读数据异常)
d. 串行读: Oracle 支持,不过效率低
9. 数据库事务实现机制:通过日志文件实现