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;

这样的结构优点不言而喻,代码重用性高,管理方便,结构清晰明朗。
写了一半,剩下的待更新呢