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

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;
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值