wuliws 发表于 2018-10-23 07:50:15

PL/SQL - 03

  使用嵌套块
  在PL/SQL块中可以嵌套子块,嵌套的块既可以放在外部块的执行部分,也可以放在异常处理部分,但是不能放在外部块声明部分
  内部嵌套块可以访问外部嵌套块声明的变量,但是外部声明块不能访问内部声明块中的变量
  declare
  v_deptno number(2) := 50 ;
  v_dname varchar2(12) ;
  begin
  begin
  select dnameinto 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 dnameinto 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 dnameinto 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;

页: [1]
查看完整版本: PL/SQL - 03