PLSQL程序设计培训教程

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Copyright©CUIT,2004.Allrightsreserved.PL/SQL程序设计1-2SQL语句每次只能执行一条,不适应开发功能完备的数据库应用程序,Oracle提供了自己的过程化语言PL/SQL。本章主要内容包括:►PL/SQL基础►PL/SQL控制结构►PL/SQL记录和表►游标►过程与函数►触发器►异常处理1-3•5.1PL/SQL基础•PL/SQL提供变量声明、赋值、条件测试与分支以及迭代的语言元素,这部分内容包括:•变量及声明•数据类型•表达式•PL/SQL程序块结构•PL/SQL程序运行环境1-4•5.1.1变量及声明•变量必须以字母开头,后可跟字母、数字、$、#或_。•变量长度不超过30个字符。•变量名中不能有空格。•声明变量:•Agenumber(3)notnull:=32;•声明常量:•Piconstantnumber(9):=3.1415926;1-5•5.1.2数据类型•BINARY_INTEGER•NUMBER(精度,比例)•CHAR(长度)•VARCHAR2(长度)•DATE•ROWID存储数据库表中每一行的物理地址•UROWID存储数据库表中每一行物理的、逻辑的•或外部的(非Oracle的)地址•BOOLEAN1-6•5.1.3表达式•主要指赋值表达式,语法如下:•变量:=表达式,例如:•Date_of_today:=sysdate;•Astring:=‘farewell’||’toarms’;•Area:=pi*radius**2;•表达式中的常用符号•数学运算符:+、-、*、/、**•布尔运算符:=、、、、=、=•其他符号:..、||、@、‘、’、&、“、”1-7•5.1.4PL/SQL程序块结构•可选的块声明、块体部分和可选的异常处理部分:•DECLARE•--块声明部分•……•BEGIN•--块体的可执行部分•……•EXCEPTION•--异常处理部分•……•END;1-8•一个PL/SQL块的简单例子•SETSERVEROUTPUTON•DECLARE•PiCONSTANTREAL:=3.1415926;•CircumferenceREAL;•AreaREAL;•radiusREAL:=&Radius;•BEGIN•Circumference:=Pi*radius*2.0;•Area:=Pi*radius**2;•DBMS_OUTPUT.enable;•1-9•DBMS_OUTPUT.put_line(‘Radius=’||TO_CHAR(radius)||‘,Circumference=‘||TO_CHAR(Circumference)||‘,Area=‘||TO_CHAR(Area));•END;1-10•图5.2显示了PL/SQL引擎在Oracle服务器中的位置Oracle服务器PL/SQL引擎PL/SQL块过程化语句执行器SQL语句执行器图5.21-11•不论使用哪种工具,例如SQL*Plus或SQL*PlusWorkSheet,该工具必须向Oracle服务器提交PL/SQL源代码,PL/SQL引擎扫描、分析并编译代码,然后预备执行编译后的代码。在执行期间,将所有的SQL语句传递给SQL语句执行器组件执行。SQL语句执行器执行SQL或DML语句。PL/SQL引擎可以使用由查询提取的数据集进行更进一步的处理。•使用PL/SQL块后不必每执行一条SQL语句都要经过一次网络,因而相对于逐条发送一组SQL语句,大大降低了网络传输量。1-12•另外,在PL/SQL块中,可以把SQL/DML语句当作一个事务对待。如果整个事务成功,那么对数据库的全部改动会被提交。如果事务的任何部分失败,整个事务会被回滚。因为PL/SQL块中可以包含复杂的逻辑,所以在服务器上执行,于是客户程序的大小和复杂程度也降低了。1-13•PL/SQL块能执行复杂的逻辑和错误处理。一个客户应用中可以嵌入一个简单的匿名或未命名的块(没有使用名字标记的PL/SQL代码块)并激活这些PL/SQL块。这种能力通常称为远程过程调用(RPC)。PL/SQL块还可以调用其他PL/SQL块。因为这些PL/SQL块已经被编译并被开发者很好地调试过,所以它们提供了显著的性能改进。并且通过为其他应用或模块提供可重复使用的块,减少了应用开发。1-14•当编译任意PL/SQL程序时,不管是命名块还是未命名块的代码,源代码和对象代码都被告诉缓存在共享SQL区中。分配给一个PL/SQL块的空间叫做一个游标。服务器使用最近最少使用算法,在共享SQL区保存缓存的程序直到它过期失效。在PL/SQL块中的任何SQL语句都被给予各自的共享SQL区。当一个命名子程序被编译时,它的源代码还被保存到数据字典中。包含在一个子程序中的代码是可重入的,也就是说,它在所有连接的用户间是共享的。1-15•当提交一个未命名的PL/SQL块给服务器执行时,服务器通过比较源代码文本,决定在高速缓存中是否有该程序块。如果代码文本字符之间(包括大小写)完全相同,则能够简单执行缓存的分析代码。否则,必须首先分析新的语句。通过共享可执行代码,一个基于服务器的应用能够真正地实现内存节省,这在拥有数百个连接用户时尤其重要。1-165.2PL/SQL控制结构控制结构是所有程序设计语言的核心。PL/SQL程序可以使用顺序结构、选择结构、NULL结构和循环结构来控制程序流。5.2.1顺序结构5.2.2选择结构:1.If-then(允许嵌套)Ifvar1var2thenDBMS_OUTPUT.put_line(‘var1islargerthanvar2’);endif;1-17•在PL/SQL中实现if逻辑有两条规则:•规则1每个if语句都有自己的then,以if开始的语句行后面不跟语句结束符(;)。•规则2每个if语句块以相应的endif结束。•2if-then-else(也可以嵌套)•Ifvar1var2thenDBMS_OUTPUT.put_line(‘var1islargerthanvar2’);•else•DBMS_OUTPUT.put_line(‘var1isnotlargerthanvar2’);•endif;1-18•规则3•每个if语句有且只有一个else。•规则4•Else语句行后面不跟语句结束符。•3if-then-elsif•这种结构用于替代嵌套if-then-else结构。例子如下页所示。1-19•Ifvar1var2then•DBMS_OUTPUT.put_line(‘var1islargerthanvar2’);•elsifvar1=var2then•DBMS_OUTPUT.put_line(‘var1isequaltovar2’);•else•DBMS_OUTPUT.put_line(‘var1issmallerthanvar2’);•Endif;•规则5•elsif无匹配的endif。1-20•5.2.3NULL结构•空操作语句。•Ifmark60then•null;•else•insertintostudent_coursevalues(……);•endif;1-21•5.2.4循环结构•1LOOP-EXIT-END循环,由3部分组成,其语法如下:•loop•执行语句1;•执行语句2;•……•endloop•一般这种循环结构的终止条件通过在执行语句中加入EXIT或EXITWHEN来实现。例如下页的例子1-22•SETSERVEROUTPUTON•DECLARE•CtrINTEGER:=0;•BEGIN•DBMS_OUTPUT.enable;•loop•DBMS_OUTPUT.put(Ctr||‘’);•Ctr:=Ctr+1;•EXITWHENCtr=10;•endloop;•DBMS_OUTPUT.put_line(‘LoopExited’);•END;1-23•2WHILE-LOOP-END循环•语法如下:•while布尔表达式loop•执行语句1;•执行语句2;•……•endloop;1-24•一个WHILE循环的例子•SETSERVEROUTPUTON•DECLARE•CtrINTEGER:=0;•BEGIN•whileCtr10loop•DBMS_OUTPUT.put(Ctr||‘’);•Ctr:=Ctr+1;•endloop;•DBMS_OUTPUT.put_line(‘LoopExited’);•END;1-25•3FOR-IN-LOOP-END循环•语法格式为:•for计数循环变量in[reverse]起始值..终止值loop•执行语句1;•执行语句2;•……•endloop;1-26•一个FOR循环结构的例子:•SETSERVEROUTPUTON•BEGIN•DBMS_OUTPUT.enable;•forctrin0..9loop•DBMS_OUTPUT.put(Ctr||‘’);•endloop;•DBMS_OUTPUT.put_line(‘LoopExited’);•END;1-275.3PL/SQL记录和表用户自定义类型就是记录类型,PL/SQL记录是用户自定义类型,PL/SQL表是由用户定义类型来说明的表,本节介绍如何利用%TYPE属性和%ROWTYPE属性、怎样声明和使用基本的记录类型和PL/SQL表。%TYPE和%ROWTYPE属性的区别在于:前者用于基本数据类型,而后者则用于记录类型和表结构。5.3.1使用%TYPE%TYPE属性用于声明变量、常量、记录中的字段以及数据库列,表属性或其它程序结构相匹配的记录变量1-28•使用%TYPE的一个例子:•DECLARE•…•Student_NoINTEGER;•…•Course_NoStduent_No%TYPE;•可以看出,使用%TYPE可以获取它修饰的变量的数据类型从而作为别的变量的数据类型。1-295.3.2记录类型声明记录类型的一般语句:TYPE记录类型ISRECORD(字段1数据类型[NOTNULL]{DEFAULT[:=}表达式])[,字段2…])1-30•一个声明记录的例子•SETSERVEROUTPUTON•DECLARE•TYPEStudentRecordISRECORD(•StudentNoINTERGER,•NameVARCHAR2(10),•GenderCHAR(1),•HomeTownVARCHAR2(20),•StudyVARCHAR2(10),•ActivityStudy%TYPE•);Student1StudentRecord;1-315.3.3使用%ROWTYPE%ROWTYPE属性声明用于记录类型和表结构。5.3.4表PL/SQL表是一个由用户定义类型来说明的表。其语法格式如下:TYPEPL/SQL表名ISTABLEOF数据类型,例如DECLARE…TYPEStudentNameISTABLEOFStudentInfo.Name%TYPE;…1-325.4游标PL/SQL用游标来管理SQL的SELECT语句。它是为处理这些语句而分配的一个具有结构的内存区。游标定义类似于其他PL/SQL变量,并且必须遵守同样的命名规则。1-33•5.4.1游标基本操作•游标是一个对象,能够提供行级的SQL语句控制。游标声明不同于变量,而是用于实现游标的一个内存区域的句柄。游标声明仅仅定义了将提交给SQL语句执行器哪些查询,在可执行代码中的程序控制下进行查询的管理。游标可以表示任意合法的SQLSELECT语句。游标通常是任何PL/SQL应用的基本构建块,它们为数据库中存储的数据集合上的操作提供了循环机制。如果还需要更新,使用FORUPDATE子句。1-34•1声明游标•游标的声明包括两个部分:游标名称和这个游标所用到的SQL语句。PL/SQL语言中语法格式为:•CURSOR游标名称IS查询语句(SELECT语句);•例如,CURSORStudent_listIS•SELECTStudentNo•FROMStudentInfo•

1 / 103
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功