知识大全 Oracle的Package的作用及用法

Posted 过程

篇首语:知识是珍贵的宝石,文化的宝石放出的光辉。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Oracle的Package的作用及用法相关的知识,希望对你有一定的参考价值。

Oracle的Package的作用及用法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  公司需求知识自学 Oracle的Package的作用及用法

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

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

  你不觉得把存储过程分门别类是很重要的么 而且不同的package的存储过程可以重 名

  用package不仅能把存储过程分门别类 而且在package里可以定义公共的变量/类型 既方便了编程 又减少了服务器的编译开销

   如何把现有的存储过程加入到Package中?

  copy and pasty 不过调用的时候要带包名了

   除了使用SQL Plus 还有没有什么工具做Package?

  也有方便的第三方工具了 不过得自己找了

  用第三方工具吧 比如sql navigator

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

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

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

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

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

  如何创建包?

   )包头:

  语法格式:

  CREATE OR REPLACE PACKAGEpackage_name /*包头名称*/

  IS|AS pl/sql_package_spec /*定义过程 函数以及返回类型 变量 常量及数据类型定义*/

  定义包头应当遵循以下原则:

   )包元素位置可以任意安排 然而在声明部分 对象必须在引用前进行声明

   )包头可以不对任何类型的元素进行说明 例如 包头可以只带过程和函数说明语句 而不声明任何异常和类型

   )对过程和函数的任何声明都必须只对子程序和其参数进行描述 不能有任何代码的说明 代码的实现只能在包体中出现 它不同于块声明 在块声明中 过程和函数的代码可同时出现在声明部分

   包体:

  语法格式:

  CREATE OR REPLACE PACKAGE BODY package_name/*包名必须与包头的包名一致*/

  IS | AS pl/sql_package_body /*游标 函数 过程的具体定义*/

  包体是与包头相互独立的 包体只能在包头完成编译后才能进行编译 包体中带有包头中描述的子程序的具体实现的代码段 除此之外 包体还可以包括具有包体人全句属性的附加声明部分 但这些附加声明对于包头是不见的

  EG:定义一个包头

CREATEORREPLACEPACKAGE select_table ISTYPE tab_ ISRECORD  (  itnum_ varchar ( )  itnum_ varchar ( ) ); TYPE tab_ ISRECORD (  itnum_ varchar ( )  itnum_ varchar ( )  itnum_ varchar ( ) ); TYPE tab_ ISRECORD (  itnum_ varchar ( )  itnum_ varchar ( )  itnum_ varchar ( )  itnum_ varchar ( ) ); TYPE tab_ ISRECORD (  itnum_ varchar ( )  itnum_ varchar ( )  itnum_ varchar ( )  itnum_ varchar ( ) itnum_ varchar ( ) ); TYPE tab_ ISRECORD (  itnum_ varchar ( )  itnum_ varchar ( )  itnum_ varchar ( )  itnum_ varchar ( ) itnum_ varchar ( ) itnum_ varchar ( ) ); TYPE cur_ ISREF CURSORRETURNtab_ ; TYPE cur_ ISREF CURSORRETURNtab_ ; TYPE cur_ ISREF CURSORRETURNtab_ ; TYPE cur_ ISREF CURSORRETURNtab_ ; TYPE cur_ ISREF CURSORRETURNtab_ ; ENDselect_tab;       EG: CREATEORREPLACEPACKAGE test_package ISFUNCTIONaverage (cnum INchar) RETURNNUMBER; PRODURE student_grade (CUR OUTselect_table cur_ ); CUR的数据类型是select_table包中cur_o ENDtest_package;    包体: CREATEORREPLACEPACKAGE BODY test_package IS/*函数实现开始*/FUNCTIONaverage                         (cnum INchar) RETURNNUMBER; ASavger NUMBER; BEGINSELECTAVG(CJ) INTOavger FROMXS_KC WHEREKCH=cnum GROUPBYKCH; RETURN(avger); ENDaverage; /*函数实现结束*//*过程实现开始*/PRODURE student_grade (CUR OUTselect_table cur_ ); ASOPENCUR FORSELECTXS XH XS XM KC KCM XS_KC CJ FROMXS XS_KC KC WHEREXS XH =XS_KC XH ANDXS_KC KCH=KC KCH; ENDstudent_grade;

  /*过程实现结束*/

  END test_package;

  重载:包中的函数和过程可以重载

  以下条件不能重载:

   如果两个子程序的参数仅在名称和类型上不同 这两个程序不能重载

  PROCEDURE overloadME(p_theparameterIN number);

  PROCEDURE overloadME(p_theparameterOUT number);

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

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

  如:

  FUNCTION overloadMeETooRETURN DATE;

  FUNCTION overloadMeETooRETURN NUMER;

   重载子程序的参数的类族必须不同 例如 由于CHAR和VARCHAR 属性同一类族 所以不能重载

  PROCEDURE overloadME(p_theparameterIN char);

  PROCEDURE overloadME(p_theparameterIN varchar );

   打包子程序也可以重载

   包的初始化

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

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

  语法格式:

CREATEORREPLACEPACKAGE BODYpackage_name IS|ASBEGINInitialization_code; 要运行的初始化代码    END;

  ORACLE 内置包

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

   DBMS_JOB:用于任务调度服务

   DBMS_LOB:用于处理大对象操作

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

   DBMS_SQL包:用于执行动态SQL

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

cha138/Article/program/Oracle/201311/16818

相关参考

知识大全 Oracle回滚段的概念,用法和规划及问题的解决

Oracle回滚段的概念,用法和规划及问题的解决  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 java经典问题大集合

  作用域publicprivateprotected以及不写时的区别  答区别如下  作用域当前类同一package子孙类其他package  public√√√√  protected√√√×  

知识大全 再议package包的问题

  通常package包会把很多人搞糊涂于是我翻阅资料发现java编程思想中有比较详尽  的解释于是与大家分享希望能祝你一臂之力    package解析自己为机器上的一个目录这样一来Java程序运行

知识大全 Annotation之ElementType.PACKAGE

Annotation之ElementType.PACKAGE  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看

知识大全 Java 中的 ClassPath 和 Package

Java中的ClassPath和Package  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!   

知识大全 Java的ClassLoader与Package机制

Java的ClassLoader与Package机制  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 ORACLE中ROWNUM用法总结!

ORACLE中ROWNUM用法总结!  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ORACLE

知识大全 Oracle中的临时表用法汇总

Oracle中的临时表用法汇总  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!语法  在Oracle

知识大全 oracle时间用法

  oracle中小时的表示方法贴出来与大家共享!  小时表示方法to_date(::yyyymmddhh:mi:ss)  小时表示方法to_date(::yyyymmddhh:mi:ss)  sel

知识大全 oracle存储过程的用法

  createtablestuInfo  (  stuIDintprimarykey  stuNamevarchar()  )  createorreplaceprocedureproc  is