包(package) 作用:逻辑对象的一种。对相关存储过程、函数、变量的封装。 a 封装,便于调用 b 统一授权 系统内置包:dbms_output。用于输出。 standard:常用的函数。异常的定义 自定义包: 包头:package。声明公有的函数、存储过程及公有变量。 包体:package body。实现包头声明的函数、存储过程。定义私有变量。 --调用系统的内置包 begin sys.dbms_output.put_line('111'); sys.dbms_output.put_line( sys.standard.LTRIM(' bbb ') ); end; --创建自定义包。四则运算工具包 --创建包头 create or replace package my_math_pack is ver varchar2(20):='v0.1版本'; --声明并初始化公有变量 procedure showauthor; --声明1个公有存储过程。显示作者 function add(i number,j number) return number; --声明1个公有函数。加法运算 function div(i number,j number) return number; --声明1个公有函数。除法运算。 end; --创建包体 create or replace package body my_math_pack is -- 实现1个公有存储过程。显示作者 procedure showauthor as begin dbms_output.put_line('作者:老白'); end; --实现1个公有函数。加法运算 function add(i number,j number) return number as begin return i+j; end; --实现1个公有函数。除法运算。 function div(i number,j number) return number as begin return i/j; end; end; --调用自定义包 begin --调用包里的函数 dbms_output.put_line(system.my_math_pack.add(8,9)); system.my_math_pack.showauthor(); --显示包的公有变量 dbms_output.put_line(system.my_math_pack.ver); end; --练习 /* 创建自定义包 my_string_pack 包含 2个函数声明 函数1,返回2个字符串中,长度较长的那个 函数2,如果字符串2是字符串1的子串,返回1,否则返回0. */ create or replace package my_string_pack is function getlonger(str1 varchar2,str2 varchar2) return varchar2; function isexists(str1 varchar2,str2 varchar2) return number; end; create or replace package body my_string_pack is function getlonger(str1 varchar2,str2 varchar2) return varchar2 as begin if (length(str1)>length(str2)) then return str1; else return str2; end if; end; function isexists(str1 varchar2,str2 varchar2) return number as begin if (instr(str1,str2)>'0') then return 1; else return 0; end if; end; end; begin dbms_output.put_line(my_string_pack.getlonger('aaa','bbb')); dbms_output.put_line(my_string_pack.isexists('aaa','bb')); end; --- 案例2,创建my_emp_pack,对emp表进行如下操作 /* 1 存储过程,输出所有工资大于等于指定工资的员工号,员工姓名及工资 2 函数。获取指定部门号且岗位为"CLERK"的员工的最高工资 */ --包头 create or replace package my_emp_pack is procedure show_sal_greater_than( in_sal number ) ; function get_max_sal( v_deptno number )return number; end; --包体 create or replace package body my_emp_pack is procedure show_sal_greater_than( in_sal number ) as --声明1个游标 cursor v_cur is select empno,ename,sal from scott.emp where sal>=in_sal; v_eno scott.emp.empno%type; v_ename scott.emp.ename%type; v_sal scott.emp.sal%type; begin --打开 if (not v_cur%isopen) then open v_cur; end if; --依次提取 loop exit when (v_cur%notfound); fetch v_cur into v_eno,v_ename,v_sal; dbms_output.put_line('第'||v_cur%rowcount||':'||v_eno ||','||v_ename||','||v_sal); end loop; --关闭 close v_cur; end; function get_max_sal( v_deptno number )return number as v_max number; begin select sal into v_max from scott.emp where deptno = v_deptno and job='CLERK'; return v_max; exception when no_data_found then dbms_output.put_line('找不到记录'); return -1; end; end; begin --system.my_emp_pack.show_sal_greater_than('15000'); dbms_output.put_line(system.my_emp_pack.get_max_sal('40')); end;