PL/SQL 包含在称之为块的结构中;
如果要创建一个存储过程或程序包,应当给PL/SQL代码块起一个名字;
如果没有给PL/SQL代码块起名字,给代码块被称为匿名块。
- 声明Declaration:定义并初始化块中使用的变量和游标
- 可执行命令Executable Command:用流控制命令(如if命令和循环)执行命令并给声明的变量赋值
- 异常处理Exception Handing:提供对错误情况的定制处理
典型的PL/SQL块结构如下所示:
declare
<declaration section>
begin
<executable command>
exception
<exception handing>
end;
声明部分:
声明部分是P/SQL块的开始,声明部分以declare关键字开始,后面是变量和游标的定义列表。
用户可以定义具有常量值的变量,并且变量能够继承已存在的列和查询结构中的数据类型。
程序:
计算一个圆的面积,并将结果保存到一个名为AREAS的表中,AREAS表有两列,分别用于存储半径和面积。
计算圆面积的公式为半径的平方乘以常量π。
declare
pi constant NUMBER(9,7) := 3.1415927;
radius INTEGER(5);
area NUMBER(14,2);
begin
radius := 3;
area := pi*power(radius, 2);
insert into AREAS values (radius, area);
end;
/
/ - 用于执行PL/SQL块。
执行之后,将会得到Oracle的响应信息:
PL/SQL procedure successfully completed.
程序:
声明一个游标来检索RADIUS_VALS表中的记录。
RADIUS_VALS表只有一列-Radius列,它用来保存示例使用的半径。
该游标在声明部分声明,rad_val变量被声明为基于游标结果的数据类型。
declare
pi constant NUMBER(9,7) := 3.1415927;
area NUMBER(14,2);
cursor rad_cursor is
select * from RADIUS_VALS;
rad_val rad_cursor%ROWTYPE;
begin
open rad_cursor;
fetch rad_cursor into rad_val;
area := pi*power(rad_val.radius, 2);
insert into AREAS values (rad_val.radius, area);
close rad_cursor;
end;
/
采用%ROWTYPE %TYPE定义数据类型的优点:可以使PL/SQL代码中数据类型的定义与基础数据结构无关。
可执行部分:
在关键字begin之后,PL/SQL块开始工作。
条件逻辑:
在PL/SQL中,可以使用if,else,elsif,continue和case命令来控制可执行命令部分的命令流。
if <some condition>
then <some command>
elsif <some condition>
then <some command>
else <some command>
end if;
if条件可以相互嵌套
if <some condition>
then
if <some condition>
then <some command>
end if;
else <some command>
end if;
通过if嵌套,可以快速开发出复杂的逻辑流程;
但是,不要使流程过于复杂,应当经常检查逻辑条件是否能够组合成更简单的形式。
程序:
如果圆面值大于,插入AREAS表。
declare
pi constant NUMBER(9,7) := 3.1415927;
area NUMBER(14,2);
cursor rad_cursor is
select * from RADIUS_VALS;
rad_val rad_cursor%ROWTYPE;
begin
open rad_cursor;
fetch rad_cursor into rad_val;
area := pi*power(rad_val.radius, 2);
if area > 30
then
insert into AREAS values (rad_val.radius, area);
end if;
close rad_cursor;
end;
/
循环:
- 简单循环 - 直到循环中遇到exit或exit或exit when语句时,才跳出循环
- FOR循环 - 指定循环次数的循环
- WHILE循环 - 在满足某个条件时循环
程序 - 简单循环:
在AREAS表中生成多行,此循环一loop关键字开始,exit when子句确定何时退出循环。
end loop子句标识循环的结束。
declare
pi constant NUMBER(9,7) := 3.1415927;
radius INTEGER(5);
area NUMBER(14,2);
begin
radius := 3;
loop
area := pi*power(radius, 2);
insert into AREAS values (radius, area);
radius := radius+1;
exit when area > 100;
end loop;
end;
/
程序 - 简单的游标循环:
可以使用游标的属性作为退出循环的条件;
- %FOUND - 可以从游标中取出1条记录
- %NOTFOUND - 不能从游标中取到记录
- %ISOPEN - 游标已经打开
- %ROWCOUNT - 迄今为止从游标中取出的行数
declare
pi constant NUMBER(9,7) := 3.1415927;
area NUMBER(14,2);
cursor rad_cursor is
select * from RADIUS_VALS;
rad_val rad_cursor%ROWTYPE;
begin
open rad_cursor;
loop
fetch rad_cursor into rad_val;
exit when rad_cursor%NOTFOUND;
area := pi*power(rad_val.radius, 2);
insert into AREAS values (rad_val.radius, area);
end loop;
close rad_cursor;
end;
/
程序 - FOR循环:
在FOR循环中,循环执行指定次数。
FOR循环的开始由关键字for指定,后面是用来决定循环过程中何时完成以及循环何时退出的条件。
由于循环执行的次数在循环开始的时候设置,因此在循环中不需要exit命令。
declare
pi constant NUMBER(9,7) := 3.1415927;
radius INTEGER(5);
area NUMBER(14,2);
begin
for radius in 1..7 loop
area := pi*power(radius, 2);
insert into AREAS values (radius, area);
end loop;
end;
/
程序 - 游标FOR循环:
在游标FOR循环中,循环执行的次数由查询的结果动态决定。
在游标FOR循环中,打开游标,取出游标和关闭游标隐式完成,不需要显式指定这些操作。
declare
pi constant NUMBER(9,7) := 3.1415927;
area NUMBER(14,2);
cursor rad_cursor is
select * from RADIUS_VALS;
begin
for rad_val in rad_cursor
loop
area := pi*power(rad_val.radius, 2);
insert into AREAS values (rad_val.radius, area);
end loop;
end;
/
请注意:rad_val没有在块中显式地声明。
程序 - WHILE循环:
知道满足退出条件,WHILE循环才会结束。
在循环中用while命令指定退出循环的条件。
delete from AREAS;
declare
pi constant NUMBER(9,7) := 3.1415927;
radius INTEGER(5);
area NUMBER(14,2);
begin
radius := 3;
while radius <=7
loop
area := pi*power(radius, 2);
insert into AREAS values (radius, area);
radius := radius+1;
end loop;
end;
/
使用CONTINUE 和 CONTINUE WHEN语句
可以在循环中使用continue语句退出循环的当前迭代,并将控制权转交给下一次迭代。
例如:如果通过一组计数器值进行迭代,就可以跳过指定的值而不完全退出循环。
declare
pi constant NUMBER(9,7) := 3.1415927;
radius INTEGER(5);
area NUMBER(14,2);
begin
radius := 1;
loop
if radius < 5 then
continue;
end if;
area := pi*power(radius, 2);
insert into AREAS values (radius, area);
radius := radius + 1;
exit when area > 100;
end loop;
end;
/
也可以直接使用continue when radius < 5
CASE语句
可以使用case语句控制PL/SQL块中的分支逻辑。
例如,可以使用case语句按条件赋值,或者在插入值之前进行转换。
declare
pi constant NUMBER(9,7) := 3.1415927;
area NUMBER(14,2);
cursor rad_cursor is
select * from RADIUS_VALS;
rad_val rad_cursor%ROWTYPE;
begin
open rad_cursor;
loop
fetch rad_cursor into rad_val;
exit when rad_cursor%NOTFOUND;
area := pi*power(rad_val.radius, 2);
case
when rad_val.radius = 3
then
insert into AREAS values (rad_val.radius, area);
when rad_val.radius = 4
then
insert into AREAS values (rad_val.radius, area);
when rad_val.radius = 10
then
insert into AREAS values (0, 0);
else raise CASE_NOT_FOUND;
end case;
end loop;
close rad_cursor;
end;
/
如果省略else关键字,则PL/SQL隐式增加以下else子句:
else raise CASE_NOT_FOUND;
case子句经常用于把一列值转换成相应的说明。
异常处理部分
在异常处理部分,用when子句判断出发哪个异常,即执行哪段代码。
如果在PL/SQL块的可执行部分触发一个异常,则命令流立即退出可以执行命令部分
并在异常处理部分中搜索与遇到的错误相匹配的异常。
PL/SQL提供了一组系统定义的异常,并允许用户自定义的异常。
异常部分总是以exception关键字开始,并放在终止PL/SQL块的可执行命令部分的end命令之前。
declare
<declarations section>
begin
<executable command>
exception
<exception handing>
end;
PL/SQL 块中异常处理部分是可选的。
程序 - 异常处理:
当除以零的情况下,会有错误出现,需要exception处理。
declare
pi constant NUMBER(9,7) := 3.1415927;
radius INTEGER(5);
area NUMBER(14,2);
some_variable NUMBER(14,2);
begin
radius := 3;
loop
some_variable := 1/(radius -4);
area := pi*power(radius, 2);
insert into AREAS values (radius, area);
radius := radius+1;
exit when area > 100;
end loop;
exception
when ZERO_DIVIDE
then insert into AREAS values(0,0);
end;
/
可以使用when others子句处理在异常处理部分中未定义过的所有异常。
一旦遇到异常,就不能返回到可执行命令部分中正常的命令处理流了。
如果需要保持在可执行命令部分中,就应当在程序遇到可能的异常之前用if条件去测试它们。
分享到:
相关推荐
- **PL/SQL简介**:PL/SQL(Procedural Language for SQL)是Oracle数据库的一种内嵌式过程化语言,用于增强SQL的功能。它允许在SQL查询的基础上添加控制流语句、变量定义、错误处理等特性。 - **环境搭建与配置**:...
PL/SQL是Oracle数据库系统中的一个关键组成部分,它是一种过程化语言,专为数据库操作设计。这个"PL/SQL最新中文手册"显然是一份详细解释PL/SQL 7.0版本的指南,对于学习和精通Oracle数据库编程至关重要。以下是手册...
Oracle 10g PL/SQL 是Oracle数据库系统中用于创建和管理存储过程、函数、触发器等数据库对象的编程语言。本教程旨在为初学者提供一个全面的学习平台,同时也为经验丰富的开发者提供参考资料。PL/SQL是Oracle特有的...
PL/SQL是Oracle公司开发的一种过程化语言,全称为Procedural Language/Structured Query Language,它是SQL的一个扩展,专门用于处理Oracle数据库系统。这个“PL/SQL工具”显然是一个用于辅助管理和操作Oracle数据库...
#### 一、PL/SQL简介 PL/SQL(Procedural Language for SQL)是一种过程化语言,它结合了SQL的数据操纵功能和过程化语言的控制结构,使用户能够灵活地控制数据操作流程。作为Oracle数据库的核心组成部分之一,PL/...
PL/SQL Developer是一款由Allround Automations公司开发的专业Oracle数据库开发工具,专为编写、调试、测试和管理PL/SQL代码而设计。标题中的“pl/sql developer11.0”指的是该软件的第11个主要版本。在本文中,我们...
Oracle PL/SQL是一种强大的编程语言,它结合了SQL的数据处理能力与PL的程序设计特性,是Oracle数据库系统中用于创建存储过程、函数、触发器和包的主要工具。在这个"Oracle PL/SQL实战(待续)"的主题中,我们将深入...
**4.1 PL/SQL简介** PL/SQL的特点包括: 1. 高性能:它能够处理大规模的事务处理,支持所有数据处理命令,并且可以在Oracle环境中运行。 2. 全面的数据类型支持:PL/SQL兼容所有SQL数据类型和Oracle对象类型。 3. 可...
PL/SQL是Oracle数据库系统中的一个关键组件,全称为Procedural Language/Structured Query Language,是一种结合了SQL和过程编程语言的工具,主要用于编写数据库应用程序。64位的PL/SQL开发者工具对于那些处理大数据...
1、PL/SQL简介 2、PL/SQL基础 3、记录和表 4、在PL/SQL中使用SQL 5、内置SQL函数 6、游标 7、过程和函数 ...
### Oracle 9i PL/SQL程序设计笔记精要 #### PL/SQL基础知识概览 **标题与描述**:本文档围绕“Oracle 9i PL/SQL程序设计笔记”这一核心主题,深入探讨了PL/SQL语言的基础知识及其在Oracle 9i数据库环境中的应用。...
PL/SQL VCS插件是为开发者提供的一种增强工具,它与PL/SQL Developer整合,目的是为了更好地管理和控制Oracle数据库中的SQL脚本和存储过程的版本。这个安装包结合了Version Control System (VCS)的功能,如Visual ...
Oracle PL/SQL是一种强大的编程语言,它结合了SQL(结构化查询语言)的数据库操作功能与PL/SQL的程序设计特性,广泛应用于Oracle数据库的开发和管理。这本书"Oracle PL/SQL从入门到精通"的配套源代码,显然是为了...
1. **PL/SQL简介**:PL/SQL是Oracle数据库的内置编程语言,用于创建存储过程、函数、触发器和包。它的语法基于SQL,但增加了流程控制、异常处理和数据类型等特性。 2. **变量和数据类型**:PL/SQL支持多种数据类型...
PL/SQL Developer是一款高效、便捷的Oracle数据库管理工具,尤其适合DBA和开发人员使用。免安装的绿色版PL/SQL Developer使得用户无需经历复杂的安装过程,只需解压即可使用,大大简化了软件部署,方便在不同的...
PL/SQL Developer是一款专为Oracle数据库设计的集成开发环境,它极大地简化了PL/SQL语言的编写、调试和管理任务。远程连接Oracle数据库是PL/SQL Developer的一项关键功能,允许用户在本地计算机上操作和管理远程...
PL/SQL简介(第1~2章) PL/SQL中的SQL语句(第3章) 控制结构(第4~7章) 异常处理(第8~10章) 游标(第11~12章) 触发器(第13~14章) 复合数据类型(第15~16章) 动态SQL(第17章) 批量SQL(第18章) 子程序和包...
PL/SQL是Oracle数据库系统中的一个核心组件,全称为“Procedural Language/Structured Query Language”,它是SQL的扩展,增加了编程元素,使得开发者能够编写存储过程、函数、触发器等数据库应用程序。这篇博客主要...