PL/SQL 基础—匿名块
PLSQL 是Oracle公司在SQL基础上进行扩展而成的一种过程语言。 PLSQL提供了典型的高级语言特
性,包括封装,例外处理机制,信息隐藏,面向对象等;并把最新的编程思想带到了数据库服务器和工具
集中。
定义格式
PLSQL是一种类PASCAL语言,每一段程序都是由Block 组成的,其中BEGIN--END--程序块是不可或缺的;
[DECLARE]
--变量声明
BEGIN
--程序语句
[EXCEPTION]
--异常处理
END;
DECLARE –变量声明部分
变量名 [CONSTANT] 类型 := 初始值 [DEFAULT N];
类型声明包括:NUMBER(6) TABLE.COLUMN%TYPE 两种方式
CONSTANT 常量
DEFAULT 默认值
注:
每一个变量声明以分号结束
NUMBER(n),VARCHAR2(n)需要明确指出大小,这和后面输入、输出参数的定义不一样
VARRAY 、RECORD、 TABLE、 CURSOR等复杂数据类型和自定义类型
BEGIN – 程序段
BEGIN
SQL语句
函数(to_char、to_number、nvl...)
--------条件语句--------------------------------------
IF conditions THEN
...
ELSIF conditions THEN
...
ELSE
...
END IF;
CASE [selector]
WHEN conditions THEN
WHEN conditions THEN
ELSE ...
END;
--------循环语句--------------------------------------
LOOP
...
EXIST [WHEN conditions];
END LOOP;
WHERE conditions LOOP
...
END LOOP;
FOR i IN start...end LOOP
...
END LOOP;
--------PL/SQL工具包--------------------------------------
DBMS_OUTPUT、DBMS_SQL、另外还有EXECUTE IMMEDIATE等
注:
SUM()、AVG()、COUNT()等聚合函数补课直接使用;
CASE 是否有 selector 存在两种不同用法;
几种循环方式对第一趟循环的处理略有不同,且EXIST可退出最靠近的一层循环;
EXCEPTION – 异常处理
EXCEPTION
WHEN 异常名 THEN
...
...
WHEN OTHERS THEN -- 捕获任意异常
* 根据异常的分类:处理方式不同 *
1 .预定义异常
Oracle 都已经预定义好了,使用时无需预先声明,常见的有:
NO_DATA_FOUND 查询结果为空(游标FETCH等)
TOO_MANY_ROWS 查询结果包含多行记录
INVALID_CURSOR 游标使用异常
ZERO_DIVIDE 被除数为0
DUP_VAL_ON_INDEX 违反主键或唯一索引异常
* Oracle 提供了两个内置函数 SQLCODE 和 SQLERRM 分别用来返回Oracle 错误号和错误描述 *
WHEN OTHERS THEN
ROLLBACK;
v_error_code := SQLCODE ;
v_error_message := SQLERRM ;
INSERT INTO errors
VALUES(v_error_code, v_error_message);
2 .错误
处理非预定义的Oracle错误:此类错误属于Oracle错误,有编号,但无错误名称定义,使用时需要先声明,并进行错误初始化:
DECLARE
e_emps_remaining EXCEPTION;
PRAGMA EXCEPTION_INIT
(e_emps_remaining, -2292);
BEGIN
...
EXCEPTION
WHEN e_emps_remaining THEN
注:Oracle内部错误号很多,想了解全部的Ora错误号,请参考: http://www.ora-code.com/
3 .自定义异常
处理用户自定义的错误: 这种错误一般是程序员根据具体的业务逻辑定义的应用类错误,需要先声明后使用:
DECLARE
custom_exception EXCEPTION;
BEGIN
...
RAISE custom_exception;
...
EXCEPTION
WHEN custom_exception THEN
DBMS_OUTPUT.PUT_LINE('...');
END;
4 .RAISE_APPLICATION_ERROR() 函数
它可以无需预先定义错误,而在需要抛出错误的地方直接使用此函数抛出例外,例外可以包含用户自定义的错误吗和错误描述;
注:
异常传递:当前块中不处理,传递到外层