PL/SQL块结构分为两种:匿名块和命名块。
PL/SQL块分成三个部分:
declare ---可选
定义部分:包括定义常量、变量、游标、异常以及复杂的数据类型等
begin ----必选
执行部分:包含了要执行的PL/SQL语句和SQL语句,用于实现应用模块的功能
exception ----可选
--异常处理部分
end; ----必选
最简单的PL/SQL块:
BEGIN
NULL;
END;
其中NULL语句是一个可执行语句,表示什么都不做,相当于一个不执行任何操作的占位符。
但是如果代码如下:
begin
end;
则会报错,因为PL/SQL块至少得有一条执行命令。
匿名块举例:
----循环结构示例,演示循环为所有员工加薪
declare
v_deptcount number(2); --定义记录数变量
v_deptno number(2) := 60; --定义并为变量赋初值
begin
--查询SQL语句,将字段值写入变量
select count(1)
into v_deptcount
from dept
where deptno = v_deptno;
--如果记录数为0,表示无此编号的部门
if v_deptcount = 0
then
insert into dept
values(v_deptno,'财务部','深圳');
--写入屏幕信息
dbms_output.put_line('成功插入部门资料!');
end if;
exception
when others
then
dbms_output.put_line('部门资料插入失败!');
end;
嵌套块:PL/SQL块中可以嵌套子块,嵌套的块既可以放在外部块的执行部分,也可以放在异常处理部分,但是不能放在声明部分,内部嵌套块可以访问外部块中定义的变量,但是外部块不能访问内部快中定义的变量
--使用嵌套块更新和插入部门表
declare
v_deptcount number(2);
v_deptno number(2) := 60;
v_deptname varchar2(12);
begin
--内部嵌套块
begin
select dname into v_deptname from dept where deptno = v_deptno;
dbms_output.put_line('你查询的部门名称为:'||v_deptname);
end;
--内部嵌套块
declare
v_loc varchar2(10) := '深圳罗湖';
begin
--执行更新操作
update dept set loc = v_loc where deptno = v_deptno;
dbms_output.put_line('在内部嵌套块中成功更新部门资料!');
end;
exception
when no_data_found
then
begin
insert into dept
values(v_deptno,'财务部','深圳');
dbms_output.put_line('在异常处理嵌套块成功插入部门资料!');
exception
when others
then
dbms_output.put_line(sqlerrm);
end;
end;
命名嵌套块
--命名嵌套块
declare
v_deptcount number(2);
v_deptno number(2) := 60;
v_deptname varchar2(12);
begin
--内部嵌套块
<<查询员工名称块>>
begin
select dname into v_deptname from dept where deptno = v_deptno;
dbms_output.put_line('你查询的部门名称为:'||v_deptname);
end;
--内部嵌套块
<<更新员工纪录块>>
declare
v_loc varchar2(10) := '深圳罗湖';
begin
--执行更新操作
update dept set loc = v_loc where deptno = v_deptno;
dbms_output.put_line('在内部嵌套块中成功更新部门资料!');
end;
exception
when no_data_found
then
<<插入员工记录块>>
begin
insert into dept
values(v_deptno,'财务部','深圳');
dbms_output.put_line('在异常处理嵌套块成功插入部门资料!');
exception
when others
then
dbms_output.put_line(sqlerrm);
end;
end;
从代码中可以看出,匿名块和命名块最大的不同在于命名块具有了一个语句块名称的声明,其余内容完全一致。