PL/SQL 简介
PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言
PL/SQL 是对 SQL 的扩展
支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制结构
可用于创建存储过程、触发器和程序包,给SQL语句的执行添加程序逻辑
与 Oracle 服务器和 Oracle 工具紧密集成,具备可移植性、灵活性和安全性
标准SQL没有的特征
变量
控制结构(判断、循环)
自定义的过程和函数
对象类型
PL/SQL 的优点
PL/SQL 块简介
PL/SQL 块举例
变量和常量
declare
--定义常量 不可被修改(constant)
sex constant number :=1;
begin
dbms_output.put_line(sex);
end;
数据类型
PL/SQL 支持的内置数据类型
数字数据类型
指定数值的存储格式
字符数据类型
字符数据类型包括:
CHAR
VARCHAR2
LONG
RAW
LONG RAW
日期时间和布尔数据类型
日期时间类型
- 存储日期和时间数据
- 常用的两种日期时间类型
- DATE
- TIMESTAMP
布尔数据类型
5. 此类别只有一种类型,即BOOLEAN类型
6. 用于存储逻辑值(TRUE、FALSE和NULL)
7. 不能向数据库中插入BOOLEAN数据
8. 不能将列值保存到BOOLEAN变量中
9. 只能对BOOLEAN变量执行逻辑操作
属性类型
用于引用数据库列的数据类型,以及表示表中一行的记录类型
属性类型有两种:
- %TYPE - 引用变量和数据库列的数据类型
- %ROWTYPE - 提供表示表中一行的记录类型
使用属性类型的优点:
- 不需要知道被引用的表列的具体类型
- 如果被引用对象的数据类型发生改变,PL/SQL 变量的数据类型也随之改变
icode itemfile.itemcode%TYPE;
emp_rec scott.emp%ROWTYPE;
复合类型
自定义类型
TYPE 属性类型名称 IS RECORD(
属性名 属性类型,
属性名 属性类型,
.
.
.
属性名 属性类型
);
declare
Type au_record IS RECORD(
Author_code char(6),
Name varchar2(10),
Sex number(1)
V_record au_record;
begin
end;
)
逻辑比较
布尔表达式的结果为TRUE、FALSE或NULL,通常由逻辑运算符AND、OR和NOT连接
控制结构
条件控制
IF
IF实例
declare
score number :=60;
begin
if score >=60 then
dbms_output.put_line('及格');
end if;
end;
IF THEN ELSE实例
--if then else的使用
declare
score number :=50;
begin
if score >=60 then
dbms_output.put_line('及格');
else
dbms_output.put_line('不及格');
end if;
end;
IF THEN ELESIF实例
--if then elsif
declare
score number :=&请输入成绩;
begin
if score>=90 then
dbms_output.put_line('优秀');
elsif score>=80 then
dbms_output.put_line('良好');
elsif score>=60 then
dbms_output.put_line('及格');
else
dbms_output.put_line('不及格');
end if;
end;
CASE
循环控制
循环控制用于重复执行一系列语句
循环控制语句包括:
- LOOP、EXIT 和 EXIT WHEN
循环控制的三种类型:
- LOOP - 无条件循环
- WHILE - 根据条件循环
- FOR - 循环固定的次数
异常处理 机制
常见异常类型
CURSOR_ALREADY_OPEN 试图"OPEN"一个已经打开的游标
DUP_VAL_ON_INDEX 试图向有"UNIQUE"中插入重复的值
INVALID_CURSOR 试图对以关闭的游标进行操作
INVALID_NUMBER 在SQL语句中将字符转换成数字失败
LOGIN_DENIED 使用无效用户登陆
NO_DATA_FOUND 没有找到数据时
TIMEOUT_ON_RESOURCE Oracle等待资源期间发生超时
TOO_MANY_ROWS "SELECT INTO"返回多行时
VALUE_ERROR 当出现赋值错误
ZERO_DIVIDE 除数为零
引发应用程序错误
RAISE_APPLICATION_ERROR 过程
用于将应用程序专有的错误从服务器端转达到客户端应用程序
用于创建用户定义的错误信息
可以在可执行部分和异常处理部分使用
错误编号必须介于 –20000 和 –20999 之间
错误消息的长度可长达 2048 个字节
引发应用程序错误的语法:
RAISE_APPLICATION_ERROR(errorCode, error_msg);
引发应用程序错误举例
DECLARE
rate itemfile.itemrate%TYPE;
rate_exception EXCEPTION;
BEGIN
SELECT NVL(itemrate,0) INTO rate FROM itemfile
WHERE itemcode = 'i207';
IF rate = 0 THEN
RAISE rate_exception;
ELSE
DBMS_OUTPUT.PUT_LINE('项费率为:' || rate);
END IF;
EXCEPTION
WHEN rate_exception THEN
RAISE_APPLICATION_ERROR(-20001, '未指定项费率');
END;
总结
PL/SQL 是一种可移植的高性能事务处理语言
PL/SQL 块由声明部分、可执行部分和异常处理部分组成
PL/SQL 数据类型包括标量数据类型
控制结构包括条件控制、循环控制和顺序控制
PL/SQL 支持动态 SQL
运行时出现的错误叫做异常
异常可以分为预定义异常和用户定义的异常