zoukankan      html  css  js  c++  java
  • 公司需求知识自学-Oracle的Package的作用及用法

    Oracle的Package的作用

    简化应用设计、提高应用性能、实现信息隐藏、子程序重载。

    1、Oracle的Package除 了把存储过程放到一堆儿以外还有没有其他的作用(好处)?

    你不觉得把存储过程分门别类是很重要的么,而且不同的package的存储过程可以重 名。
    用package不仅能把存储过程分门别类,而且在package里可以定义公共的变量/类型,既方便了编程,又减少了服务器的编译开销。

    2、如何把现有的存储过程加入到Package中?
    copy and pasty,不过调用的时候要带包名了。

    3、除了使用SQL Plus,还有没有什么工具做Package? 
    也有方便的第三方工具了,不过得自己找了。
    用第三方工具吧,比如sql navigator。www.quest.com

    4、使用SQL Plus编译Package,是否每次都是编译Package中所有的存储过程? 



    包也是一种命名pl/sql块,和存储过程、函数一下,都是在数据库启动的时候就载入内存的。开销的大小很难判断,因为你不用包,但是要完成包的功能的话,还是要用PL/SQL来完成的,服务器一样有开销。相对来说,用包少了SQL的语法分析、解释过程,开销还少一点。 

    “过程一般都不超过20行”那我倒很少遇到。用不用子过程关键要看是不是能定义可重用的子过程,用子过程效率不会低。

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

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

    如何创建包?

    1)包头:

      语法格式:

      CREATE OR REPLACE PACKAGEpackage_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 RETURNtab_02;

    TYPE cur_03 IS REF CURSOR RETURNtab_03;

    TYPE cur_04 IS REF CURSOR RETURNtab_04;

    TYPE cur_05 IS REF CURSOR RETURNtab_05;

    TYPE cur_06 IS REF CURSOR RETURNtab_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 BYKCH;

    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_theparameterIN number);

    PROCEDURE overloadME(p_theparameterOUT number);

    IN ,OUT为参数类型,number为数据类型.两个过程仅在类型上不同时不能重载.

    2.不能根据两个函数的返回类型对其重载

    :

    FUNCTION overloadMeETooRETURN DATE;

    FUNCTION overloadMeETooRETURN NUMER;

    3.重载子程序的参数的类族必须不同,例如,由于CHARVARCHAR2属性同一类族,所以不能重载 .

    PROCEDURE overloadME(p_theparameterIN char);

    PROCEDURE overloadME(p_theparameterIN varchar2);

    4.打包子程序也可以重载

     

    5.包的初始化.

    当第一次调用打包子程序时,该包将进行初始化.也就是说,将该包从硬盘中读入到内存,并启用调用的子程序的编译代码.这时,系统为该包中定义的所有变量分配内存单元.每个会话都有打其打开包变量的副本,以确保执行同一个包子程序的两个会话使用不同的内存单元.

    在大多数情况下,初始化代码要在包第一次初始化时运行.为了实现这一功能,可以在包体中的所有对象之后加入一个初始化代码 .

    语法格式:

    CREATE OR REPLACE PACKAGE BODYpackage_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包存储在服务器和客户端外 ,其他的包均存储在服务器中
  • 相关阅读:
    uoj#214. 【UNR #1】合唱队形
    「集训队作业2018」复读机
    WPF进阶技巧和实战01-小技巧
    03 依赖注入--01控制反转、IoC模式
    01 ASP.NET Core 3 启动过程(一)
    05-IdentityServer4
    IdentityServer4系列[6]授权码模式
    04-授权策略
    03-Jwt在.netcore中的实现
    02-token
  • 原文地址:https://www.cnblogs.com/riskyer/p/3285846.html
Copyright © 2011-2022 走看看