PL/SQL代码块包括3个部分
声明(Declaration) 可执行命令(Executeable Command) 异常处理(Exception Hading)
典型结构
declare
begin
exception
end;
声明部分以declare关键字开始,后面是变量和游标的定义列表。用户可以定义具有
常量值的变量,并且变量可以继承已存在的列和查询结果中的数据类型。
declare
pi constant NUMBER(9,7):=3.14;
radius integer(5);
area number(14,2);
begin
radius:=3;
area:=pi*power(radius,2);
insert into AREAS values(radius,area);
end;
/ ‘
end行是pl/sql块的结尾标志。根据所使用的工具,可能需要添加/来执行。
通过constant关键字来设置一个常量值。用:=运算符赋值。
或者 pi constant number(9,7):=3.1515;
pi constant number(9,7) default 3.1515;
declare
pi constant number(9,7):=3.1415;
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;
/
定义了一个名为rad_cursor的游标,该游标的定义包括一个游标名称(rad_cursor)和
一个查询(select * from RADIUS_VALS)。游标保存了再pl/sql块中其他命令执行的查询结果
最后声明创建一个变量,并通过游标的结果集设定其结果。
rad_val 变量可以引用该查询的结果集的每一列。在此示例中查询只返回一列。 但如果改表包括多了
可通过rad_val变量引用他们。
除了%rowtype声明外,还可以用%type声明继承数据类型信息。如果使用%rowtype声明,那么该变量
将使游标的结果集中的所有列和相应的数据类型信息。如果使用%type声明。则变量之能继承用于定义它的列的定义。
甚至能够在游标中使用%type定义。
cursor rad_cursor is select * from RADIUS_VALS;
rad_val rad_cursor%rowtype;
rad_val_radius ral_val.Radius%type;
可执行命令部分总是以关键字begin 开头。
在涉及游标的第一个命令中,使用open命令。
open rad_cursor; 当打开rad_cursor游标时,执行声明改游标的查询,并且是不将要返回的记录。
接着从游标中取出记录。
fetch rad_cursor into rad_val;
从游标中取出记录并放到rad_val变量时,扔能访问通过游标的查询选择的每一列的值。当不需要游标的数据时,
可以关闭游标
close rad_cursor;
pl/sql块中可以使用的逻辑
if then
else if then
else
end if;
循环 简单循环:知道循环中遇到exit 或exit when语句时,才跳出循环
For 循环 指定循环次数的循环
while循环 在满足某个条件时循环。
declare
pi constant number(9,7):= 3.1415;
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 迄今为止从游标中取出的行数。
%found,%notfound,%isopen属性是布尔型。
所以可以 exit when rad_cursor%notfound;
for循环
在简单循环中,当满足exit条件时循环结束,而在for循环中,循环执行指定的次数。
for循环由关键字for指定,后面是用来决定循环过程合适完成以及循环何时退出的条件。由于循环
执行的次数在循环开始时设置 因此在循环中不在需要exit命令。
列子。
declare
pi constant number(7,2):=3.1415;
area number(14,2);
radius integer(5);
begin
for radius in 1..4 loop
area:=pi*power(radius,2);
insert into AREAS values(radius,area);
end loop;
end;
游标for循环。
在for 循环中,循环执行指定的次数,而在游标for循环中,循环执行的次数由查询的结果动态决定。
在游标for循环中,打开游标,取出游标,和关闭游标隐式完成。不需要显式指定这些操作。
declare
pi constant number(9,7):=3.1415;
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_cursor游标,并将取出的值放入rad_val变量中。当该游标中没有记录时,
退出循环,游标关闭。在游标for循环中,不需要close命令。 注意rad_val没有在块中显式
的声明。
while循环。
直到满足退出条件。while循环才会结束。在此种循环中,不再用exit命令指定退出循环的条件。
而是在循环的开始用while命令指定退出循环的条件。
declare
pi constant number(9,7):=3.1415;
area number(14,2);
cursor rad_cursor is select * from RADIUS_VALS;
begin
radius:=3;
while radius<=7
loop
area:=pi*power(radius,2);
insert into AREAS values(radius,area);
radius:=radius+1;
end loop;
end;