zoukankan      html  css  js  c++  java
  • Oracle的Package介绍(转)

    Oracle的Package介绍
    http://hi.baidu.com/vabright/item/eb43b5bf967cc0442aebe3df

    ORACLE 包            

    包的作用 : 包可以将任何出现在块声明的语句 ( 过程 , 函数 , 游标 , 游标 , 类型 , 变量 ) 放于包中 , 相当于一个容器 . 将声明语句放入包中的好处是 : 用户可以从其他 PL/SQL 块中对其进行引用 , 因此包为 PL/SQL 提供了全程变量 .

    包分为两部分 : 包头和包体 .

    如何创建包 ?

    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

    TYPE tab_02 IS RECORD

      (

      itnum_1 varchar2(1),

      itnum_2 varchar2(1)

    );

    TYPE tab_03 IS RECORD

    (

      itnum_1 varchar2(1),

      itnum_2 varchar2(1),

      itnum_3 varchar2(1)

    );

    TYPE tab_04 IS RECORD

    (

      itnum_1 varchar2(1),

      itnum_2 varchar2(1),

      itnum_3 varchar2(1),

      itnum_4 varchar2(1)

    );

    TYPE tab_05 IS RECORD

    (

      itnum_1 varchar2(1),

      itnum_2 varchar2(1),

      itnum_3 varchar2(1),

      itnum_4 varchar2(1),

    itnum_5 varchar2(1)

    );

    TYPE tab_06 IS RECORD

    (

      itnum_1 varchar2(1),

      itnum_2 varchar2(1),

      itnum_3 varchar2(1),

      itnum_4 varchar2(1),

    itnum_5 varchar2(1),

    itnum_6 varchar2(1)

    );

    TYPE cur_02 IS REF CURSOR RETURN tab_02;

    TYPE cur_03 IS REF CURSOR RETURN tab_03;

    TYPE cur_04 IS REF CURSOR RETURN tab_04;

    TYPE cur_05 IS REF CURSOR RETURN tab_05;

    TYPE cur_06 IS REF CURSOR RETURN tab_06;

    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 ;

     

     

    ORACLE 内置包

    1.DBMS_ALERT 包 : 用于数据库报警 , 允许会话间通信

    2.DBMS_JOB: 用于任务调度服务

    3.DBMS_LOB: 用于处理大对象操作

    4.DBMS_PIPE 包 : 用于数据库管道 , 允许会话间通信

    5.DBMS_SQL 包 : 用于执行动态 SQL

    6.UTL_FILE 包 : 用于文件的输入输出

    除了 UTL_FILE 包存储在服务器和客户端外 , 其他的包均存储在服务器中 .

  • 相关阅读:
    MySQL 内存溢出
    使用pt-fifo-split 工具往mysql插入海量数据
    Summary: Calculate average where sum exceed double limits
    Pocket Gem OA: Log Parser
    Pocket Gem OA: Path Finder
    Leetcode: Sliding Window Median
    Leetcode: Number Complement
    FB面经 Prepare: Even Tree
    FB面经 Prepare: All Palindromic Substrings
    FB面经 Prepare: Largest Island
  • 原文地址:https://www.cnblogs.com/qinxike/p/3003425.html
Copyright © 2011-2022 走看看