一、PL/SQL是标准SQL的基础上增加了过程化处理的语言,是Oracle对SQL的扩充。与标准SQL相同,PL/SQL也是Oracle客户端工具(如SQL*Plus、Developer/2000等)访问服务器的操作语言。
二、PL/SQL是一种增强了过程化概念的SQL语言,它有以下一下标准SQL所没有的特征:
1、变量(包括预先定义的和自定义的)
2、控制结构(如IF-THEN-ELSE等流控制语句)
3、自定义的存储过程和函数
4、对象类型
三、PL/SQL重要特性:
块结构、变量与常量、循环结构以及游标
1、块结构:块(block)是PL/SQL程序的基本执行单元,所有的PL/SQL程序都是由块组成的,每个块完成程序中的部分工作,这样就可将程序分成多个块,一个标准的块结构如下:
DECLARE // 块的定义部分,这里可以定义PL/SQL变量、自定义类型、游标和局部子程序。是块中的可选部分
BEGIN //块的执行部分,这里放置一些可执行的SQL或PL/SQL语句,这是块中最重要的部分,也是块中必须有的部分,这里必须至少包含一条可执行语句
EXCEPTION //异常处理部分,这里放置对错误进行处理的语句,是块中可选部分,
END;
其中,异常处理部分是用来报告和处理程序运行时遇到的错误,Oracle的这种将错误处理代码从程序的主题中分离出来的结构,使得程序的结构显得非常的清晰。
2、PL/SQL和数据库之间是通过变量来进行数据交换的。变量是一个存储空间,他是在程序中取出数据或传入数据给程序。
变量是在定义部分声明的,每个变量都有一个类型,这个类型决定变量应该存储什么样的数据。
例:
DECLARE
v_Name varchar2(10); //声明为字符型变量
v_CurrentDate DATE; //声明为日期型的变量
v_Salary NUMBER(8,2); //声明为数值型的变量
v_LoopCounter BINARY_INTEDER;//声明为数值型的变量
v_CurrentlyRegistered BOOLEAN; //声明为布尔型的变量
上面是oracle预定义的类型,PL/SQL也支持自定义类型,例如:下面创建一个对象类型:
CREATE OR REPLACE TYPE AuthorObj AS OBJECT (
Author_code char(6),
Name VARCHAR2(10),
Sex NUMBER(1),
birthdate DATE,
address VARCHAR2(30)
);
3、常量的定义与变量的定义类似,只是在定义时必须增加一个关键字CONSTANT,并且同时给他一个值,这以后就不能再给常量进行赋值了,如:
DECLARE
sex_male CONSTANT INT := 1;
sex_female CONSTANT INT := 0;
4、PL/SQL支持多种类型的循环结构,一个循环结构用来重复的执行块中的一些语句。例:
有一张数据库表:
create table Table_A(
num_col NUMBER,
char_col VARCHAR2(60));
下面通过一个简单的循环将数字1到100插入到Table_A表中,
DECLARE
v_LoopCounter BINARY_INTECER := 1;
BEGIN
LOOP
INSERT INTO Table_A(num_col)
VALUES (v_LoopCounter);
v_LoopCounter := v_LoopCounter + 1;
EXIT WHEN := v_LoopCounter > 100;
END LOOP;
END;
还可以用for循环结构:
5、游标用来查询数据库中的数据(例如SELECT语句返回的记录),并对查询的结构进行处理。
游标分为:显式游标、隐式游标
通过游标,可以对查询结果中的数据一条一条进行处理。
例:
DECLARE
v_Name VARCHAR2(10);
v_Salary NUMBER(8,2);
-----游标的定义
CURSOR c_Auths IS
SELECT name, salary
FROM auths;
BEGIN
OPEN c_Auths; //打开游标
LOOP
FETCH c_Auths INTO v_Name,v_Salary; //检索一条记录
EXIT WHEN c_Auths%NOTFOUND; //当所有的记录都被检索出后退出循环
END LOOP; //对检索出的数据进行处理
CLOSE c_Auths; //结束处理
END;
三、PL/SQL的运行:
PL/SQL程序是通过一个引擎来执行的。这个引擎安装在oracle的数据库服务器或一些客户端的应用开发工具(如Oralce Forms或Oralce Reports)中。
这个引擎执行PL/SQL程序中过程性的语句,而将SQL语句送给服务器的SQL语句执行器执行如图:
如果客户端工具中有PL/SQL引擎,则在执行PL/SQL块时,该引擎仅执行处理块中的过程性语句,而将SQL语句送给服务器由SQL语句执行器执行;如果客户端的工具中没有PL/SQL引擎,则客户端工具将PL/SQL块传给服务器端的PL/SQL引擎,在该引擎中处理块中的过程性语句,而将块中的SQL语句送给SQL语句执行器运行。