PLSQL的作用:
PL/SQL通过使用块结构,可以在一个块中包含多个SQL语句以及PLSQL语句,可以将PLSQL块嵌入到应用程序中,使用PLSQL块后,网络上只需要发送一次
plsql块,就可以完成所有sql语句的处理工作,这样大大减少了网络开销。
示例:
创建的员工表中添加一个新的成员,首先需要判断要添加的员工工号是否存在,
如果存在,则更新该工号对应的员工的信息,否则添加一个新的员工;
SQL> select * from t where t.empno='7788';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- ---------- ---------- ----------- ---------- ---------- ----------
7788 SCOTT ANALYST 7566 1982/12/9 3000 20
set serveroutput on
declare
l_empno t.empno%type;
l_ename t.ename%type;
l_job t.job%type;
l_mgr t.mgr%type;
l_hiredate t.hiredate%type;
l_sal t.sal%type;
l_deptno t.deptno%type;
l_error varchar2(200);
begin
l_empno :='7788';
l_ename :='SCOTT';
l_job :='CLERK';
l_mgr :='7777';
l_hiredate :=to_date('20170204','yyyy/mm/dd');
l_sal :='6000';
l_deptno :='10';
---首先进行更新操作
update t
set
ename=l_ename,
job=l_job,
mgr=l_mgr,
hiredate=l_hiredate,
sal=l_sal,deptno=l_deptno where empno=l_empno ;
dbms_output.put_line('员工信息被更新成功');
if sql%notfound then
----插入到表中
insert into t (empno,ename,job,mgr,hiredate,sal,deptno)
values(l_empno,l_ename,l_job,l_mgr,l_hiredate,l_sal,l_deptno);
dbms_output.put_line('插入信息成功');
commit;
end if;
exception
when others then
l_error :=sqlerrm;
dbms_output.put_line(l_error);/*这里也可以直接打印sqlerrm dbms_output.put_line(sqlerrm);*/
end;
/
SQL> declare
2 l_empno t.empno%type;
3 l_ename t.ename%type;
4 l_job t.job%type;
5 l_mgr t.mgr%type;
6 l_hiredate t.hiredate%type;
7 l_sal t.sal%type;
8 l_deptno t.deptno%type;
9 l_error varchar2(200);
10 begin
11 l_empno :='7788';
12 l_ename :='SCOTT';
13 l_job :='CLERK';
14 l_mgr :='7777';
15 l_hiredate :=to_date('20170204','yyyy/mm/dd');
16 l_sal :='6000';
17 l_deptno :='10';
18 ---首先进行更新操作
19 update t
20 set
21 ename=l_ename,
22 job=l_job,
23 mgr=l_mgr,
24 hiredate=l_hiredate,
25 sal=l_sal,deptno=l_deptno where empno=l_empno ;
26 dbms_output.put_line('员工信息被更新成功');
27 if sql%notfound then
28 ----插入到表中
29 insert into t (empno,ename,job,mgr,hiredate,sal,deptno)
30 values(l_empno,l_ename,l_job,l_mgr,l_hiredate,l_sal,l_deptno);
31 dbms_output.put_line('插入信息成功');
32 commit;
33 end if;
34 exception
35 when others then
36 l_error :=sqlerrm;
37 dbms_output.put_line(l_error);/*这里也可以直接打印sqlerrm dbms_output.put_line(sqlerrm);*/
38 end;
39 /
员工信息被更新成功
PL/SQL procedure successfully completed
此时查看7788这个用户的信息
SQL> select * from t where t.empno='7788';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- ---------- ---------- ----------- ---------- ---------- ----------
7788 SCOTT CLERK 7777 2017/2/4 6000 10
总结:
①示例中定义变量类型时可以直接使用l_empno t.empno%type;的方式,其实也可以直接赋值 l_empno varchar2(200) :='7788'的方式。
②在这个PLSQL块中包含了一个更新操作和一个插入操作,其实在实际工作中遇到很多类似需求时也可以考虑使用一个merge into语句来完成这样的功能。
最后还对异常进行了处理,这里的话是打印出异常错误信息,其实我们也可以记录到日志里,这时候就需要建立一张日志表,将l_error插入到表里即可。
③在昨天一个需求当中,需要让存储过程出现错误时抛出异常,让java程序捕获到这个异常信息,来控制整个数据的传送,
想到的方式呢就是在最后加RAISE_APPLICATION_ERROR(-20001,l_error)抛出异常。