oracle 包和包体禁用,Oracle包和包体以及与非包体定义函数、过程的区别

Oracle包和包体以及与非包体定义函数、过程的区别。

1.Oracle中的包和包体

Oracle中的包和包体与java中的接口和类才关系特别类似,我们就根据对比学习一下包和包体吧!

213819_0.png

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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值