版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用PL/SQL,本文将讲述PL/SQL基础语法,结构和组件、以及如何设计并执行一个PL/SQL程序。PL/SQL的优点从版本6开始PL/SQL就被可靠的整合到ORACLE中了,一旦掌握PL/SQL的优点以及其独有的数据管理的便利性,那么你很难想象ORACLE缺了PL/SQL的情形。PL/SQL 不是一个独立的产品,他是一个整合到ORACLE服务器和ORACLE工具中的技术,可以把PL/SQL看作ORACLE服务器内的一个引擎,sql语
2、句执行者处理单个的sql语句,PL/SQL引擎处理PL/SQL程序块。当PL/SQL程序块在PL/SQL引擎处理时,ORACLE服务器中的SQL语句执行器处理pl/sql程序块中的SQL语句。PL/SQL的优点如下:. PL/SQL是一种高性能的基于事务处理的语言,能运行在任何ORACLE环境中,支持所有数据处理命令。通过使用PL/SQL程序单元处理SQL的数据定义和数据控制元素。. PL/SQL支持所有SQL数据类型和所有SQL函数,同时支持所有ORACLE对象类型. PL/SQL块可以被命名和存储在ORACLE服务器中,同时也能被其他的PL/SQL程序或SQL命令调用,任何客户/服务器工具
3、都能访问PL/SQL程序,具有很好的可重用性。. 可以使用ORACLE数据工具管理存储在服务器中的PL/SQL程序的安全性。可以授权或撤销数据库其他用户访问PL/SQL程序的能力。. PL/SQL代码可以使用任何ASCII文本编辑器编写,所以对任何ORACLE能够运行的操作系统都是非常便利的. 对于SQL,ORACLE必须在同一时间处理每一条SQL语句,在网络环境下这就意味作每一个独立的调用都必须被oracle服务器处理,这就占用大量的服务器时间,同时导致网络拥挤。而PL/SQL是以整个语句块发给服务器,这就降低了网络拥挤。PL/SQL块结构PL/SQL是一种块结构的语言,组成PL/SQL程序
4、的单元是逻辑块,一个PL/SQL 程序包含了一个或多个逻辑块,每个块都可以划分为三个部分。与其他语言相同,变量在使用之前必须声明,PL/SQL提供了独立的专门用于处理异常的部分,下面描述了PL/SQL块的不同部分:声明部分(Declaration section)声明部分包含了变量和常量的数据类型和初始值。这个部分是由关键字DECLARE开始,如果不需要声明变量或常量,那么可以忽略这一部分;需要说明的是游标的声明也在这一部分。执行部分(Executable section)执行部分是PL/SQL块中的指令部分,由关键字BEGIN开始,所有的可执行语句都放在这一部分,其他的PL/SQL块也可以放
5、在这一部分。异常处理部分(Exception section)这一部分是可选的,在这一部分中处理异常或错误,对异常处理的详细讨论我们在后面进行。PL/SQL块语法DECLARRE-declaaratioon staatemenntsBEGGIN-execuutablee stattementtsEXCCEPTIOON-excepption stateementssENDPL/SQQL块中的每每一条语句都都必须以分号号结束,SQQL语句可以以使多行的,但但分号表示该该语句的结束束。一行中可可以有多条SSQL语句,他他们之间以分分号分隔。每每一个PL/SQL块由由BEGINN或DECLLARE开始
6、始,以ENDD结束。注释释由-标示示。PL/SSQL块的命命名和匿名PL/SSQL程序块块可以是一个个命名的程序序块也可以是是一个匿名程程序块。匿名名程序块可以以用在服务器器端也可以用用在客户端。命名程程序块可以出出现在其他PPL/SQLL程序块的声声明部分,这这方面比较明明显的是子程程序,子程序序可以在执行行部分引用,也也可以在异常常处理部分引引用。PPL/SQLL程序块可背背独立编译并并存储在数据据库中,任何何与数据库相相连接的应用用程序都可以以访问这些存存储的PL/SQL程序序块。ORAACLE提供供了四种类型型的可存储的的程序:. 函数数. 过程. 包. 触发发器函数函数数是命名了的的
7、、存储在数数据库中的PPL/SQLL程序块。函函数接受零个个或多个输入入参数,有一一个返回值,返返回值的数据据类型在创建建函数时定义义。定义函数数的语法如下下:FUNCTIOON namme pparameeter,parammeter,.) RETTURN ddatatyypes IISloccal deeclaraationssBEGIINexeccute sstatemmentsEXCEPPTIONeexcepttion hhandleersENND naame过程存储过过程是一个PPL/SQLL程序块,接接受零个或多多个参数作为为输入(INNPUT)或或输出(OUUTPUT)、或既作输
8、输入又作输出出(INOUUT),与函函数不同,存存储过程没有有返回值,存存储过程不能能由SQL语语句直接使用用,只能通过过EXECUUT命令或PPL/SQLL程序块内部部调用,定义义存储过程的的语法如下:PROCEDUURE naame (parammeter,paraameterr,.) ISSlocaal decclarattionsBEGINNexecutte staatemenntsEXXCEPTIIONexcceptioon hanndlerss ENDD namme包(packaage)包其实就是是被组合在一一起的相关对对象的集合,当当包中任何函函数或存储过过程被调用,包包就被加载
9、入入内存中,包包中的任何函函数或存储过过程的子程序序访问速度将将大大加快。包由两个部部分组成:规规范和包主体体(bodyy),规范描描述变量、常常量、游标、和子程序,包包体完全定义义子程序和游游标。触发器器(triggger)触发器与与一个表或数数据库事件联联系在一起的的,当一个触触发器事件发发生时,定义义在表上的触触发器被触发发。变量和常常量变量量存放在内存存中以获得值值,能被PLL/SQL块块引用。你可可以把变量想想象成一个可可储藏东西的的容器,容器器内的东西是是可以改变的的。声明变量量变量一一般都在PLL/SQL块块的声明部分分声明,PLL/SQL是是一种强壮的的类型语言,这这就是说在引
10、引用变量前必必须首先声明明,要在执行行或异常处理理部分使用变变量,那么变变量必须首先先在声明部分分进行声明。声明变变量的语法如如下:Variablle_namme COONSTANNT daatabytte NOOT NULLL:=|DEFAAULT eexpresssion注意:可以以在声明变量量的同时给变变量强制性的的加上NOTT NULLL约束条件,此此时变量在初初始化时必须须赋值。给变变量赋值给变量赋值值有两种方式式:. 直接给变量量赋值X:=2000;Y=Y+(X*20);. 通过SQLL SELEECT INNTO 或FFETCH INTO给给变量赋值SSELECTT SUM(SA
11、LARRY),SUUM(SALLARY*00.1)INNTO TOOTAL_SSALARYY,TATAAL_COMMMISSIIONFROOM EMPPLOYEEEWHERE DEPT=10;常量量常量与与变量相似,但但常量的值在在程序内部不不能改变,常常量的值在定定义时赋予,他他的声明方式式与变量相似似,但必须包包括关键字CCONSTAANT。常量量和变量都可可被定义为SSQL和用户户定义的数据据类型。ZERO_VAALUE CCONSTAANT NUUMBER:=0;这个语句定定了一个名叫叫ZERO_VALUEE、数据类型型是NUMBBER、值为为0的常量。标量(scalaar)数据类类型
12、标量量(scallar)数据据类型没有内内部组件,他他们大致可分分为以下四类类:. numbber. chaaracteer. datee/timee. booleean表表1显示了数数字数据类型型;表2显示示了字符数据据类型;表33显示了日期期和布尔数据据类型。表1 Sccalar Typess:NumeericDatatyppeRangeSubtypeesdescripptionBINARY_INTEGGER-NATURALLNATURRALNPOOSITIVVEPOSIITIVENNSIGNTTYPE 用于存储单字节节整数。要求求存储长度低低于NUMBBER值。用用于限制范围围的子类型(
13、SUBTYYPE):NATURRAL:用于于非负数PPOSITIIVE:只用用于正数NNATURAALN:只用用于非负数和和非NULLL值POSSITIVEEN:只用于于正数,不能能用于NULLL值SIIGNTYPPE:只有值值:-1、00或1.NUMBER1.0E-1330-9.999E1255DECDECIIMALDOOUBLE PRECIISIONFFLOAT INTEGGERICIINTNUMMERICRREALSMMALLINNT存储数字值,包包括整数和浮浮点数。可以以选择精度和和刻度方式,语语法:numberr(,)。缺省省的精度是338,scaale是0.PLS_INTTEGER
14、-与BINARYY_INTEEGER基本本相同,但采采用机器运算算时,PLSS_INTEEGER提供供更好的性能能 。表2 字符符数据类型 datatypperangsubtypeedescripptionCHAR最大长度327767字节 CHARACTTER存储定长字符串串,如果长度度没有确定,缺缺省是1LONG最大长度字节存储可变长度字字符串RAW 最大长度327767字节用于存储二进制制数据和字节节字符串,当当在两个数据据库之间进行行传递时,RRAW数据不不在字符集之之间进行转换换。LONGRAWW最大长度与LONG数据据类型相似,同同样他也不能能在字符集之之间进行转换换。ROWID18
15、个字节与数据库ROWWID伪列类类型相同,能能够存储一个个行标示符,可可以将行标示示符看作数据据库中每一行行的唯一键值值。VARCHARR2最大长度327767字节STRINGVVARCHAAR与VARCHAAR数据类型型相似,存储储可变长度的的字符串。声声明方法与VVARCHAAR相同 表3 DAATE和BOOOLEANNdatatypperange descripptionBOOLEANNTRUE/FAALSE存储逻辑值TRRUE或FAALSE,无无参数DATE01/01/44712 BBC 存储固定长的日日期和时间值值,日期值中中包含时间LOB数据据类型LLOB(大对对象,Larrge
16、obbject) 数据类型型用于存储类类似图像,声声音这样的大大型数据对象象,LOB数数据对象可以以是二进制数数据也可以是是字符数据,其其最大长度不不超过4G。LOBB数据类型支支持任意访问问方式,LOONG只支持持顺序访问方方式。LOBB存储在一个个单独的位置置上,同时一一个LOBB定位符(LOB llocatoor)存储在在原始的表中中,该定位符符是一个指向向实际数据的的指针。在PPL/SQLL中操作LOOB数据对象象使用ORAACLE提供供的包DBMMS_LOBB.LOB数数据类型可分分为以下四类类:. BFILEE. BBLOB. CLOOB. NCLOBB操作符符与其他他程序设计语语
17、言相同,PPL/SQLL有一系列操操作符。操作作符分为下面面几类:. 算术操操作符. 关系操作作符. 比较操作符符. 逻辑辑操作符算术操作符符如表4所示示operatooroperatiion+ 加- 减/ 除* 乘*乘方关系操作符符主要用于条条件判断语句句或用于whhere子串串中,关系操操作符检查条条件和结果是是否为truue或fallse,表55是PL/SSQL中的关关系操作符operatooroperatiion 小于操作符 大于操作符=大于或等于操作作符= 等于操作符 != 不等于操作符 不等于操作符:= 赋值操作符表6 显示示的是比较操操作符operatoor operatiion
18、IS NULLL如果操作数为NNULL返回回TRUELIKE比较字符串值BETWEENN验证值是否在范范围之内IN验证操作数在设设定的一系列列值中表7.8显显示的是逻辑辑操作符operatooroperatiionAND 两个条件都必须须满足OR只要满足两个条条件中的一个个NOT取反执行部分执执行部分包含含了所有的语语句和表达式式,执行部分分以关键字BBEGIN开开始,以关键键字EXCEEPTIONN结束,如果果EXCEPPTION不不存在,那么么将以关键字字END结束束。分号分隔隔每一条语句句,使用赋值值操作符:=或SELEECT INNTO或FEETCH IINTO给每每个变量赋值值,执行
19、部分分的错误将在在异常处理部部分解决,在在执行部分中中可以使用另另一个PL/SQL程序序块,这种程程序块被称为为嵌套块所有的SQQL数据操作作语句都可以以用于执行部部分,PL/SQL块不不能再屏幕上上显示SELLECT语句句的输出。SSELECTT语句必须包包括一个INNTO子串或或者是游标的的一部分,执执行部分使用用的变量和常常量必须首先先在声明部分分声明,执行行部分必须至至少包括一条条可执行语句句,NULLL是一条合法法的可执行语语句,事物控控制语句COOMMIT和和ROLLBBACK可以以在执行部分分使用,数据据定义语言(Data Definnitionn langguage)不能在执行
20、行部分中使用用,DDL语语句与EXEECUTE IMMEDDIATE一一起使用或者者是DBMSS_SQL调调用。执行一一个PL/SSQL块SQL*PPLUS中匿匿名的PL/SQL块的的执行是在PPL/SQLL块后输入/来执行,如如下面的例子子所示:declaree v_ccomm_ppercennt connstantt numbber:=110;begginuppdate empsset coomm=saal*v_ccomm_ppercenntwheere deeptno=10;eendSQLL /PLL/SQL proceedure succeessfullly coompletted.S
21、QQL命名的程序序与匿名程序序的执行不同同,执行命名名的程序块必必须使用exxecutee关键字:create or reeplacee procceduree updaate_coommisssion(v_deppt in numbeer,v_ppervennt in numbeer deffault 10) iis begginuppdate empsset coomm=saal*v_ppercenntwheere deeptno=v_deppt;enddSQL/Proceedure creattedSQLLexeccute uupdatee_commmissioon(10,15);PPL
22、/SQLL procceduree succcessfuully ccompleeted.SSQL 如果在另一一个命名程序序块或匿名程程序块中执行行这个程序,那那么就不需要要EXECUUTE关进字字。declareev_deept nuumber;beginseelect a.depptnoiinto vv_depttfromm emp awheere joob=PRRESIDEENTuupdatee_commmissioon(v_ddept);endSQLL/PLL/SQL proceedure succeessfullly coomplettedSQLL控制结构控控制结构控制制PL/SQQ
23、L程序流程程的代码行,PL/SQQL支持条件件控制和循环环控制结构。语法和和用途IF.TTHEN语法:IF condditionn THENNStattementts 1;Stateementss 2;.ENND IF IF语句判判断条件coonditiion是否为为TRUE,如如果是,则执执行THENN后面的语句句,如果coonditiion为faalse或NNULL则跳跳过THENN到END IF之间的的语句,执行行END IIF后面的语语句。IF.THENN.ELLSE语语法:IF condditionn THENNStattementts 1;Stateementss 2;.ELLSE
24、Sttatemeents 11;Staatemennts 2;.END IIF 如果条件ccondittion为TTRUE,则则执行THEEN到ELSSE之间的语语句,否则执执行ELSEE到END IF之间的的语句。IF 可以以嵌套,可以以在IF 或或IF .ELSE语语句中使用IIF或IF.ELSEE语句。if (abb) andd (acc) theeng:=a;ellsegg:=b;if ccg thheng:=c;endd ifennd ifIF.THEEN.ELLSIF语法:IF condditionn1 THEENstateement11;ELSIIF connditioon2 T
25、HHENsttatemeent2;EELSIF condiition33 THENNstattementt3;ELSSEstaatemennt4;ENND IF;stattementt5;如果条件ccondittion1为为TRUE则则执行staatemennt1,然后后执行staatemennt5,否则则判断connditioon2是否为为TRUE,若为TRUUE则执行sstatemment2,然后执行sstatemment5,对于connditioon3也是相相同的,如果果condiition11,condditionn2,connditioon3都不成成立,那么将将执行staatemen
26、nt4,然后后执行staatemennt5。循环环控制循循环控制的基基本形式是LLOOP语句句,LOOPP和END LOOP之之间的语句将将无限次的执执行。LOOOP语句的语语法如下:LOOPP sstatemments;ENDD LOOPPLOOOP和ENDD LOOPP之间的语句句无限次的执执行显然是不不行的,那么么在使用LOOOP语句时时必须使用EEXIT语句句,强制循环环结束,例如如:X:=100;LOOPXX:=X+110;IFF X10000 THHENEEXIT;END IIFEND LOOP;Y:=X;此时Y的值值是10100.EXXIT WHHEN语句将将结束循环,如如果条件
27、为TTRUE,则则结束循环。X:=100;LOOPX:=X+100;EXITT WHENN X10000;X:=X+100;END LOOP;Y:=X;WHILE.LOOPWHILLE.LOOOP有一个个条件与循环环相联系,如如果条件为TTRUE,则则执行循环体体内的语句,如如果结果为FFALSE,则结束循环环。X:=100;WHILE X=10000 LOOOPX:=X+100;END LOOP;Y=X; FOR.LLOOP语法:FOR couunter IN RREVERSSE sttart_rrange.ennd_rannge LOOOPstaatemennts;ENND LOOOP;L
28、OOP和和WHILEE循环的循环环次数都是不不确定的,FFOR循环的的循环次数是是固定的,ccounteer是一个隐隐式声明的变变量,他的初初始值是sttart_rrange,第二个值是是startt_rangge+1,直直到end_rangee,如果sttart_rrange等等于end _rangge,那么循循环将执行一一次。如果使使用了REVVERSE关关键字,那么么范围将是一一个降序。X:=100;FOR vv_counnter iin 1.10 looopx:=x+10;end lloopy:=x;如果要退出出for循环环可以使用EEXIT语句句。标签用户户可以使用标标签使程序获获得
29、更好的可可读性。程序序块或循环都都可以被标记记。标签的形形式是。标记程程序块DECLLARE. . .BEGINN.EEXCEPTTION.END llabel_name标记循环LOOP.loop.loop.EXIIT outter_looop WHHEN v_condiition=0;endd loopp inneermostt_loopp;.END LOOP innerr_loopp;END LOOP outerr_loopp; GOTO语句语法:GOTOO LABEEL;执执行GOTOO语句时,控控制会立即转转到由标签标标记的语句。PL/SQQL中对GOOTO语句有有一些限制,对对于块、
30、循环环、IF语句句而言,从外外层跳转到内内层是非法的的。X :=1000;FOR V_COUUNTER IN 1.10 LLOOPIIF V_CCOUNTEER =4 THENGOTOO end_of_looopENND IFX:=X+10;NULLLEND LOOPYY:=X; 注意:NUULL是一个个合法的可执执行语句。嵌嵌套程序序块的内部可可以有另一个个程序块这种种情况称为嵌嵌套。嵌套要要注意的是变变量,定义在在最外部程序序块中的变量量可以在所有有子块中使用用,如果在子子块中定义了了与外部程序序块变量相同同的变量名,在在执行子块时时将使用子块块中定义的变变量。子块中中定义的变量量不能被父
31、块块引用。同样样GOTO语语句不能由父父块跳转道子子块中,反之之则是合法的的。OUTER BLOCKKDECLLAREAA_NUMBBER INNTEGERR;B_NNUMBERR INTEEGER;BBEGIN-A_NNUMBERR and B_NUMMBER aare avvailabble heereDECLLARECC_NUMBBER INNTEGERRB_NUUMBER NUMBEER(20)BEGINNC_NUUMBER:=A_NUUMBER;C_NUUMBER=OUTERR_BLOCCK.B_NNUMBERR;END SUB_BBLOCK;END OOUT_BLLOCK;小结 我
32、们在在这篇文章中中介绍了PLL/SQL的的基础语法以以及如何使用用PL/SQQL语言设计计和运行PLL/SQL程程序块,并将将PL/SQQL程序整合合到Oraccle服务器器中,虽然PPL/SQLL程序作为功功能块嵌入OOraclee数据库中,但但PL/SQQL与ORAACLE数据据库的紧密结结合使得越来来越多的Orracle数数据库管理员员和开发人员员开始使用PPL/SQLL。全面探讨PL/SQL的复复合数据类型型PL/SQL有有两种复合数数据结构:记记录和集合。记录由不同同的域组成,集集合由不同的的元素组成。在本文中我我们将讨论记记录和集合的的类型、怎样样定义和使用用记录和集合合。PL/S
33、SQL 记录录记录是是PL/SQQL的一种复复合数据结构构,scallar数据类类型和其他数数据类型只是是简单的在包包一级进行预预定义,但复复合数据类型型在使用前必必须被定义,记记录之所以被被称为复合数数据类型是因因为他由域这这种由数据元元素的逻辑组组所组成。域域可以是sccalar数数据类型或其其他记录类型型,它与c语语言中的结构构相似,记录录也可以看成成表中的数据据行,域则相相当于表中的的列,在表和和虚拟表(视视图或查询)中中非常容易定定义和使用,行行或记录中的的每一列或域域都可以被引引用或单独赋赋值,也可以以通过一个单单独的语句引引用记录所有有的域。在存存储过程或函函数中记录也也可能有参
34、数数。创建记录录在PLL/SQL中中有两种定义义方式:显式式定义和隐式式定义。一旦旦记录被定义义后,声明或或创建定义类类型的记录变变量,然后才才是使用该变变量。隐式声声明是在基于于表的结构或或查询上使用用%TYPEE属性,隐式式声明是一个个更强有力的的工具,这是是因为这种数数据变量是动动态创建的。显式定义记记录显式式定义记录是是在PL/SSQL程序块块中创建记录录变量之前在在声明部分定定义。使用ttype命令令定义记录,然然后在创建该该记录的变量量。语法如下下: TYPE reecord_type IS REECORD (fielld_deffinitiion_liist);fieldd_de
35、fiinitioon_lisst是由逗号号分隔的列表表。域定定义的语法如如下:field_nname ddata_ttype_aand_siize NNOT NUULL:=|DEEFAULTT deffault_valuee域名必须服服从与表或列列的命名规则则相同的命名名规则。下面面我们看一个个例子:DELCAREETYPE stockk_quotte_recc IS RRECORDD(symbbol sttock.ssymboll%TYPEE,bid NUMBEER(10,4),assk NUMMBER(110,4),volumme NUMMBER NNOT NUULL:=00,exchha
36、nge VARCHHAR2(66) DEFFAULT NASDDAQ);real_time_quotee stocck_quoote_reec;varriablee域定义时的的%TYPEE属性用于引引用数据库中中的表或视图图的数据类型型和大小,而而在此之前程程序不知道类类型和大小。在上面的例例子中记录域域在编译时将将被定义为与与列SYMBBOL相同的的数据类型和和大小,当代代码中要使用用来自数据库库中的数据时时,在变量或或域定义中最最好使用%TTYPE来定定义。隐式定定义记录隐式定义记记录中,我们们不用描述记记录的每一个个域。这是因因为我们不需需要定义记录录的结构,不不需要使用TTYPE语句句
37、,相反在声声明记录变量量时使用%RROWTYPPE命令定义义与数据库表表,视图,游游标有相同结结构的记录,与与TYPE命命令相同的是是它是一种定定义获得数据据库数据记录录的好方法。DECLAREEaccouunter_info accouunts%RROWTYPPR;CURRSOR xxactioons_cuur(accct_no IN VAARCHARR2) ISSSELECCT acttion,ttimesttamp,hholdinngFROMM porttfolioosWHERRE acccount_nbr=acct_no;xactiion_innfo xaactionns_curr%R
38、OWTTYPE;vvariabble有一些PLL/SQL指指令在使用隐隐式定义记录录时没有使用用%ROWTTYPE属性性,比如游标标FOR循环环或触发器中中的:oldd和:neww记录。DELCAREECURSOOR xacction_cur IISSELEECT acction,timeaamp,hooldinggFROM portffoliossWHEREE accoount_nnbr=337;BEGINNFOR xxactioon_recc in xxactioons_cuurLOOPPIF xaactionns_recc.holdding=ORCLTHENnootify_shareeh
39、oldeer;ENDD IF;EEND LOOOP;使用记录用用户可以给记记录赋值、将将值传递给其其他程序。记记录作为一种种复合数据结结构意味作他他有两个层次次可用。用户户可以引用整整个记录,使使用seleect innto或feetch转移移所有域,也也可以将整个个记录传递给给一个程序或或将所有域的的值赋给另一一个记录。在在更低的层次次,用户可以以处理记录内内单独的域,用用户可以给单单独的域赋值值或者在单独独的域上运行行布尔表达式式,也可以将将一个或更多多的域传递给给另一个程序序。引用记录录记录由由域组成,访访问记录中的的域使用点(.)符号。我我们使用上面面的例子看看看DELCAREETYP
40、E stockk_quotte_recc IS RRECORDD(symbbol sttock.ssymboll%TYPEE,bid NUMBEER(10,4),assk NUMMBER(110,4),volumme NUMMBER NNOT NUULL:=00,exchhange VARCHHAR2(66) DEFFAULT NASDDAQ);TYPE detaiiled_qquote_rec IIS RECCORD(qquote stockk_quotte_recc,timeestampp datee,bid_size NUMBEER,askk.sizee NUMBBER,laast_ti
41、ick VAARCHARR2(4);reall_timee_detaail deetail_quotee_rec;BEGINNreal_time_detaiil.bidd_sizee:=10000;reaal_timme_dettail.qquote.volumme:=;llog_quuote(rreal_ttime_ddetaill.quotte);给记录赋值给记录或记记录中的域赋赋值的方法有有几种,可以以使用SELLECT IINTO或FFETCH给给整个记录或或单独的域赋赋值, 可以以将整个记录录的值赋给其其他记录,也也可以通过给给每个域赋值值来得到记录录,以下我们们通过实例讲讲解每一种
42、赋赋值方法。1、使用用SELECCT INTTO使用用SELECCT INTTO给记录赋赋值要将记录录或域放在IINTO子串串中,INTTO子串中的的变量与SEELECT中中列的位置相相对应。例:DECLAREEstockk_infoo1 stoocks%RROWTYPPE;stoock_innfo2 sstockss%ROWTTYPE;BBEGINSSELECTT symbbol,exxchanggeINTOO stocck_inffo1.syymbol,stockk_infoo1.excchangeeFROM stockksWHERRE symmbol=ORCL;SELEECT * INT
43、O stockk_infoo2 FROOM stoocksWHHERE ssymboll=ORCCL;2、使用FFETCH如果SQQL语句返回回多行数据或或者希望使用用带参数的游游标,那么就就要使用游标标,这种情况况下使用FEETCH语句句代替INSSTEAD INTO是是一个更简单单、更有效率率的方法,但但在安全性较较高的包中FFETCH的的语法如下:FETCH ccursorr_namee INTOO variiable;我们改写上上面的例子:DECLAREECURSOOR stoock_cuur(symmbol_iin VARRCHAR22) IS SELECCT symmbol,eex
44、channge,beegin_ddateFRROM sttockWHHERE ssymboll=UPPEER(symmbol_iin);sttock_iinfo sstock_cur%RROWTYPPEBEGIINOPEN sstock_cur(ORCL);FETTCH sttock_ccur INNTO sttock_iinfo;使用赋值语语句将整个记记录复制给另另一个记录是是一项非常有有用的技术,不不过记录必须须精确地被声声明为相同的的类型,不能能是基于两个个不同的TYYPE语句来来获得相同的的结构。例:DECLAREETYPE stockk_quotte_recc IS RRECORDD
45、(symbbol sttocks.symbool%TYPPE,bidd NUMBBER(100,4),aask nuumber(10,4),voluume NUUMBER);TYPEE stocck_quoote_tooo IS RECORRD(symmbol sstockss.symbbol%TYYPE,biid NUMMBER(110,4),ask nnumberr(10,44),vollume NNUMBERR);-这两两个记录看上上去是一样的的,但实际上上是不一样的的stockk_one stockks_quoote_reec;stoock_twwo stoocks_qquote_re
46、c; -这两个个域有相同的的数据类型和和大小stoock_allso sttock_rrec_tooo;-与与stockk_quotte_recc是不同的数数据类型 BBEGINsstock_one.ssymboll:=orrcl;sstock_one.vvolumee:=;sttock_ttwo:=sstock_one;-正确syyock_aalso:=stockk_one;-错误,数数据类型错误误stockk_alsoo.symbbol:=sstock_one.ssymboll;stocck_alsso.vollume:=stockk_one.volumme; 记录不能用用于INSEERT
47、语句和和将记录直接接用于比较,下下面两种情况况是错误的:INSERRT INTTO stoocks VVALUESS (stoock_reecord);和IF sttock_rrec1sstock_rec2 THEN要特别注注意考试中试试题中有可能能用%ROWWTYPE来来欺骗你,但但这是错误的的,记住这一一点。还有可可能会出现用用记录排序的的情况,ORRACLE不不支持记录之之间的直接比比较。对于记记录比较,可可以采用下面面的两个选择择:. 设计一个函函数,该函数数返回scaalar数据据类型,使用用这个函数比比较记录,如如IF sortt_rec(stockk_one)sortt_rec(
48、stockk_two) THENN. 可以使使用数据库对对象,数据库库对象可以使使用ordeer或mapp方法定义,允允许oraccle对复合合数据类型进进行比较。关关于数据库对对象的讨论已已经超越了本本文的范围,要要详细了解数数据库对象,可可以查阅orracle手手册。PL/SQL集集合集合合与其他语言言中的数组相相似,在ORRACLE77.3及以前前的版本中只只有一种集合合称为PL/SQL表,这这种类型的集集合依然保留留,就是索引引(INDEEX_BY)表表,与记录相相似,集合在在定义的时候候必须使用TTYPE语句句,然后才是是创建和使用用这种类型的的变量。集合合的类型PL/SQQL有三种
49、类类型的集合. Inndex_bby表. 嵌套表. VAARRAY这三种类类型的集合之之间由许多差差异,包括数数据绑定、稀稀疏性(spparsitty)、数据据库中的存储储能力都不相相同。绑定涉涉及到集合中中元素数量的的限制,VAARRAY集集合中的元素素的数量是有有限,Inddex_byy和嵌套表则则是没有限制制的。稀疏性性描述了集合合的下标是否否有间隔,IIndex_by表总是是稀疏的,如如果元素被删删除了嵌套表表可以是稀疏疏的,但VAARRAY类类型的集合则则是紧密的,它它的下标之间间没有间隔。Inddex_byy表不能存储储在数据库中中,但嵌套表表和VARRRAY可以被被存储在数据据库
50、中。虽然这三种种类型的集合合有很多不同同之处,但他他们也由很多多相似的地方方:. 都是一维维的类似数组组的结构. 都有有内建的方法法. 访问由点分分隔Indeex_by表表Inddex_byy表集合的定定义语法如下下:TYPE tyype_naame ISS TABLLE OF elemeent_tyype NNOT NUULL IINDEXBBY BINNARY_IINTERGGET;这里面重要要的关键字是是INDEXX BY BBINARYY_INTEERGET,没没有这个关键键字,那么集集合将是一个个嵌套表,eelemennt_typpe可以是任任何合法的PPL/SQLL数据类型,包包括
51、:PLSS/INTEEGER、SSIGNTYYPE、和BBOOLEAAN。其他的的集合类型对对数据库的数数据类型都有有限制,但IIndex_by表不能能存储在数据据库中,所以以没有这些限限制。一一旦定义了iindex_by表,就就可以向创建建其他变量那那样创建inndex_bby表的变量量:DECLAREE TYPEE symbbol_taab_typp IS TTABLE OF VAARCHARR2(5) INDEXX BY BBINARYY_INTEEGER;ssymboll_tab symbool_tabb_typ;BEGINN嵌套表嵌套套表非常类似似于Indeex_by表表,创建的语语
52、法也非常相相似。使用TTYPE语句句,只是没有有INDEXX BY BBINARYY_INTEEGER子串串。TYYPE tyype_naame ISS TABLLE OF elemeent_tyype NNOT NUULLNOT NNULL选项项要求集合所所有的元素都都要有值,eelemennt_typpe可以是一一个记录,但但是这个记录录只能使用标标量数据类型型字段以及只只用于数据库库的数据类型型(不能是PPLS_INNTEGERR,BOOLLEAN或SSIGNTYYPE)。嵌套表和和VARRAAY都能作为为列存储在数数据库表中,所所以集合自身身而不是单个个的元素可以以为NULLL,ORA
53、CCLE称这种种整个集合为为NULL的的为自动设设置为NULLL(atoomicallly NUULL)以以区别元素为为NULL的的情况。当集集合为NULLL时,即使使不会产生异异常,用户也也不能引用集集合中的元素素。用户可以以使用IS NULL操操作符检测集集合是否为NNULL。存储在一一个数据库中中的嵌套表并并不与表中的的其它数据存存放在同一个个数据块中,它它们实际上被被存放在第二二个表中。正正如没有orrder bby子句seelect语语句不能保证证返回任何有有顺序的数据据,从数据库库中取回的嵌嵌套表也不保保证元素的顺顺序。由于集集合数据是离离线存储的,对对于大型集合合嵌套表是一一个不
54、错的选选择。VARRRAYVVARRAYY或数据变量量都有元素的的限制。想起起他集合一样样VARRAAY定义仍然然使用TYPPE语句,但但关键字VAARRAY或或VARRYYING AARRAY告告诉ORACCLE这是一一个VARRRAY集合。TYPE tyype_naame ISS VARRRAY|VVARYINNG ARRRAY (max_ssize) OFeleement_type NOT NULLmax_ssize是一一个整数,用用于标示VAARRAY集集合拥有的最最多元素数目目。VARRRAY集合的的元素数量可可以低于maax_sizze,但不能能超过maxx_sizee。elemm
55、ent_ttype是一一维元素的数数据类型,如如果elemment_ttype是记记录,那么这这个记录只能能使用标量数数据字段(与与嵌套标相似似)。NOTT NULLL子串表示集集合中的每一一个元素都必必须有值。与嵌套表表相似,VAARRAY能能够自动为NNULL,可可以使用ISS NULLL操作符进行行检测。与嵌嵌套表不同的的是,当VAARRAY存存储在数据库库中时与表中中的其他数据据存放在同一一个数据块中中。正象列的的排序保存在在表的SELLECT*中中一样元素的的顺序保存在在VARRAAY中。同样样由于集合是是在线存储的的,VARRRAY很适合合于小型集合合。使用集合象象记录一样,集集合
56、可以在两两个层面上使使用:. 操作整整个集合. 访问问集合中的单单个元素第一种情况况使用集合名名,第二种情情况使用下标标:ccollecction(subsccript)inddex_byy表的下标是是两为的整数数,可以为正正也可以为负负,范围是:-。嵌嵌套表和VAARRAY表表示元素在集集合中的位置置,用户很难难灵活设计下下标,这是因因为:. 嵌套表表开始是紧密密的(相对于于疏松). VAARRAY始始终保持紧密密. 这两种集合合的下标都由由1开始初始始化、删除、引用集合使用集合合之前必须要要初始化,对对于Indeex_by表表初始化是自自动进行的,但但是对于嵌套套表和VARRRAY就必必须
57、使用内建建的构造函数数。如果重新新调用,嵌套套表和VARRRAY自动动置NULLL,这不只是是元素置NUULL,而是是整个集合置置NULL。给集合内的的元素赋值需需要使用下标标符号。将一一个集合的值值赋给另一个个集合,只需需要简单的使使用赋值操作作符。IIndex_by集合初初始化是最简简单的,只要要涉及其中的的一个元素集集合就被初始始化了。例:DECLAREETYPE symbool_tabb_typ IS TAABLE OOF VARRCHAR22(5) IINDEX BY BIINARY_INTEGGER;TYYPE acccountt_tab_typ IIS TABBLE OFF ac
58、coount%RROWTYPPE INDDEX BYY BINAARY_INNTEGERR;symbbol_taab symmbol_ttab_tyyp;accounnt_tabb accoount_ttab_tyyp;neww_acctt_tab accouunt_taab_typp;BEGIIN-初始始化集合元素素147和-3SELEECT * INTO accouunt_taab(1477)FROMM accoounts WHEREE accoount_nnbr=1447;SELLECT * INTOO accoount_ttab(-33)FROMM accoounts WHEREE a
59、ccoount_nnbr=30003;IFF accoount_ttab(1447).baalanceeY集合保保持不变对VARRAYY非法EXIST()如果集合元素xx已经初始化化,则返回TTRUE, 否则返回FFALSEEXTEND在集合末尾添加加一个元素对Index_by非法EXTEND()在集合末尾添加加x个元素对Index_by非法EXTEND(,) 在集合末尾添加加元素n的xx个副本对Index_by非法FIRST返回集合中的第第一个元素的的下标号,对对于VARRRAY集合始始终返回1。LAST返回集合中最后后一个元素的的下标号, 对于VARRRAY返回回值始终等于于COUNTT.
60、 LIMIT返回VARRYY集合的最大大的元素个数数,对于嵌套套表和对于嵌嵌套表和Inndex_bby为nulll Index_bby集合无用用NEXT()返回在元素x之之后及紧挨着着它的元素的的值,如果该该元素是最后后一个元素,则则返回nulll.PRIOR()返回集合中在元元素x之前紧紧挨着它的元元素的值,如如果该元素是是第一个元素素,则返回nnull。TRI M从集合末端开始始删除一个元元素对于indexx_by不合合法TRIM()从集合末端开始始删除x个元元素对index_by不合法法关于集合之间的的比较集集合不能直接接用于比较,要要比较两个集集合,可以设设计一个函数数,该函数返返回一
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 北语20秋《听说》作业1
- 人教版小学数学六年级上册第六单元导学案
- 2026中国智能楼宇系统的市场渗透分析及投资机会规划研究报告
- 宁夏银川一中2026届高三上学期第二次月考数学试题
- 2026氢燃料电池制造行业市场供需分析及投资评估规划分析研究报告
- 2026全球钢铁行业供应链优化分析及产品差异化发展规划研究报告
- 2026年松桃苗族自治县社区工作者招聘考试备考试题及答案解析
- 2026年高职护理(外科护理学)试题及答案
- 2026年大学林学(林学进阶技巧)试题及答案
- 山东省济宁院附中2026-2027学年七年级数学第一学期期末学业质量监测试题含解析
- 2026秋人教PEP六年级上册英语(新改版)全册教案
- 2026 年秋季开学初中军训站姿坐姿行为养成课件
- 《港台文学12节》课件
- (2026年秋)人教版六年级上册数学教案
- 2026小学教科版四年级科学上册全册教案
- 医院检验科生物安全培训试题及答案
- 2026年新《治安管理处罚法》知识考试题库及答案(含各题型)
- 2026年一建市政实务教材改版试卷及答案
- 新版人教版七年级上册历史全册教案(完整版)教学设计含教学反思
- 2026年主要负责人《金属冶炼(黑色金属铸造)》安全生产模拟考试题
- 急性胃炎临床路径(2017年县医院适用版)
评论
0/150
提交评论