• ORACLE 包[转]



    包的作用:

    包可以将任何出现在块声明的语句 ( 过程 , 函数 , 游标 , 游标 , 类型 , 变量 ) 放于包中 , 相当于一个容器 .
    使用包的好处不仅仅是程序的分组管理,还可以使用包中的程序重载,程序过滤等功能.
    包分为两部分 : 包头和包体 .
    在包头中声明的任何对象,都可以被外部程序所访问.在包头中声明的过程,函数等必须在包体进行实现,但类型,变量等可以不在包体中出现.
    在包体中实现的所有子程序(过程,函数等),可以在包头中声明,也可以不声明.如果在包头中未声明那么该子程序则为包的私有子程序,只能在包内被调用而不能被包外的程序所调用.
    如何创建包

    1) 包头 :

    语法格式 :
    CREATE OR REPLACE PACKAGE package_name /* 包头名称 */
    IS|AS pl/sql_package_spec /* 定义过程 , 函数以及返回类型 , 变量 , 常量及数据类型定义 */
    定义包头应当遵循以下原则 :
    1) 包元素位置可以任意安排 . 然而在声明部分 , 对象必须在引用前进行声明 .
    2) 包头可以不对任何类型的元素进行说明 . 例如 , 包头可以只带过程和函数说明语句 , 而不声明任何异常和类型 .
    3) 对过程和函数的任何声明都必须只对子程序和其参数进行描述 , 不能有任何代码的说明 , 代码的实现只能在包体中出现 . 它不同于块声明 , 在块声明中 , 过程和函数的代码可同时出现在声明部分 .
    2. 包体 :
    语法格式 :
    CREATE OR REPLACE PACKAGE BODY package_name/* 包名必须与包头的包名一致 */
    IS | AS pl/sql_package_body /* 游标 , 函数 , 过程的具体定义 */
    包体是与包头相互独立的 , 包体只能在包头完成编译后才能进行编译 . 包体中带有包头中描述的子程序的具体实现的代码段 . 除此之外 , 包体还可以包括具有包体人全句属性的附加声明部分 , 但这些附加声明对于包头是不见的.

    EG: 定义一个包头

    CREATE OR REPLACE PACKAGE select_table
    IS
    END select_tab;
    
    
    EG:
    CREATE OR REPLACE PACKAGE test_package
    IS
    FUNCTION average (cnum IN char) RETURN NUMBER;
    PRODURE student_grade (CUR OUT select_table.cur_04);--CUR 的数据类型是 select_table 包中 cur_o4
    END test_package;
    

      



    包体 :

    CREATE OR REPLACE PACKAGE BODY test_package
    IS
    /* 函数实现开始 */
    FUNCTION average (cnum IN char)
    RETURN NUMBER;
    AS
    avger NUMBER;
    BEGIN
    SELECT AVG(CJ) INTO avger FROM XS_KC WHERE KCH=cnum GROUP BY KCH;
    RETURN(avger);
    END average;
    /* 函数实现结束 */
    
    /* 过程实现开始 */
    PRODURE student_grade
    (CUR OUT select_table.cur_04);
    AS
    OPEN CUR FOR
    SELECT XS.XH ,XS.XM,KC.KCM,XS_KC.CJ
    FROM XS ,XS_KC,KC
    WHERE XS.XH =XS_KC.XH AND XS_KC.KCH=KC.KCH;
    END student_grade;
    /* 过程实现结束 */
    END test_package;
    

      


    重载 :

    包中的函数和过程可以重载
    以下条件不能重载 :
    1. 如果两个子程序的参数仅在名称和类型上不同 , 这两个程序不能重载 .
    PROCEDURE overloadME(p_theparameter IN number);
    PROCEDURE overloadME(p_theparameter OUT number);
    IN ,OUT 为参数类型 ,number 为数据类型 . 两个过程仅在类型上不同时不能重载 .
    2. 不能根据两个函数的返回类型对其重载
    如 :
    FUNCTION overloadMeEToo RETURN DATE;
    FUNCTION overloadMeEToo RETURN NUMER;
    3. 重载子程序的参数的类族必须不同 , 例如 , 由于 CHAR 和 VARCHAR2 属性同一类族 , 所以不能重载 .
    PROCEDURE overloadME(p_theparameter IN char);
    PROCEDURE overloadME(p_theparameter IN varchar2);
    4. 打包子程序也可以重载

    5. 包的初始化 .
    当第一次调用打包子程序时 , 该包将进行初始化 . 也就是说 , 将该包从硬盘中读入到内存 , 并启用调用的子程序的编译代码 . 这时 , 系统为该包中定义的所有变量分配内存单元 . 每个会话都有打其打开包变量的副本 , 以确保执行同一个包子程序的两个会话使用不同的内存单元 .
    在大多数情况下 , 初始化代码要在包第一次初始化时运行 . 为了实现这一功能 , 可以在包体中的所有对象之后加入一个初始化代码 .
    语法格式 :
    CREATE OR REPLACE PACKAGE BODY package_name
    IS|AS
    ............
    BEGIN
    Initialization_code;-- 要运行的初始化代码

    END ;

  • 相关阅读:
    Ne10编译安装
    AR中的SLAM(一)
    2016总结&2017计划
    DSO之光度标定
    DBoW2库介绍
    Kinect2.0 for Mac开箱
    SVO原理解析
    【漏洞复现】PHPCMS wap模块 SQL注入(附EXP)
    【编程开发】PHP---面向对象教程
    【编程开发】Python---列表
  • 原文地址:https://www.cnblogs.com/champaign/p/5882155.html
Copyright © 2020-2023  润新知