PL/SQL的包
本文将介绍PL/SQL的包的使用。
我写着文章的目的是为了在我阅读《Oracle.PL.SQL程序设计》一书是做些笔记,并分享给其他同学。
PL/SQL中包的作用
所谓的包,就是把一组PL/SQL的代码元素组织起来,统一存放,它还具有隐藏逻辑,数据的能力。以及定义出拥有会话时间的生命周期的数据的能力。
包可以更容易的管理我们的程序(数据的封装),整体改善程序的性能(缓存静态数据),改善内置的薄弱环节,代码重新编译的需求最小化。所以我们开发时尽量围绕着包来构建我们的应用,减少“模式”级别的过程和函数。
PL/SQL中包能力的演示
CREATE OR REPLACE PROCEDURE get_fullName(in_empno IN NUMBER) IS
full_name varchar2(20);
BEGIN
select in_empno || '-' || ename
into full_name
from emp
where (empno = in_empno);
dbms_output.put_line(full_name);
end;
我们写了一个得到“全名”(工号+姓名)的过程,但是这个过程隐藏了许多问题;
- 参数的定义时in_empno IN NUMBER,采用的时硬编码,当以后emp表结构改变时,可能我们的程序会受影响。所以我们应该改写为in_empno IN emp.empno%type
- full_name varchar2(20); 这里也采用的硬编码,但是由于这个变量是由empno和ename两个列拼接的来的,我们没有现成的列来做%type;
- in_empno || ‘-’ || ename 这里的业务逻辑也是以硬编码的形式,当以后改成以/分隔,我们还需要回过头修改这里。
- 这个select查询可以说是非常常见,在程序中产生了大量的代码冗余。
下面我创建了一个包,这个包分为包规范和包体两部分,包规范主要列出了这个应用程序要使用的全部元素,为开发人员提供了接口。在包规范中我们可以声明各种各样的类型,但是如果要声明游标变量只能使用REF CURSOR。我们还可以在包规范中声明函数和过程,声明函数和过程只需要写声明单元(is|as 之前的部分),并且以分号结尾。
包规范:
create or replace package emp_pkg is
-- Author : LLY19960418
-- Created : 2018/3/6 11:08:54
-- Purpose :
subtype fullname is varchar2(20);
--员工编号和姓名的拼接
function link_no_name(f_no emp.empno%type,f_name emp.ename%type)
return fullname;
-- 拼接名称的方法
procedure get_fullname(p_empno IN emp.empno%type);
-- 提供对外得到拼接后名称的接口。
end emp_pkg;
包体:
create or replace package body emp_pkg is
function link_no_name(f_no emp.empno%type,f_name emp.ename%type) return fullname
is
return_val fullname;
begin
return_val := f_no || '-' || f_name;
return return_val;
end link_no_name;
procedure get_fullname(p_empno IN emp.empno%type)
is
return_val fullname;
begin
select link_no_name(empno,ename) into return_val from emp where empno=p_empno;
dbms_output.put_line(return_val);
EXCEPTION
WHEN NO_DATA_FOUND THEN dbms_output.put_line('员工编号错误');
end get_fullname;
end emp_pkg;
这样的结构优点不言而喻,代码重用性高,管理方便,结构清晰明朗。
写了一半,剩下的待更新呢