使用嵌套块
在PL/SQL块中可以嵌套子块,嵌套的块既可以放在外部块的执行部分,也可以放在异常处理部分,但是不能放在外部块声明部分
内部嵌套块可以访问外部嵌套块声明的变量,但是外部声明块不能访问内部声明块中的变量
declare
v_deptno number(2) := 50 ;
v_dname varchar2(12) ;
begin
begin
select dname into v_dname from scott.dept where deptno = v_deptno ;
dbms_output.put_line('您好查找的部门是: '|| v_dname);
end ;
declare
v_loc varchar2(10) := '深圳南山';
begin
update SCOTT.DEPT set loc = v_loc where deptno = v_deptno ;
dbms_output.put_line('在内嵌块中成功更新部门资料! ');
end ;
exception when no_data_found
then begin
insert into scott.dept values(v_deptno,'信息部','深圳') ;
dbms_output.put_line('在异常处理模块成功恢复资料!');
exception when others
then
dbms_output.put_line('未知异常!');
end;
end;
此段程序共有三个begin--end结构。
第一组begin-end 结构是引导整个程序块,所以是主结构;
第二个 是用来查询部门信息的
begin
select dname into v_dname from scott.dept where deptno = v_deptno ;
dbms_output.put_line('您好查找的部门是: '|| v_dname);
end ;
其实这个begin-end 结构可以去掉,并不影响程序执行
第三个是用来更新部门信息的 ,其完整代码如下
declare
v_loc varchar2(10) := '深圳南山';
begin
update SCOTT.DEPT set loc = v_loc where deptno = v_deptno ;
dbms_output.put_line('在内嵌块中成功更新部门资料! ');
end ;
这里的begin-end 结构是不可以去掉的 ,因为在后续语句执行之前 进行了变量定义,
即:declare
v_loc varchar2(10) := '深圳南山';
在一个单一的begin-end结构中是不能再重新定义变量的,除非此时已经决定此变量不属于此begin-end结构,所以这里的begin-end不能删除。
附:使用命名嵌套块
<<外部块>>
declare
v_deptno number(2) := 50 ;
v_dname varchar2(12) ;
begin
<<查询员工名称块>>
begin
select dname into v_dname from scott.dept where deptno = v_deptno ;
dbms_output.put_line('您好查找的部门是: '|| v_dname);
end ;
<<更新员工部门块>>
declare
v_loc varchar2(10) := '深圳南山';
begin
update SCOTT.DEPT set loc = v_loc where deptno = v_deptno ;
dbms_output.put_line('在内嵌块中成功更新部门资料! ');
end ;
exception when no_data_found
then begin
insert into scott.dept values(v_deptno,'信息部','深圳') ;
dbms_output.put_line('在异常处理模块成功恢复资料!');
exception when others
then
dbms_output.put_line('未知异常!');
end;
end;