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 包存储在服务器和客户端外 , 其他的包均存储在服务器中 .

  • 相关阅读:
    韩式英语
    Daily dictation 听课笔记
    words with same pronunciation
    you will need to restart eclipse for the changes to take effect. would you like to restart now?
    glottal stop(britain fountain mountain)
    education 的发音
    第一次用Matlab 的lamada语句
    SVN的switch命令
    String的split
    SVN模型仓库中的资源从一个地方移动到另一个地方的办法(很久才解决)
  • 原文地址:https://www.cnblogs.com/qinxike/p/3003425.html
Copyright © 2011-2022 走看看