一、什么是PL/SQL?
1、PL/SQL的概念
PL/SQL(Procedural Language/SQL、过程语言/SQL)是结合了Oracle过程语言和结构化查询语言(SQL)的一种扩展语言。具体地讲,PL/SQL就是在普通SQL语句的基础上增加了编程语言的特点,将数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算的程序语言。
2、PL/SQL体系结构
PL/SQL引擎用来编译和执行PL/SQL块或子程序,该引擎驻留在Oracle服务器中。PL/SQL引擎执行过程语句,而将SQL语句发送给Oracle服务器上的SQL语句执行器,由SQL语句执行器执行这些SQL语句。PL/SQL体系结构如下:
3、PL/SQL块简介
PL/SQL 是一种块结构的语言,它将一组语句放在一个块中。PL/SQL程序由3个块组成:声明部分、执行部分、异常处理部分。
PL/SQL块的结构:
DECLARE
--声明部分:在此声明PL/SQL的变量、类型及游标,以及局部的存储过程和函数。
BEGIN
--执行部分:过程及SQL语句,是程序的主要部分,不可省略
[EXCEPTION]
--执行异常处理部分:错误处理,可选
END;
(1)PL/SQL块分类
(2)PL/SQL编码标准
(3)常量和变量(constant)的声明
PL/SQL程序设计中的标识符定义与SQL的标识符定义的要求相同,要求和限制如下:
①标识符名不能超过30个字符
②第一个字符必须为字母
③不分大小写
④不能用减号(-)
⑤不能是SQL保留字
命名——建议的命名方法如下:
给变量和常量声明赋值:
方法一:通过select...into...给变量赋值
DECLARE
v_name VARCHAR2(10);
BEGIN
SELECT stuName INTO v_name FROM Student WHERE stuNo=1001;
dbms_output.put_line(v_name);
END;
方法二:通过赋值操作符 := 给变量赋值
二、数据类型及其用法
1、标量数据类型
标量数据类型包含单个值,没有内部组件。变量数据类型包括数字、字符、布尔值和日期时间值4类数据类型
2、LOB数据类型
Oracle提供了LOB(Large Object)类型,用于存储大的数据对象的类型。Oracle目前主要支持BFILE、BLOB、CLOB及NCLOB。
3、属性类型
属性用于引用变量或数据库列的数据类型,以及表示表中一行的记录类型。PL/SQL支持一下两种属性类型:
①%type
②%rowtype
4、注释
就像其他的高级开发语言一样,为了使PL/SQL程序具有良好的可读性和可维护性,我们在写程序的时候应该注意向程序中添加注释。注释有以下两种形式:
(1)行注释
-- 作用范围是一行。
(2)块注释
/* */ 注释一行或多行。
三、控制语句
PL/SQL程序可通过控制结构来控制命令执行的流程。标准的SQL没有流程控制的概念,PL/SQL提供了丰富的流程控制语句。包括:条件控制、循环控制、顺序控制。
1、条件控制
用于根据条件执行一系列语句。条件控制包括IF语句和CASE语句。
IF语句用法:
CASE语句用法:
2、循环控制
用于重复执行一系列语句。循环控制包括LOOP和EXIT语句,使用EXIT语句可以立即退出循环,使用EXIT WHEN语句可以根据条件结束循环。
在FOR循环中,每循环一次,循环变量自动加1:使用关键字REVERSE,循环变量自动减1,跟在IN REVERSE后面的数字必须是从小到大的顺序,而且必须是整数,不能是变量或表达式。可以使用EXIT退出循环。
3、顺序控制
DECLARE
v_number NUMBER(2):=1;
BEGIN
LOOP
dbms_output.put_line('v_number的值现在为:'||v_number);
v_number:=v_number+1;
IF (v_number>10)THEN
GOTO LabelOffLoop;--跳转到标签为LabelOffLoop的行
ELSE
NULL;--为了使语法有意义,去掉null会报语法错误
END IF;
END LOOP;
<<LabelOffLoop>>--标签
dbms_output.put_line('循环跳转到此处结束!');
END;
四、错误处理
1、预定义错误
Oracle预定义的异常情况大约有24个。对于这种异常情况的处理,无需在程序中定义,由Oracle自动将其引发。参照下表:
DECLARE
v_number NUMBER(2):=1;
BEGIN
v_number:=1/0;
EXCEPTION
-- WHEN zero_divide THEN
-- dbms_output.put_line('0被作为除数了!');
WHEN OTHERS THEN
dbms_output.put_line('发生了异常!');
END;
/*
其中OTHERS确保不会漏过任何异常,如果没有在前面的异常处理部分显示获取命名异常,它就可以获取其余的异常。
PL/SQL块只能有一个OTHERS异常处理程序。
*/
可以使用函数SQLCODE和SQLERRM来返回错误代码和错误文本信息。
DECLARE
v_number NUMBER(2):=1;
BEGIN
v_number:=1/0;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('错误代码:'||sqlcode);
dbms_output.put_line('错误文本:'||SQLERRM);
END;
2、非预定义错误
3、用户自定义错误
DECLARE
v_number NUMBER(2):=1;
out_of_index EXCEPTION;--定义异常类型
BEGIN
LOOP
dbms_output.put_line('v_number的值现在为:'||v_number);
v_number:=v_number+1;
IF (v_number>10)THEN
RAISE out_of_index;--抛出异常情况
ELSE
NULL;
END IF;
END LOOP;
EXCEPTION
WHEN out_of_index THEN
dbms_output.put_line('你已经越界了!!!');
END;
raise_application_error(error_number,error_message)的语法:
error_number表示用户为异常指定的编号。该编号必须是介于20000~20999之间的负整数。
error_message表示用户为异常指定的消息文本。消息长度可长达2048字节。错误消息是与error_number表示关联的文本。
DECLARE
v_number NUMBER(2):=1;
BEGIN
LOOP
dbms_output.put_line('v_number的值现在为:'||v_number);
v_number:=v_number+1;
IF (v_number>10)THEN
raise_application_error(-20001,'你已经越界了!!!');
ELSE
NULL;
END IF;
END LOOP;
END;