1.Oracle中的包和包体
Oracle中的包和包体与java中的接口和类才关系特别类似,我们就根据对比学习一下包和包体吧!
2.oracle包和包体与自定义函数,过程区别
- 2.1 如果直接create 函数,函数不会出现在包里,而是在function目录下面,如果在包里创建,则会出现在包里,他们两者有什么区别?
答:
1)直接创建的函数,是数据公共函数。在调用函数的时候直接调用函数名带上参数就可以。
2)而建在包体里的函数是私有函数,在有在包体里才能直接用函数名带参数调用。
外部程序要调用需要--包名.函数名(参数)--这样去调用。
3.创建Oracle包以及实现包
sql语句如下:
-- 包(pakage)和包体(package body)
-- 首先创建一个包含字段comm的emp表,再创建下面的包和包体
create or replace package test_package
is
-- 声明全局变量:默认奖金数额
g_comm number:=100;
-- 声明存储过程:用于重置奖金数额
procedure proc_reset_comm(p_comm in number);
-- 声明函数:用于求所有员工中最高工资
function func_maxsal_emp return number;
end test_package;
/
create or replace package body test_package
is
-- 实现存储过程
procedure proc_reset_comm(p_comm in number)
is
begin
if nvl(p_comm,0)>g_comm then
g_comm:=p_comm;
end if;
dbms_output.put_line(g_comm);
end proc_reset_comm;
-- 实现函数
function func_maxsal_emp return number
is
v_maxsal emp.sal%type;
begin
select max(sal) into v_maxsal from a_emp;
return v_maxsal;
end func_maxsal_emp;
end;
/
-- 测试包和包体
exec test_package.proc_reset_comm(111);
select test_package.func_maxsal_emp() from dual;
测试是否可以在包体里创建自定义函数
-- 一个已经创建好的自定义函数
-- 编写将字符串倒叙排列的函数:比如输入abc 返回cba
create or replace function func_reverse_abc(str varchar2) return varchar2
is
v_length number(4); --字符串的长度
v_temp varchar2(1); --截取的单个字符
v_result varchar2(1000); --处理后的结果
begin
-- 计算字符串长度
select length(str) into v_length from dual;
-- 使用循环倒叙字符串
for i in reverse 1..v_length loop
v_temp := substr(str,i,1);
v_result:=v_result||v_temp;
end loop;
return v_result;
end;
/
select func_reverse_abc('abc') from dual;
-------------------------------------------------------------------------
-- 现在将自定义函数合并到上面的创建的包和包体中
-- 包(pakage)和包体(package body)
create or replace package test_package
is
-- 声明全局变量:默认奖金数额
g_comm number:=100;
-- 声明存储过程:用于重置奖金数额
procedure proc_reset_comm(p_comm in number);
-- 声明函数:用于求所有员工中最高工资
function func_maxsal_emp return number;
end test_package;
/
create or replace package body test_package
is
-- 1.实现存储过程
procedure proc_reset_comm(p_comm in number)
is
begin
if nvl(p_comm,0)>g_comm then
g_comm:=p_comm;
end if;
dbms_output.put_line(g_comm);
end proc_reset_comm;
-- 2.实现函数
function func_maxsal_emp return number
is
v_maxsal emp.sal%type;
begin
select max(sal) into v_maxsal from a_emp;
return v_maxsal;
end func_maxsal_emp;
-----------------------------------------------------
-- 包中没有的,自定义函数 此处使用create function就直接报错,故删除create
function func_reverse_abc(str varchar2) return varchar2
is
v_length number(4); --字符串的长度
v_temp varchar2(1); --截取的单个字符
v_result varchar2(1000); --处理后的结果
begin
-- 计算字符串长度
select length(str) into v_length from dual;
-- 使用循环倒叙字符串
for i in reverse 1..v_length loop
v_temp := substr(str,i,1);
v_result:=v_result||v_temp;
end loop;
return v_result;
end func_reverse_abc;
end;
/
-------------------------------------------------------------------------
-- 结果说明:在编译运行包和包体时,没有报任何错误
-- 但是在测试自定方法是报错,无法调用这个自定义方法
-- 结论:不能在包体中自定义包中不存在的函数和过程
-- 测试包和包体
exec test_package.proc_reset_comm(111);
select test_package.func_maxsal_emp() from dual;
-- 自定义函数测试(前缀加包名,也测试不成功)
select func_reverse_abc('abc') from dual;