PL/SQL概述
PL/SQL(oracle专用语言)是一种过程化语言,在PL/SQL中可以通过IF语句或LOOP语句实现控制程序的执行流程,甚至可以定义变量,以便在语句之间传递信息。
1、PL/SQL块结构
PL/SQL程序以块为基本单位,其基本语法:
[DECLARE] ---- 声明部分,可选
[BEGIN] ----- 执行部分,必选
[EXCEPTION] ---- 异常处理部分,可选
END
范例:
注意:set serveroutput on功能是打开oracle自带的输出方法dbms_output。
2、代码注释和标识符
(1)单行注释
由两个连接字符“--”开始,后面紧跟着注释内容。
(2)多行注释
多行注释由/*开头,由*/结尾
3、数据类型与定义变量和常量
(1)数值类型
数值类型主要包括NUMBER、PLS_INTEGER和
BINARY_INTEGER 3种基本类型。
NUMBER类型通过NUMBER(P,S)的形式格式化数据,其功能可以存储整数或浮点数。
范例:
PLS_INTEGER和BINARY_INTEGER类型只能存储整数
(2)字符类型
字符类型主要包括VARCHAR2、CHAR、LONG、NCHAR
NVARCHAR2等。
VARCHAR2用于存储可变长度字符串
CHAR表示指定长度字符串
LONG表示可变的字符串,以上两个字符类型有大小限制,
而LONG任何字符串都可赋值与它。
NCHAR和 NVARCHAR2根据各国字符集来确定
(3)日期类型(DATE类型)
(4)布尔类型(BOOLEAN类型)
4、特殊数据类型
(1)%TYPE类型
使用%TYPE关键字可以声明一个与指定列名称相同的数据
类型,它通常紧跟在指定列名后面。
范例:
(2)RECORD类型(结构化的数据类型)
RECORD类型也称记录类型,该类型的变量可以存储多个列值 组成的一行数据。
范例:
(3)%ROWTYPE
该类型结合了%TYPE类型和RECORD的优点,其根据数据表中行的结构定义一种特殊的数据类型,用来存储从数据表中检索到的一行数据。
范例:
修改后:
5、定义常量和变量
(1)定义变量
变量是指其值程序在运行过程中可以改变的数据存储结构
其语法结构:
<变量名><数据类型>[(长度):=<初始值>]
(2)定义常量
常量是指其值在程序运行过程中不可以改变的数据存储结构
其语法结构:
<常量名>constant<数据类型>:=<常量值>
6、流程控制语句
(1)选择语句
If...then 语句
注:如果要判断if后面的条件表达式为空值,则需要在条件表达式中使用“is”和“null”关键字。 其代码如下:
If 表达式 is null then
....
end if;
if...then...else语句
范例:
If...then...elsif语句
功能:实现多分支判断语句
范例:
Case语句
范例:
(2)循环语句
loop语句
loop语句会先执行一次循环体,然后在判断“exit when”关键字后面的表达式的值是true或false。
范例:
while语句
while语句根据它的条件表达式的值执行零次或多次循环体,在每一次执行循环体之前,必先判断条件表达式的值。
范例:
for语句
for语句 是一个可以预置循环次数的循环控制语句
范例:
7、PL/SQL游标
游标:表中进行数据检索并操作的灵活手段
游标主要用在服务器上,处理由客户端发送给服务端的SQL语句,或是批处理、存储过程、触发器中的数据处理请求。
游标分为显示游标和隐示游标
(1)显示游标
由用户声明和操作的一种游标,通常用于查询结果集,其步骤包括:声明游标、打开游标、读取游标、关闭游标。
声明游标
声明游标主要包括游标名称和游标提供结果集的SELECT语句
其语法如下:
cursor 游标名 [输入参数]
[返回值类型]
is SELECT语句
打开游标
其语法如下:
open 游标名[输入参数];
读取游标
其语法如下:
fetch 游标名 into {变量};
关闭游标(释放系统资源)
其语法如下:
close 游标名称
范例:
(2)游标属性
%found:布尔型属性,如果SQL语句至少影响到一行数据,则该属性为true,否则为false。
%notfound:布尔型属性,与%found属性的功能相反。
%rowcount:数字型属性,返回受SQL影响的行数。
%isopen:布尔型属性,当游标打开返回true,游标关闭返回false。
范例:
(3)隐式游标
隐式游标主要处理数据操纵语句(如UPDATE、DELETE语句)的执行结果,但是,在一些特殊情况下,也可以处理查询语句。注意一点,当使用隐形属性时,需要在属性前面加上隐式游标的默认名称——SQL。
范例:
(4)通过for语句循环游标
在使用隐式游标或显示游标处理具有多行数据的结果集时,用户可以配合for语句来完成。因为,在for语句遍历循环中,其将计时器看作一个自动的RECORD类型的变量。
范例:
隐式游标
显示游标
注:在使用游标for循环中,可以声明游标,但不用进行打开游标、读取游标和关闭游标等操作,Oracle系统自动完成。
8、PL/SQL异常处理
Oracle将异常分为两大类:预定义异常、自定义异常
(1)预定义异常
Oracle预定义的21个系统异常类型
命名的系统异常 |
产生原因 |
ACCESS_INTO_NULL |
未定义对象 |
CASE_NOT_FOUND |
CASE 中若未包含相应的 WHEN ,并且没有设置 ELSE 时 |
COLLECTION_IS_NULL |
集合元素未初始化 |
CURSER_ALREADY_OPEN |
游标已经打开 |
DUP_VAL_ON_INDEX |
唯一索引对应的列上有重复的值 |
INVALID_CURSOR |
在不合法的游标上进行操作 |
INVALID_NUMBER |
内嵌的SQL 语句不能将字符转换为数字 |
NO_DATA_FOUND |
使用 select into 未返回行,或应用索引表未初始化的元素时 |
TOO_MANY_ROWS |
执行 select into 时,结果集超过一行 |
ZERO_DIVIDE |
除数为 0 |
SUBSCRIPT_BEYOND_COUNT |
元素下标超过嵌套表或 VARRAY 的最大值 |
SUBSCRIPT_OUTSIDE_LIMIT |
使用嵌套表或 VARRAY 时,将下标指定为负数 |
VALUE_ERROR |
赋值时,变量长度不足以容纳实际数据 |
LOGIN_DENIED |
PL/SQL 应用程序连接到 oracle 数据库时,提供了不正确的用户名或密码 |
NOT_LOGGED_ON |
PL/SQL 应用程序在没有连接 oralce 数据库的情况下访问数据 |
PROGRAM_ERROR |
PL/SQL 内部问题,可能需要重装数据字典& pl./SQL 系统包 |
ROWTYPE_MISMATCH |
宿主游标变量与 PL/SQL 游标变量的返回类型不兼容 |
SELF_IS_NULL |
使用对象类型时,在 null 对象上调用对象方法 |
STORAGE_ERROR |
运行 PL/SQL 时,超出内存空间 |
SYS_INVALID_ID |
无效的 ROWID 字符串 |
TIMEOUT_ON_RESOURCE |
Oracle 在等待资源时超时 |
(2)自定义异常
Oracle自定义异常还可分为两类:错误编码异常和业务逻辑异 常两种。
错误编码异常:指在Oracle系统发生错误时,系统会显示错误编码和相关描述信息的异常。
范例:
补充:
EXCEPTION_INIT:将一个特定的错误号与程序中所声明的异常标示符关联起来。
有关ORACLE异常详情可见:http://www.cnblogs.com/soundcode/archive/2012/01/10/2318385.html