前言: 包(package)的主要作用是用于逻辑组合相关的pl/sql类型,比如记录类型或者集合类型,pl/sql游标或者游标声明以及pl/sql子程序,还可以包含任何可以在块的声明区中定义的变量。一旦创建了一个包,包就会被存储在Oracle数据库中。可以将包放到共享池中,以便被多个应用程序共享和调用。一个pl/sql包包括包规范和包体两部分。平时调试经常使用的dbms_output就是oracle的一个系统包。

    一>一个简单的包的包规范和包体小例子

create or replace package emp_pkg as
       -----定义集合类型
       type emp_tab is table of emp%rowtype index by binary_integer;
       -----在包规范中定义一个记录类型
       type emprectyp is record(emp_no number,sal number);
       ----定义一个游标申明
       cursor desc_salary return emp;
       ----定义雇佣员工的过程
       procedure hire_employee(p_empno number,p_ename varchar2,p_job varchar2,p_mgr number,p_sal number,p_comm number,p_deptno number);
       -----定义解雇员工的过程
       procedure fire_employee(p_emp_id number);
end emp_pkg;

create or replace package body emp_pkg
as
       -----定义游标申明的游标体
       cursor desc_salary return emp is select * from emp order by sal desc;
       -----定义雇佣员工的具体实现
       procedure hire_employee(p_empno number,p_ename varchar2,p_job varchar2,p_mgr number,p_sal number,p_comm number,p_deptno number) is
       begin
         insert into emp (empno) values('3360');
       end;
       ----定义解雇员工的具体实现
       procedure fire_employee(p_emp_id number) is
       begin
          ----从emp表中删除员工信息
          delete from emp where empno=p_emp_id;
       end;
end emp_pkg;

    二>dbms_job包创建定时任务使用

create table t(
 id varchar2(30),
 name varchar2(30)
);
create or replace procedure proce_t is
begin
 insert into t(id, name) values('1', to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'));
 commit;
end proce_t;
/
declare
    jobno number;
begin
 dbms_job.submit(jobno,'proce_t;',sysdate,'sysdate+1/24/60');
 commit;
end;
select * from user_jobs;
select * from t;