ORACLE程序包的创建与应用.docx
ORAC1.EP1./SQ1.编程详解之七:程序包的创建与应用爆在于学习,对在于飘IU)本Ii主要内容如下I第七章程序包的创建和应用7.1 程序包简介7.2 程序包的定义7.3 包的开发小骤7.4 包定义的说明7.5 子程序巫我7.6 加密好用程序7.7 删除包7.8 包的管理7.1 程序包简介程序包(PACKAGE,简称包)是依相关过程、函数、变址、君玳和游标等P1./SQ1.程序设计元索的组合,作为一个完整的电元存储在数据库中,用名称来标识包.它具有面对对象程序设计语吉的特点,品对这些PIJSQ1.程序设计元案的封袋,包类似于C#和JAVA语言中的类.其中变H相当于类中的成员变Ift,过程和函数相当于类方法,把相关的模块归类成为包,可使开发人员利用面对对软的方法进行存储过程的开发,从而提尚系统性能.与高级语言中的类相同,包中的程序元素也分为公用元费和私用元索两种,这两种元素的区分是他们允许访问的程序范围不同,即它包的作用域不同。公用元素Y、仅可以被包中的腐数、过程所设用,也可以被包外的P1.1SQ1.悭序访问,而私有兀素只能被包内的南敢和过程序所访问.当然,对于不包含在程序包中的过程、函数是独立存在的.侬是先漏叮:独立M过程。而数,待其较为完善或经过充分的:证无误后,再按爱新相关性组织为程序包.程序包的优点管化应用程序设计:程序包的说明枇分和包体部分可以分别创建谷痂洋.主要体现在以下三个方面:1)可以在设计一个应用程序时,只创隹各明译程序包的说明部分,然后再编写引用该程序包的PUSQ1.块,2)当完成个应用程序的整体框架后,再仲I头来定义包体部分.只要不变更包的说明部分,就可以单独调试、增加或昔换包体的内容.这不会影响其他的院用程序.3)更新包的说明后必需取新嫡译引用包的应用程序,但更新包体,则不为童新糊译引用包的应用程序,以快速进行应用程序的原形开发.模块化t可将逻辑相关的PuSQ1.块或元素等如织在一起,用名称来唯一标识程序包.把一个人的功能模块划分人适当个数小的功能模块,分别完成各自的功能,这样殂织的程序包都易于编写,易于理解更易于笆理.信息ZT因为包中的元素可以分为公有元素和私有元索.公有元素可就程序包内的过律*函数等的访问,还可以被包外的PUSQ1.访问。但对于私付元素只能被包内的过程.函数等访问“对于用户,只能知道包的说明,不用了解包体的具体细微环节.效率育:程序包在应用程序第一次调用程序包中的某个元素时,ORAC1.E将杷赘,包加坡到内存中,当其次次访问程序包中的元家时.ORAC1.E将干施从内在中谈取,而不须要进行磁盘Ig操作而影喇速度,同时位于内在中的程序包可被同一会话期间的其它应用程序共享,因此,程序包增加了Jft用性并改善了多用户、名应用程序环境的笠率,对程序包的优点可总结如已在PUSQ1.程序设计中,达用包不仅可以使程序设计模块化.对外急减包内所运用的信息(通过运用私用变技).而写可以提高程序的执行效率.内为当程序首次调用包内函数或过程时,0RAC1.E将整个包调入内存,当再次访问包内元素时,ORAC1.E干脆从内存中读取,而不须要进行送盘IQ操作,从而使程序执行效率得到提高。一个包由两个分开的制分出成:包说明(PACKAGE):包说明郃分声明包内故幅类型、变地、常艮、游标*子程序和异样错误处理等元浓,这些元素为包的公有元素。包主体(PACKAGEBODY);包主体则是包定义部分的具体实现,它定义了包定义制分所再明的游标种子程序,在包主体中还可以声明包的私有元素.包说明和包主体分开编译,弁作为两部分分开的对望存放在数抠咋字典中.可住看数擀字典USer_source,all_source.dt>a_source.分别了解包说明与包主体的具体怡总.7.2 程序包的定义程序包的定义分为打中包说明江义和对序包上体泥乂两部分组成,程序包说明用干部明包的公用组件,如变fit、然母、自定义数据类型、异样、过程、函数、游标等.包说明中定义的公有组件不仅可以在包内运用,还可以由包外其他过程、函数.但须要说明。留意的是.我们为了实现信息的隐藏.建议不要将全部组件都放在包说明处声明,只战把公共组件放在包声明部分.包的名称是唯一的.但.对于两个包中的公付如件的Z称可以相同,这种用“包名.公有组件名“加以区分。包体是包的具体实现细微环节,其实现在包说明中声明的全部公有过程、函数、游标等.当然也可以在包体中声明仅由于自己的私有过程、函数、游标等.创建包体时,右以下几点须要留意,包体只能在包说明被创建或编译后才能进行创建或漏详在包体中实现的过程、函数'游标的名珍必需与包说明中的过程、函数'游标样,包括名称、一数的名粽以及参数的模式(IN.OUT.INOUT).弁建设按包说明中的次序定义包体中具体的实现.在包体中刖明的数据类型、变量、常量都是私有的,只能在包体中运用而不能被印刷体外的应用程序访问与运用.在包体执行部分,可对包说明,包体中声明的公布.或私有变贵进行初始化或其它设置.创建程序包说明语法格式:CREATEIORREP1.ACE)PACKAGEPaUkagJname(AUTHIDICURREZJUSERIDEFINER)IISASJ【公有数据类型定义公有数3三类型定义:.)1公有油标声明I公有游标声明1.I公有安.常量声明1公有变.觉0声明IM公有的数声明I公有的财明J-.】(公有过程声明I公有过程声明1-1EHDpackage_nar/'其机AlTHIDCURRENTSER和AITHIDDE门M:R选项说明应用程序在调用函数时所运用的权限模式,它们与(Ri-Vil-I<语句中invoker_right_clause子句的作用相同。创建程序包主体语法格式:CREATEIORREP1.ACEPACKAGEBODYPaCkage_nam。(ISASJ!极有数据类型定义私有数据类里定义:.(私有受.常声明I私有交爆.甫窗声明I私有异样错误向的私有异"错误声明I.“)I格有函数声明和定义:丛有函数声明碇义1.-1I极有的过程声明和定义私有的过程声明和定义i-)公有油标定义i公有游标定义)M公有函数定义1公有函数定义J.J【公有过程定义I公有过程定义)_】BEGIN执行部分,初始化部分)KNDpackag-nam;其中i小包JE体定义公科程芹时,它们必需与机定义中所声明子程序的格斯金多7.3包的开发步融与开发存储过程类似,包的开发须要几个步骤:1,将每个存储过程调式正确i2 .用文本编辑软件将各个存储过程和函数量成在一起:3 .根据包的定义要求将境成的艾本的前面加上包定义:4 .WiIK包的定义要求将集成的文本的蔺而加上包上体:5 .运用SQ1.P1.US或开发工具进行iB?式。6 .4包定义的说明例1:创建的包为DEMC1.PKG,核包中包含个记柔变量DEPTREU两个函数和个过程,实现对dept表的增加、制除与吉询.CREATE-REP1.ACEPACKAGEDEM3_PKGISDEPTRECDEPTromtype;-dddept.FUNCTIONOdd_dept(deptnoNUMBER,agUARCHAR2,locationVARCHAR2>RCTURNNUMBER;-deletedept.FUNCTIONdelcte_dept(dept-noNUMBER)RETURNNUMBER;-querydept.PROCEDUREquery_dept(dept_noNUMBER);ENDDEMo_PKG;包主体的创建方法,它实现上面所声明的包定义,并在包主体中声明一个私有变量flag和个私有函数CheCk_dept,由于在add_dept和remove_dept等函数中须要调用check.dpet函数.所区,在定义chec<dept函数之前首先对该函数进行声明.这种声明方法称作前向声明.CREATE:REP1.ACEPACKAGEBODYDEgPKGISFUNCTIONadd-dept<dept-noNUMBER,-amsVARCHAR2,locationVARCHAR2)RETURNNUMBERISempno-rmoiningEXCEPTION;一自定义异样PRAGMAEXCEPTlOUNITlerTMOjemaintng,1>-1是违反M-约束条件的错误代码*/BEGININSERTMTOdeptVA1.UES(dept_nofdept_namc,Iocation>IFSQ1.FOUNDTHENRETURN1;ENDIF;EXCEPTIONWHENempno_remainingTHENRETURNO;WHENOTHERSTHENRETURN-1;ENDadd-dpt;FUNCTIONdelete_dept(dept-noHUMBER)RETURNNUMBERISBEGlHDE1.ETEFRCMdeptWHEREdepth。-dept_no;IFSQ1.TOQNDTHENRETUBN1;E1.SERETURN0;ENDIF;EXCEPTIONWHENOTHERSTHENRETURN1;ENDdelete_dept;PROCEDUREqery-deptOINNUMBER)ISBEGINSE1.ECTINTODeptRecFROMdeptwheredetnodept_no;EXCEPTIONHHENMO_DATA_FOUNDTHEN。&45_0(m>6,2丁1加温唐提示:数据磔中没有娟码为,dept.no,的部门,);WHENTOO_MANY_ROWSTHENDBMS-OUTPOT.POJ1.INE胡运俏误,行蜘!«);HHENOTHERSTHENDBMS_OUTPUT.FVT-1.IHE(SQ1.CODE,'SQ1.ERRM);ENDquery-dept;BEGINNull;ENDDEMO_PKG;对包内共有元素的调用格式为:包名.元素名称mDEMO.PKG包内函数对dept表进行插入、查询和班除操作,并通过DEMO-PKG包中的记录变量DEPTREC显示所杳询到的数据库信息:DEC1.AREV.1:NUMBER;B£GINVa:-DEMO_PKGadd_dept190,HK1.ORB'r,HAIKOU,);IFVdr1THENDbmsoutput.PUj1.INE(SQ1.codeSQ1.ERRM);E1.SIrV.-OTHENDBMS_OUTPUT.PUT_1.INE(,温酬8示:该部门记录日S存在I,);E1.SEDBMS-OUTPOT.POT-1.INE(,温9提示:冽Q记录胜利!,);DEMO_PKG.query_dept<90,-,DEMO_PKG.DeptRec.loci;r:-DEM3-PKG.delete-dept<90);IFVdr1THENDbmsoutput.put_line(SQ1.code,SQ1.ERRM);E1.SIFVOTHENDBMS-OUTPOT.PUj1.lNEC温箱S示:该部门记录不存在!,);E1.SEDBM"OUTPUTePUT,INE(,阻鹭?S示:阻畛记录胜利!);ENDIF;ENDIF;END;例2:创建包EMP_PKG.读取emp&