Oracle包的创建

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;

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值