• 程序包简单解释


    程序包概述

    程序包是对一系列对象(变量、常量、过程、函数、游标、异常等)的封装,由规范和主体两部分组成。

    包的作用如下:

    • 避免命名冲突和加强模块化管理,便于管理和区分
    • 使用包可以增强安全性
    • 可以创建私有的函数过程,只能被相同包中其他函数和过程调用

    创建一个完整的程序包

    一、语法格式

    --创建包头(创建内外均可使用的变量或常量,告诉外界箱内的东西使外界能使用)
    create [or replace] package 包名 is
    [公有变量声明部分];
    [包内对象声明部分];
    end;
    --创建包体(包内对象定义部分,私有变量声明部分)
    create [or replace] package body 包体 is
    [私有变量声明部分];
    [私有对象定义部分];
    end;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 包体包头兼备才能称之为一个完整的包(包体、包头名一致)
    • 对包头,包体的简单理解举例如下:

    以一个超市促销为假想环境,包头就是超市对外宣称的促销活动,告诉你我们有什么活动;包体就是超市内部制定的促销规则如什么人能参加促销了。。。

    二、代码示例

    • 包内存储无参数存储过程与函数
    
    --创建包头
    create or replace package pac1
    is
           --声明公有变量
           a number:=90;
           
           --声明存储过程p1
           procedure p1;
           
           --声明函数f1
           function f1 return varchar2;
           
    end;
    
    --创建包体
    create or replace package body pac1
    is
           --声明私有变量
           b number:=50;
           
           --存储过程p1定义部分
           procedure p1 is
             begin
               dbms_output.put_line('hello world');
             end;
           --函数f1定义部分
           function f1 return varchar2  is
             begin
               return '你好 世界';
             end;
    end;
    
    --调用
    begin
      pac1.p1;
      dbms_output.put_line(pac1.f1);
    end;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    在这里插入图片描述

    • 包内存储带参数存储过程与函数
    --创建包头
    create or replace package pac2
    is
           --声明公有变量
           a number:=90;
           
           --声明存储过程p1
           procedure p1(v_empno in number);
           
           --声明函数f1
           function f1(v_a in  number) return varchar2;
           
    end;
    
    --创建包体
    create or replace package body pac2
    is
           --声明私有变量
           b number:=5;
           
           --存储过程p1定义部分
           procedure p1(v_empno in number) is
             v_ename varchar2(255);
             begin
               select ename into v_ename from emp where empno=v_empno;
               dbms_output.put_line('姓名:'||v_ename);
             end;
           --函数f1定义部分
           function f1(v_a in number) return varchar2  is
             begin
               dbms_output.put_line(v_a);
               return '你好 世界';
             end;
    end;
    
    --调用    
    begin
      pac2.p1(7566);
      dbms_output.put_line(pac2.f1(pac2.a));
    end;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    在这里插入图片描述

    调用程序包下的内容

    包名.对象名;
    
    • 1

    删除程序包

    --删除包头,包体跟着消失('砍头身死')
    drop package 包头名;
    --删除包体,包头还在
    drop package body 包体名;
    
    • 1
    • 2
    • 3
    • 4

    程序包中游标

    • 显式游标
    --创建包头
    create or replace package pack3 is
      --声明游标a
      cursor a return emp%rowtype;
      --声明存储过程p1
      procedure p1;
    end;
    
    --创建包体
    create or replace package body pack3 is
    		--包头声明了cursor,游标a必须写在该处
           cursor a return emp%rowtype  is select * from emp;
           --存储过程p1定义
           procedure p1 is
             begin
               for i in a loop
                 dbms_output.put_line(i.ename);
               end loop;
             end;
    end;
    
    --调用
    begin
      pack3.p1;
    end;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    在这里插入图片描述

    • ref游标
    --创建包头
    create or replace package pack4 is
      --声明ref游标类型a
      type a is ref cursor;
      --声明存储变量p1
      procedure p1;
    end;
    
    --创建包体
    create or replace package body pack4 is
      --声明私有变量c
      c emp%rowtype;
      --定义p1
      procedure p1 is
          --定义承载ref游标类型的变量b(该变量不能在包外部声明)
          b a;
          begin
           open b for select * from emp;
             loop
               fetch b into c;
               exit when b%notfound;
               dbms_output.put_line(c.ename);
              end loop;
            close b;
          end;
    end;
    
    --调用
    begin
      pack4.p1;
    end;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    在这里插入图片描述

    包头中声明的对象包体中必须定义,包体中定义的对象可以不在包头中声明(变量无所谓因为有公有私有变量存在)

    在这里插入图片描述

    内置程序包

    内置程序包功能如下:

    • 扩展数据库功能
    • 为pl/sql提供对sql功能的访问

    用户 SYS 拥有所有程序包,程序包是公有同义词,可以由任何用户访问

    内置程序包举例如下:
    在这里插入图片描述
    使用举例如下:

    • DBMS_RANDOM包的的使用

    (1)产生随机数

    select dbms_random.random from dual;
    
    • 1

    (2)随机产生指定范围内数

    --随机产生0-100的数字
    select dbms_random.value(0,100) from dual;
    --随机产生0-100的整数
    select trunc(dbms_random.value(0,100)) from dual;
    
    • 1
    • 2
    • 3
    • 4

    (3)随机产生字符串

    /*
    U——生成大写字符
    L——生成小写字符
    A——生成大小写混合的字符
    P——生成任意可打印字符
    X——生成由大写字符和数字构成的字符串。 
    */
    SELECT DBMS_RANDOM.STRING('A', 5) FROM DUAL; 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    Dart 2.18 发布,Objective-C 和 Swift interop
    【Python】文件操作
    Docker 网络学习
    2023年【山东省安全员A证】考试内容及山东省安全员A证考试报名
    基于STM32单片机红外遥控自动泊车智能车
    Spring系统学习 -Spring IOC 的XML管理Bean之P命名空间、实现引入MySQL外部链接属性文件
    几个不错的开源项目
    Linux安装git和maven——拉取代码 --> mvn打包成jar包 --->运行jar包
    调整后每股收益
    python使用MQTT协议详解
  • 原文地址:https://blog.csdn.net/weixin_51371629/article/details/126116446