2021-03-10 Oracle 学习之创建包
语法引用:https://www.cnblogs.com/inmeditation/p/12107752.html
一、Oracle版本
Oracle 11.2.0.1.0 - 64bit
Tool SQLPlus
二、包:package
什么是包 package:
包是将功能相近的函数或者存储过程集中到一起,以方便管理。
特性:
1. 函数可以重名,以提高程序的通用性,还可以减少对象名称的占用问题
类似于Java的多态性---方法的重载:函数名相同,参数列表不同,参数类型不同。
2. 使用。一个包内函数被调用,则整个包都会被调入内存中。正是基于此,后续对这个包的调用,都只需要从内存中读取,而不需要再次进行磁盘的读取,因而性能有了提高。
一个包内程序失效,则整个包会重新编译。
3. 组成:包头和包体。
包头:程序对外的接口。不能加密处理。描述了包内函数,存储过程的参数,只有在包头中定义的函数和存储过程,才能外部调用;那些只在宝体内有实现但没有写在包头中的程序,只能在包的内部使用。(全局和局部?)
包体:程序的实现。可以加密。不能独立存在。
三、编写包:package
1. 语法规范
create or replace package package_name --创建包头,定义包的对象名称,如果存在就替换包
is/as --在这里is和as是同义词,没有区别
--声明变量
--声明常量
--类型的定义
--游标的定义
--声明存储过程
procedure procedure_name[(参数 in | out | in out 类型,...)];
--声明自定义函数( ?)
function function_name[(参数 类型,...)] return 返回值类型;
create or replace package body package_name
is
--声明私有对象,私有对象只能包体内部调用,声明在最前面
--声明私有变量
--声明私有常量
--私有函数或存储过程
--共有对象的实现
end package_name;
end package_name;
2. 编写包
create or replace package PK99 --创建包头
is
function F1(nm number) return number;
function F1(nm emp.ename%type) return number;
procedure P1(v_nm number);
end PK99;
create or replace package body PK99 --创建包体
is
function F1(nm in number) return number
is
v_salary emp.sal%type := 0;
begin
select sal into v_salary from emp where empno = nm;
return v_salary;
end F1;
function F1(nm emp.ename%type) return number
is
v_salary emp.sal%type := 0;
begin
select sal into v_salary from emp where empno = nm;
return v_salary;
end F1;
procedure P1(v_nm in number)
is
begin
update emp set sal = sal + 1 where empno = v_nm;
commit;
end P1;
end PK99;
四、验证和调用包内函数
select text from user_source where name = 'PK99'; --查看源程序
desc PK99; --描述包结构
调用包内函数
1. select PK99.F1(7900),PK99.F1('KING') from dual;
2. 在赋值语句中调用包内函数
declare
v1 emp.sal%type;
v2 emp.ename%type;
begin
v1 := PK99.F1(7900);
v2 := PK99.F1('KING');
PK99.P1(7902);
dbms_output.put_line(v1);
dbms_output.put_line(v2);
end;