zoukankan      html  css  js  c++  java
  • Oracle 包的学习

    (1)包是一种数据库对象,相当于一个容器。将逻辑上相关的过程、函数、变量、常量和游标组合成一个更大的单位。用户可以从其他 PL/SQL 块中对其进行引用

    (2)包类似于C++和JAVA语言中的类,其中变量相当于类中的成员变量,过程和函数相当于类方法。把相关的模块归类成为包,可使开发人员利用面向对象的方法进行开发,具有面向对象程序设计语言的特点,

    (4)PL/SQL的包具有信息隐蔽性(information hiding),仅在算法和数据结构设计有关层可见。可将过程说明和过程体组成一个程序单位。也可将过程说明与它的过程体分开。也可在包中定义过程,而该过程在包说明中没有定义过程说明,这样定义的过程仅在包内使用。

    (5)在PL/SQL程序设计中,使用包不仅可以使程序设计模块化,对外隐藏包内所使用的信息(通过使用私用变量),而写可以提高程序的执行效率。因为,当程序首次调用包内函数或过程时,ORACLE将整个包调入内存,当再次访问包内元素时,ORACLE直接从内存中读取,而不需要进行磁盘I/O操作,从而使程序执行效率得到提高。

    包由两个部分组成:包规范和包体。包定义:包定义部分是为应用程序的接口,声明包内数据类型、变量、常量、游标、子程序和异常错误处理等元素,这些元素为包的公有元素。

      

    CREATE [OR REPLACE] PACKAGE package_name
     
      {IS | AS}
    
       [公有数据类型定义]
    
       [公有游标声明]
    
       [公有变量、常量声明]
    
       [公有子程序声明]
    
    END   [package_name];

    包体:

    CREATE [OR REPLACE] PACKAGE BODY package_name
    
    {IS | AS}
    
                       [私有数据类型定义]
    
                       [私有变量、常量声明]
    
                       [私有子程序声明和定义]
    
                       [公有子程序定义]
    
    BEGIN
    
                       执行部分(初始化部分)
    
    END [package_name];

     举例:包规范

    CREATE OR REPLACE 
    package p_stu
    as
        --定义结构体
        type re_stu is record(
            rname student.name%type,
            rage  student.age%type
        );
        --定义游标
        type c_stu is ref cursor;
        --定义函数
        function numAdd(num1 number,num2 number)return number;
        --定义过程
        procedure GetStuList(cid in varchar2,c_st out c_stu); 
    end;

    包体:

    CREATE OR REPLACE 
    package body p_stu
    as
        --游标和结构体,包规范中已声明,包体中不用再声明,直接使用。
        
        --实现方法   
        function numAdd(num1 number,num2 number)return number
        as
            num number;
        begin
            num:=num1+num2;
            return num;
        end;
        
        --实现过程
        procedure GetStuList(cid varchar2,c_st out c_stu)
        as
            r_stu re_stu; --直接使用包规范中的结构
        begin
            open c_st for select name,age from student where classid=cid;
           -- 如果已经在过程中遍历了游标,在使用这个过程的块中,将没有值。
           -- loop
           --     fetch c_st into r_stu;  
           --     exit when c_st%notfound;
           --     dbms_output.put_line('姓名='||r_stu.rname);
           -- end loop;
        end;
    end;

    调用写的包:

    declare
        c_stu p_stu.c_stu;   --定义包中游标变量
        r_stu p_stu.re_stu;  --定义包中结构体变量
        num number;
    begin
        --使用及遍历包中过程返回的结果集
        p_stu.GetStuList('5',c_stu);
        loop
            fetch c_stu into r_stu;
            exit when c_stu%notfound;
            dbms_output.put_line('姓名='||r_stu.rname);
        end loop;
        
        --使用包中的方法
        select p_stu.numAdd(5,6) into num from dual;
        dbms_output.put_line('Num='||num);
    end;

     TYPE TX_TAB IS TABLE OF TX_TYPE;--定义新类型,是某个类型的集合

      

  • 相关阅读:
    s-hr实现单点登录,看我这份笔记就够了!!!
    S-HR类加载器的区别
    S-HR常用源码
    nginx安装配置参考
    make && make install
    Centos7提示Initial setup of CentOS Linux 7 (core)
    LinkedList的线程安全解决办法
    【开发笔记】- git回退版本: 回退本地代码版本 + 回退服务器代码版本
    【数据结构】- Java字节序、主机字节序和网络字节序扫盲贴
    【开发笔记】
  • 原文地址:https://www.cnblogs.com/bulrush/p/6474707.html
Copyright © 2011-2022 走看看