n 介绍
块(block)是pl/sql的基本成型单元,编写pl/sql程序实际上就是编写pl/sql块。要完成相对简单的应用功能,可能只需要编写一个pl/sql块;但是如果要想实现复杂的功能,可能需要在一个pl/sql块中嵌套其它的pl/sql块。、
n 块结构示意图
pl/sql块由三个部分构成:定义部分、执行部分、例外处理部分,如下所示:
n 案例1--只包括执行部分的pl/sql块。
案例:输出hello,world
☞相关说明:
dbms_output是oracle所提供的包(类似java的开发包),该包包含一些过程,put_line就是dbms_output包的一个过程。
SQL> set serveroutput on; //打开控制台显示,默认不输出,需要执行此命令才会输出显示
SQL>
SQL> begin
2 dbms_output.put_line('hello,world');
3 end;
4 /
hello,world
PL/SQL procedure successfully completed
n 案例2--包括定义部分和执行部分的pl/sql块。
案例:根据用户输入的雇员编号,显示该雇员的名字
☞相关说明:
& 表示要接收从控制台输入的变量
‖表示把两个串拼接
declare --定义变量的格式:变量名称 变量的类型
v_ename varchar2(8);
begin
select ename into v_ename from emp where empno=&empno;--把查询的ename值放入v_ename变量
---输出v_ename
dbms_output.put_line('雇员名是:'||v_ename);
end;
雇员名是:SMITH
PL/SQL procedure successfully completed
将其改为过程
SQL> create procedure pro3(in_empno number) is
2 v_ename varchar2(8);
3 begin
4 select ename into v_ename from emp where empno=in_empno;
5 dbms_output.put_line('雇员名是:'||v_ename);
6 end;
7 /
Procedure created
SQL> exec pro3(7369);
雇员名是:SMITH
PL/SQL procedure successfully completed
n 案例3--包括定义部分和执行部分和例外处理部分。
为了避免pl/sql程序的运行错误,提高pl/sql的健壮性,应该对可能的错误进行处理,这个很有必要:
①比如在案例2中,如果输入了不存在的雇员号,应当做例外处理
②有时出现异常,希望用另外的逻辑处理,比如:如果不存在就加入编号为1,名字为‘马大哈’这么一个人。
我们看看如何完成①的要求
相关说明:oracle事先预定义了一些例外,no_data_found就是找不到数据的例外。
SQL> declare
2 v_ename varchar2(8);
3 begin
4 select ename into v_ename from emp where empno=&empno;
5 dbms_output.put_line('雇员名是:'||v_ename);
6 exception
7 when no_data_found then
8 dbms_output.put_line('朋友,你输入的编号有误');
9 end;
10 /
朋友,你输入的编号有误
PL/SQL procedure successfully completed
对该案例的细节说明:这里我们涉及到异常处理,
异常处理的基本语法:
exception
when 异常的名称 then
//对异常进行处理的代码......
//对异常进行处理的代码......
when 异常的名称2 then
//对异常进行处理的代码......
end;
oracle提供的异常有:(参考pl/sql官方文档)大概23种
有时可以利用异常来进行业务处理。比如:如果不存在就加入编号为1,名字为‘马大哈’这么一个人。
SQL> declare
2 v_ename varchar2(8);
3 begin
4 select ename into v_ename from emp where empno=&empno;
5 dbms_output.put_line('雇员名是:'||v_ename);
6 exception
7 when no_data_found then
8 dbms_output.put_line('朋友,你输入的编号有误!我帮你加入一条');
9 insert into emp (empno,ename) values(1,'马大哈');
10 end;
11 /
朋友,你输入的编号有误!我帮你加入一条
PL/SQL procedure successfully completed