下载

1下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 PLSQL基础教程-必看

PLSQL基础教程-必看.doc

PLSQL基础教程-必看

surei
2010-11-05 0人阅读 举报 0 0 0 暂无简介

简介:本文档为《PLSQL基础教程-必看doc》,可适用于IT/计算机领域

PLSQLPLSQL程序设计目录TOCo""hz第一章PLSQL程序设计简介§SQL与PLSQL§什么是PLSQL§PLSQL的好处§PLSQL可用的SQL语句§运行PLSQL程序第二章PLSQL块结构和组成元素§PLSQL块§PLSQL结构§标识符§PLSQL变量类型§变量类型§复合类型§使用ROWTYPE§LOB类型*§Bind变量§INDEXBYTABLES§数据类型的转换*§运算符和表达式(数据定义)§关系运算符§一般运算符§逻辑运算符§变量赋值§字符及数字运算特点§BOOLEAN赋值§数据库赋值§可转换的类型赋值§变量作用范围及可见性§注释§简单例子§简单数据插入例子§简单数据删除例子第三章PLSQL流程控制语句§条件语句§CASE表达式§循环§标号和GOTO§语句第四章游标的使用§游标概念§处理显式游标§处理隐式游标§游标修改和删除操作第五章异常错误处理§异常处理概念§预定义的异常处理§非预定义的异常处理§用户自定义的异常处理§用户定义的异常处理§异常错误传播§在执行部分引发异常错误§在声明部分引发异常错误§异常错误处理编程§在PLSQL中使用SQLCODE,SQLERRM第六章存储函数和过程§引言§创建函数§存储过程§创建过程§调用存储过程§开发存储过程步骤§与过程相关数据字典第七章包的创建和应用§引言§包的定义§包的开发步骤§包定义的说明§子程序重载§删除过程、函数和包§包的管理第八章触发器§触发器类型§DML触发器§替代触发器§系统触发器§创建触发器§触发器触发次序§创建DML触发器§创建替代(Insteadof)触发器§创建系统事件触发器§系统触发器事件属性§使用触发器谓词§重新编译触发器§删除和使能触发器§触发器和数据字典§数据库触发器的应用举例第章​ PLSQL程序设计简介PLSQL是一种高级数据库程序设计语言该语言专门用于在各种环境下对ORACLE数据库进行访问。由于该语言集成于数据库服务器中所以PLSQL代码可以对数据进行快速高效的处理。除此之外可以在ORACLE数据库的某些客户端工具中使用PLSQL语言也是该语言的一个特点。本章的主要内容是讨论引入PLSQL语言的必要性和该语言的主要特点以及了解PLSQL语言的重要性和数据库版本问题。还要介绍一些贯穿全书的更详细的高级概念并在本章的最后就我们在本书案例中使用的数据库表的若干约定做一说明。本章主要重点:​ PLSQL概述​ PLSQL块结构​ PLSQL流程​ 运算符和表达式​ 游标​ 异常处理​ 数据库存储过程和函数​ 包​ 触发器§SQL与PLSQL§什么是PLSQLPLSQL是ProcedureLanguageStructuredQueryLanguage的缩写。ORACLE的SQL是支持ANSI(AmericannationalStandardsInstitute)和ISO(InternationalStandardsOrganization)标准的产品。PLSQL是对SQL语言存储过程语言的扩展。从ORACLE以后ORACLE的RDBMS附带了PLSQL。它现在已经成为一种过程处理语言简称PLSQL。目前的PLSQL包括两部分一部分是数据库引擎部分另一部分是可嵌入到许多产品(如C语言JAVA语言等)工具中的独立引擎。可以将这两部分称为:数据库PLSQL和工具PLSQL。两者的编程非常相似。都具有编程结构、语法和逻辑机制。工具PLSQL另外还增加了用于支持工具(如ORACLEForms)的句法如:在窗体上设置按钮等。本章主要介绍数据库PLSQL内容。§PLSQL的好处§有利于客户服务器环境应用的运行对于客户服务器环境来说真正的瓶颈是网络上。无论网络多快只要客户端与服务器进行大量的数据交换。应用运行的效率自然就回受到影响。如果使用PLSQL进行编程将这种具有大量数据处理的应用放在服务器端来执行。自然就省去了数据在网上的传输时间。§适合于客户环境PLSQL由于分为数据库PLSQL部分和工具PLSQL。对于客户端来说PLSQL可以嵌套到相应的工具中客户端程序可以执行本地包含PLSQL部分也可以向服务发SQL命令或激活服务器端的PLSQL程序运行。§PLSQL可用的SQL语句PLSQL是ORACLE系统的核心语言现在ORACLE的许多部件都是由PLSQL写成。在PLSQL中可以使用的SQL语句有:INSERTUPDATEDELETESELECTINTOCOMMITROLLBACKSAVEPOINT。提示:在PLSQL中只能用SQL语句中的DML部分不能用DDL部分如果要在PLSQL中使用DDL(如CREATEtable等)的话只能以动态的方式来使用。​ ORACLE的PLSQL组件在对PLSQL程序进行解释时同时对在其所使用的表名、列名及数据类型进行检查。​ PLSQL可以在SQL*PLUS中使用。​ PLSQL可以在高级语言中使用。​ PLSQL可以在ORACLE的开发工具中使用。​ 其它开发工具也可以调用PLSQL编写的过程和函数如PowerBuilder等都可以调用服务器端的PLSQL过程。§运行PLSQL程序PLSQL程序的运行是通过ORACLE中的一个引擎来进行的。这个引擎可能在ORACLE的服务器端也可能在ORACLE应用开发的客户端。引擎执行PLSQL中的过程性语句然后将SQL语句发送给数据库服务器来执行。再将结果返回给执行端。第二章PLSQL块结构和组成元素§PLSQL块PLSQL程序由三个块组成即声明部分、执行部分、异常处理部分。PLSQL块的结构如下:DECLARE*声明部分:在此声明PLSQL用到的变量,类型及游标以及局部的存储过程和函数*BEGIN*执行部分:过程及SQL语句,即程序的主要部分*EXCEPTION*执行异常部分:错误处理*END其中执行部分是必须的。PLSQL块可以分为三类:​ 无名块:动态构造只能执行一次。​ 子程序:存储在数据库中的存储过程、函数及包等。当在数据库上建立好后可以在其它程序中调用它们。​ 触发器:当数据库发生操作时会触发一些事件从而自动执行相应的程序。§PLSQL结构​ PLSQL块中可以包含子块​ 子块可以位于PLSQL中的任何部分​ 子块也即PLSQL中的一条命令§标识符PLSQL程序设计中的标识符定义与SQL的标识符定义的要求相同。要求和限制有:​ 标识符名不能超过字符​ 第一个字符必须为字母​ 不分大小写​ 不能用’‘(减号)​ 不能是SQL保留字。提示:一般不要把变量名声明与表中字段名完全一样,如果这样可能得到不正确的结果例如:下面的例子将会删除所有的纪录而不是KING的记录DECLAREEnamevarchar():=’KING’BEGINDELETEFROMempWHEREename=enameEND变量命名在PLSQL中有特别的讲究建议在系统的设计阶段就要求所有编程人员共同遵守一定的要求使得整个系统的文档在规范上达到要求。下面是建议的命名方法:标识符命名规则例子程序变量VnameVname程序常量CNameCcompanyname游标变量NamecursorEmpcursor异常标识EnameEtoomany表类型NametabletypeEmprecordtype表NametableEmp记录类型NamerecordEmprecordSQL*Plus替代变量PnamePsal绑定变量GnameGyearsal§PLSQL变量类型在前面的介绍中有系统的数据类型也可以自定义数据类型。下表是ORACLE类型和PLSQL中的变量类型的合法使用列表:§变量类型在ORACLEi中可以使用的变量类型有:类型子类说明范围ORACLE限制CHARCharacterStringRowidNchar定长字符串民族语言字符集可选,确省=VARCHARVarchar,StringNVARCHAR可变字符串民族语言字符集BINARYINTEGER带符号整数,为整数计算优化性能NUMBER(p,s)DecDoubleprecisionIntegerIntNumericRealSmallint小数,NUMBER的子类型高精度实数整数,NUMBER的子类型整数,NUMBER的子类型与NUMBER等价与NUMBER等价整数,比integer小LONG变长字符串>,字节DATE日期型公元前年月日至公元后年月日BOOLEAN布尔型TRUE,FALSE,不使用ROWID存放数据库行号UROWID通用行标识符字符类型例​ 插入一条记录并显示DECLARERowidUROWIDinfoVARCHAR()BEGININSERTINTOdeptVALUES(,‘SERVICE’,‘BEIJING’)RETURNINGrowid,dname||’:’||tochar(deptno)||’:’||locINTOrowid,infoDBMSOUTPUTPUTLINE(‘ROWID:’||rowid)DBMSOUTPUTPUTLINE(info)END其中:RETURNING子句用于检索INSERT语句中所影响的数据行数当INSERT语句使用VALUES子句插入数据时RETURNING字句还可将列表达式、ROWID和REF值返回到输出变量中。在使用RETURNING子句是应注意以下几点限制:.​ 不能并行DML语句和远程对象一起使用.​ 不能检索LONG类型信息.​ 当通过视图向基表中插入数据时只能与单基表视图一起使用。例修改一条记录并显示DECLARERowidUROWIDinfoVARCHAR()BEGINUPDATEdeptSETdeptno=WHEREDNAME=‘SERVICE’RETURNINGrowid,dname||’:’||tochar(deptno)||’:’||locINTOrowid,infoDBMSOUTPUTPUTLINE(‘ROWID:’||rowid)DBMSOUTPUTPUTLINE(info)END其中:RETURNING子句用于检索被修改行信息:当UPDATE语句修改单行数据时RETURNING子句可以检索被修改行的ROWID和REF值以及行中被修改列的列表达式并可将他们存储到PLSQL变量或复合变量中当UPDATE语句修改多行数据时RETURNING子句可以将被修改行的ROWID和REF值以及列表达式值返回到复合变量数组中。在UPDATE中使用RETURNING子句的限制与INSERT语句中对RETURNING子句的限制相同。例删除一条记录并显示DECLARERowidUROWIDinfoVARCHAR()BEGINDELETEdeptWHEREDNAME=‘SERVICE’RETURNINGrowid,dname||’:’||tochar(deptno)||’:’||locINTOrowid,infoDBMSOUTPUTPUTLINE(‘ROWID:’||rowid)DBMSOUTPUTPUTLINE(info)END其中:RETURNING子句用于检索被修改行信息:当UPDATE语句修改单行数据时RETURNING子句可以检索被修改行的ROWID和REF值以及行中被修改列的列表达式并可将他们存储到PLSQL变量或复合变量中当UPDATE语句修改多行数据时RETURNING子句可以将被修改行的ROWID和REF值以及列表达式值返回到复合变量数组中。在UPDATE中使用RETURNING子句的限制与INSERT语句中对RETURNING子句的限制相同。§复合类型ORACLE在PLSQL中除了提供象前面介绍的各种类型外,还提供一种称为复合类型的类型记录和表§记录类型记录类型是把逻辑相关的数据作为一个单元存储起来它必须包括至少一个标量型或RECORD数据类型的成员称作PLSQLRECORD的域(FIELD)其作用是存放互不相同但逻辑相关的信息。定义记录类型语法如下:TYPErecordtypeISRECORD(FieldtypeNOT:=exp,FieldtypeNOT:=exp,FieldntypenNOT:=expn)例:DECLARETYPEtestrecISRECORD(CodeVARCHAR(),NameVARCHAR()NOT:=’abook’)VbooktestrecBEGINVbookcode:=’’Vbookname:=’CProgramming’DBMSOUTPUTPUTLINE(vbookcode||vbookname)END可以用SELECT语句对记录变量进行赋值,只要保证记录字段与查询结果列表中的字段相配即可。§使用TYPE定义一个变量其数据类型与已经定义的某个数据变量的类型相同或者与数据库表的某个列的数据类型相同这时可以使用TYPE。使用TYPE特性的优点在于:​ 所引用的数据库列的数据类型可以不必知道​ 所引用的数据库列的数据类型可以实时改变。例:DECLARE用TYPE类型定义与表相配的字段TYPEtRecordISRECORD(TnoempempnoTYPE,TnameempenameTYPE,TsalempsalTYPE)声明接收数据的变量vemptRecordBEGINSELECTempno,ename,salINTOvempFROMempWHEREempno=DBMSOUTPUTPUTLINE(TOCHAR(vemptno)||vemptname||TOCHAR(vemptsal))END例:DECLAREvempnoempempnoTYPE:=empnoTyperrecordisrecord(vnameempenameTYPE,vsalempsalTYPE,vdateemphiredateTYPE)RecrrecordBEGINSELECTename,sal,hiredateINTORecFROMempWHEREempno=vempnoDBMSOUTPUTPUTLINE(Recvname||''||Recvsal||''||Recvdate)END§使用ROWTYPEPLSQL提供ROWTYPE操作符,返回一个记录类型,其数据类型和数据库表的数据结构相一致。使用ROWTYPE特性的优点在于:​ 所引用的数据库中列的个数和数据类型可以不必知道​ 所引用的数据库中列的个数和数据类型可以实时改变。例:DECLAREvempnoempempnoTYPE:=empnorecempROWTYPEBEGINSELECT*INTOrecFROMempWHEREempno=vempnoDBMSOUTPUTPUTLINE('姓名:'||recename||'工资:'||recsal||'工作时间:'||rechiredate)END§LOB类型*ORACLE提供了LOB(LargeOBject)类型用于存储大的数据对象的类型。ORACLE目前主要支持BFILE,BLOB,CLOB及NCLOB类型。BFILE(Movie)存放大的二进制数据对象这些数据文件不放在数据库里而是放在操作系统的某个目录里数据库的表里只存放文件的目录。BLOB(Photo)存储大的二进制数据类型。变量存储大的二进制对象的位置。大二进制对象的大小<=GB。CLOB(Book)存储大的字符数据类型。每个变量存储大字符对象的位置该位置指到大字符数据块。大字符对象的大小<=GB。NCLOB存储大的NCHAR字符数据类型。每个变量存储大字符对象的位置该位置指到大字符数据块。大字符对象的大小<=GB。§Bind变量绑定变量是在主机环境中定义的变量。在PLSQL程序中可以使用绑定变量作为他们将要使用的其它变量。为了在PLSQL环境中声明绑定变量使用命令VARIABLE。例如:VARIABLEreturncodeNUMBERVARIABLEreturnmsgVARCHAR()可以通过SQL*Plus命令中的PRINT显示绑定变量的值。例如:PRINTreturncodePRINTreturnmsg例:VARIABLEresultNUMBERBEGINSELECT(sal*)nvl(comm,)INTO:resultFROMempWHEREempno=ENDPRINTresult§INDEXBYTABLES包括两个基本成分:.数据处理类型为BINARYINTEGER主键.标量或记录数据类型的列.TYPEtypenameISTABLEOF{columntype|variableTYPE|tablecolumnTYPE}NOT|tableROWTYPEINDEXBYBINARYINTEGER方法描述EXISTS(n)ReturnTRUEifthenthelementinaPLSQLtableexistsCOUNTReturnsthenumberofelementsthataPLSQLtablecurrentlycontainsFIRSTLASTReturnthefirstandlast(smallestandlastest)indexnumbersinaPLSQLtableReturnsifthePLSQLtableisemptyPRIOR(n)ReturnstheindexnumberthatprecedesindexninaPLSQLtableNEXT(N)ReturnstheindexnumberthatsucceedsindexninaPLSQLtableTRIMTRIMremovesoneelementfromtheendofaPLSQLtableTRIM(n)removesnelementfromtheendofaPLSQLtableDELETEDELETEremovesallelementsfromaPLSQLtableDELETE(n)removesthenthelementsfromaPLSQLtableDELETE(m,n)removesallelementsintherangemtonfromaPLSQLtable例:DECLARETYPEdepttabletypeISTABLEOFdeptROWTYPEINDEXBYBINARYINTEGERmydnametabledepttabletypevcountnumber():=BEGINFORintINvcountLOOPSELECT*INTOmydnametable(int)FROMdeptWHEREdeptno=int*ENDLOOPFORintINmydnametableFIRSTmydnametableLASTLOOPDBMSOUTPUTPUTLINE(‘Departmentnumber:‘||mydnametable(int)deptno)DBMSOUTPUTPUTLINE(‘Departmentname:‘||mydnametable(int)dname)ENDLOOPEND§数据类型的转换*隐式类型转换BININTCHARDATELONGNUMBERPLSINTUROWIDVARCHARBININT CHAR DATELONGNUMBERRAWUROWIDVARCHAR§运算符和表达式(数据定义)§关系运算符运算符意义=等于<>,!=,~=,^=不等于<小于>大于<=小于或等于>=大于或等于§一般运算符运算符意义加号减号*乘号除号:=赋值号=>关系号范围运算符||字符连接符§逻辑运算符运算符意义IS是空值 BETWEEN介于两者之间IN在一列值中间 AND逻辑与OR逻辑或NOT取返,如ISNOT,NOTIN§变量赋值在PLSQL编程中变量赋值是一个值得注意的地方它的语法如下:variable:=expressionvariable是一个PLSQL变量,expression是一个PLSQL表达式§字符及数字运算特点空值加数字仍是空值:<数字>=空值加(连接)字符结果为字符:||<字符串>=<字符串>§BOOLEAN赋值布尔值只有TRUE,FALSE及三个值。如:DECLAREdoneBOOLEAN*thefollowingstatementsarelegal:*BEGINdone:=FALSEWHILENOTdoneLOOPENDLOOPEND§数据库赋值数据库赋值是通过SELECT语句来完成的每次执行SELECT语句就赋值一次一般要求被赋值的变量与SELECT中的列名要一一对应。如:例:DECLAREempidempempnoTYPE:=empnameempenameTYPEwagesempsalTYPEBEGINSELECTename,NVL(sal,)NVL(comm,)INTOempname,wagesFROMempWHEREempno=empidDbmsoutputputline(empname||’‘||tochar(wages))END提示:不能将SELECT语句中的列赋值给布尔变量。§可转换的类型赋值​ CHAR转换为NUMBER:使用TONUMBER函数来完成字符到数字的转换如:vtotal:=TONUMBER(‘’)sal​ NUMBER转换为CHAR:使用TOCHAR函数可以实现数字到字符的转换如:vcomm:=TOCHAR(‘’)||’元’​ 字符转换为日期:使用TODATE函数可以实现字符到日期的转换如:vdate:=TODATE('','yyyymmdd')​ 日期转换为字符使用TOCHAR函数可以实现日期到字符的转换如:vtoday:=TOCHAR(SYSDATE,'yyyymmddhh:mi:ss')§变量作用范围及可见性在PLSQL编程中如果在变量的定义上没有做到统一的话可能会隐藏一些危险的错误这样的原因主要是变量的作用范围所致。与其它高级语言类似PLSQL的变量作用范围特点是:​ 变量的作用范围是在你所引用的程序单元(块、子程序、包)内。即从声明变量开始到该块的结束。​ 一个变量(标识)只能在你所引用的块内是可见的。​ 当一个变量超出了作用范围PLSQL引擎就释放用来存放该变量的空间(因为它可能不用了)。​ 在子块中重新定义该变量后它的作用仅在该块内。例:DECLAREEmesschar()BEGINDECLAREVNUMBER()BEGINSELECTempnoINTOvFROMempWHERELOWER(job)=’president’DBMSOUTPUTPUTLINE(V)EXCEPTIONWhenTOOMANYROWSTHENDBMSOUTPUTPUTLINE(‘Morethanonepresident’)ENDDECLAREVNUMBER()BEGINSELECTempnoINTOvFROMempWHERELOWER(job)=’manager’EXCEPTIONWhenTOOMANYROWSTHENDBMSOUTPUTPUTLINE(‘Morethanonemanager’)ENDEXCEPTIONWhenothersTHENEmess:=substr(SQLERRM,,)DBMSOUTPUTPUTLINE(emess)END§注释在PLSQL里可以使用两种符号来写注释即:​ 使用双‘‘(减号)加注释PLSQL允许用–来写注释它的作用范围是只能在一行有效。如:VSalNUMBER(,)工资变量。​ 使用**来加一行或多行注释如:************************************************文件名:statistcssalsql************************************************提示:被解释存放在数据库中的PLSQL程序一般系统自动将程序头部的注释去掉。只有在PROCEDURE之后的注释才被保留另外程序中的空行也自动被去掉。§简单例子§简单数据插入例子例:*本例子仅是一个简单的插入不是实际应用。*DECLAREvenameVARCHAR():=‘Bill’vsalNUMBER(,):=vdeptnoNUMBER():=vempnoNUMBER():=BEGININSERTINTOemp(empno,ename,JOB,sal,deptno,hiredate)VALUES(vempno,vename,‘Manager’,vsal,vdeptno,TODATE(’’,’yyyymmdd’))COMMITEND§简单数据删除例子例:*本例子仅是一个简单的删除例子不是实际应用。*DECLAREvempnonumber():=BEGINDELETEFROMempWHEREempno=vempnoCOMMITEND第三章PLSQL流程控制语句介绍PLSQL的流程控制语句,包括如下三类:​ 控制语句:IF语句​ 循环语句:LOOP语句,EXIT语句​ 顺序语句:GOTO语句,语句§条件语句IF<布尔表达式>THENPLSQL和SQL语句ENDIFIF<布尔表达式>THENPLSQL和SQL语句ELSE其它语句ENDIFIF<布尔表达式>THENPLSQL和SQL语句ELSIF<其它布尔表达式>THEN其它语句ELSIF<其它布尔表达式>THEN其它语句ELSE其它语句ENDIF提示:ELSIF不能写成ELSEIF例:DECLAREvempnoempempnoTYPE:=empnoVsalaryempsalTYPEVcommentVARCHAR()BEGINSELECTsalINTOvsalaryFROMempWHEREempno=vempnoIFvsalary<THENVcomment:=‘Fairlyless’ELSIFvsalary<THENVcomment:=‘Alittlemore’ELSEVcomment:=‘Lotsofsalary’ENDIFDBMSOUTPUTPUTLINE(Vcomment)END§CASE表达式CASEselectorWHENexpressionTHENresultWHENexpressionTHENresultWHENexpressionNTHENresultNELSEresultNEND例:DECLAREVgradechar():=UPPER(‘pgrade’)VappraisalVARCHAR()BEGINVappraisal:=CASEvgradeWHEN‘A’THEN‘Excellent’WHEN‘B’THEN‘VeryGood’WHEN‘C’THEN‘Good’ELSE‘Nosuchgrade’ENDDBMSOUTPUTPUTLINE(‘Grade:‘||vgrade||’Appraisal:‘||vappraisal)END§循环简单循环LOOP要执行的语句EXITWHEN<条件语句>*条件满足退出循环语句*ENDLOOP例DECLAREintNUMBER():=BEGINLOOPint:=intDBMSOUTPUTPUTLINE('int的当前值为:'||int)EXITWHENint=ENDLOOPENDWHILE循环WHILE<布尔表达式>LOOP要执行的语句ENDLOOP例DECLARExNUMBERBEGINx:=WHILEx<LOOPDBMSOUTPUTPUTLINE('X的当前值为:'||x)x:=xENDLOOPEND数字式循环FOR循环计数器INREVERSE下限上限LOOP要执行的语句ENDLOOP每循环一次循环变量自动加使用关键字REVERSE循环变量自动减。跟在INREVERSE后面的数字必须是从小到大的顺序而且必须是整数不能是变量或表达式。可以使用EXIT退出循环。例BEGINFORintinLOOPDBMSOUTPUTPUTLINE('int的当前值为:'||int)ENDLOOPEND例CREATETABLEtemptable(numcolNUMBER)DECLAREVcounterNUMBER:=BEGININSERTINTOtemptable(numcol)VALUES(vcounter)FORvcounterINLOOPINSERTINTOtemptable(numcol)VALUES(vcounter)ENDLOOPINSERTINTOtemptable(numcol)VALUES(vcounter)FORvcounterINREVERSELOOPINSERTINTOtemptable(numcol)VALUES(vcounter)ENDLOOPENDDROPTABLEtemptable§标号和GOTOPLSQL中GOTO语句是无条件跳转到指定的标号去的意思。语法如下:GOTOlabel<<label>> *标号是用<< >>括起来的标识符*例:DECLAREVcounterNUMBER:=BEGINLOOPDBMSOUTPUTPUTLINE('Vcounter的当前值为:'||Vcounter)Vcounter:=vcounterIFvcounter>THENGOTOlENDofLOOPENDIFENDLOOP<<lENDofLOOP>>DBMSOUTPUTPUTLINE('Vcounter的当前值为:'||Vcounter)END§语句在PLSQL程序中可以用语句来说明“不用做任何事情”的意思相当于一个占位符可以使某些语句变得有意义提高程序的可读性。如:DECLAREBEGIN…IFvnumISTHENGOTOprintENDIF…<<print>>不需要处理任何数据。END第四章游标的使用在PLSQL程序中对于处理多行记录的事务经常使用游标来实现。§游标概念为了处理SQL语句ORACLE必须分配一片叫上下文(contextarea)的区域来处理所必需的信息其中包括要处理的行的数目一个指向语句被分析以后的表示形式的指针以及查询的活动集(activeset)。游标是一个指向上下文的句柄(handle)或指针。通过游标PLSQL可以控制上下文区和处理语句时上下文区会发生些什么事情。对于不同的SQL语句游标的使用情况不同:SQL语句游标非查询语句隐式的结果是单行的查询语句隐式的或显示的结果是多行的查询语句显示的§处理显式游标​ 显式游标处理显式游标处理需四个PLSQL步骤:​ 定义游标:就是定义一个游标名以及与其相对应的SELECT语句。格式:CURSORcursorname(parameter,parameter…)ISselectstatement游标参数只能为输入参数其格式为:parameternameINdatatype{:=|DEFAULT}expression在指定数据类型时不能使用长度约束。如NUMBER()、CHAR()等都是错误的。​ 打开游标:就是执行游标所对应的SELECT语句将其查询结果放入工作区并且指针指向工作区的首部标识游标结果集合。如果游标查询语句中带有FORUPDATE选项OPEN语句还将锁定数据库表中游标结果集合对应的数据行。格式:OPENcursorname(parameter=>value,parameter=>value…)在向游标传递参数时可以使用与函数参数相同的传值方法即位置表示法和名称表示法。PLSQL程序不能用OPEN语句重复打开一个游标。​ 提取游标数据:就是检索结果集合中的数据行放入指定的输出变量中。格式:FETCHcursornameINTO{variablelist|recordvariable}​ 对该记录进行处理​ 继续处理直到活动集合中没有记录​ 关闭游标:当提取和处理完游标结果集合数据后应及时关闭游标以释放该游标所占用的系统资源并使该游标的工作区变成无效不能再使用FETCH语句取其中数据。关闭后的游标可以使用OPEN语句重新打开。格式:CLOSEcursorname注:定义的游标不能有INTO子句。例游标参数的传递方法。DECLAREDeptRecdeptROWTYPEDeptnamedeptdnameTYPEDeptlocdeptlocTYPECURSORcISSELECTdname,locFROMdeptWHEREdeptno<=CURSORc(deptnoNUMBERDEFAULT)ISSELECTdname,locFROMdeptWHEREdeptno<=deptnoCURSORc(deptnoNUMBERDEFAULT)ISSELECT*FROMdeptWHEREdeptno<=deptnoBEGINOPENcLOOPFETCHcINTOdeptname,deptlocEXITWHENcNOTFOUNDDBMSOUTPUTPUTLINE(deptname||’‘||deptloc)ENDLOOPCLOSEcOPENcLOOPFETCHcINTOdeptname,deptlocEXITWHENcNOTFOUNDDBMSOUTPUTPUTLINE(deptname||’‘||deptloc)ENDLOOPCLOSEcOPENc(deptno=>)LOOPFETCHcINTOdeptrecEXITWHENcNOTFOUNDDBMSOUTPUTPUTLINE(deptrecdeptno||’‘||deptrecdname||’‘||deptrecloc)ENDLOOPCLOSEcEND游标属性FOUND布尔型属性当最近一次读记录时成功返回,则值为TRUENOTFOUND布尔型属性与FOUND相反ISOPEN布尔型属性当游标已打开时返回TRUEROWCOUNT数字型属性返回已从游标中读取的记录数。例:给工资低于的员工增加工资。DECLAREvempnoempempnoTYPEvsalempsalTYPECURSORcISSELECTempno,salFROMempBEGINOPENcLOOPFETCHcINTOvempno,vsalEXITWHENCNOTFOUNDIFvsal<=THENUPDATEempSETsal=salWHEREempno=vempnoDBMSOUTPUTPUTLINE('编码为'||vempno||'工资已更新!')ENDIFDBMSOUTPUTPUTLINE('记录数:'||CROWCOUNT)ENDLOOPCLOSEcEND游标的FOR循环PLSQL语言提供了游标FOR循环语句自动执行游标的OPEN、FETCH、CLOSE语句和循环语句的功能当进入循环时游标FOR循环语句自动打开游标并提取第一行游标数据当程序处理完当前所提取的数据而进入下一次循环时游标FOR循环语句自动提取下一行数据供程序处理当提取完结果集合中的所有数据行后结束循环并自动关闭游标。格式:FORindexvariableINcursornamevalue,value…LOOP游标数据处理代码ENDLOOP其中:indexvariable为游标FOR循环语句隐含声明的索引变量该变量为记录变量其结构与游标查询语句返回的结构集合的结构相同。在程序中可以通过引用该索引记录变量元素来读取所提取的游标数据indexvariable中各元素的名称与游标查询语句选择列表中所制定的列名相同。如果在游标查询语句的选择列表中存在计算列则必须为这些计算列指定别名后才能通过游标FOR循环语句中的索引变量来访问这些列数据。注:不要在程序中对游标进行人工操作不要在程序中定义用于控制FOR循环的记录。例:DECLARECURSORcsalISSELECTempno,ename,salFROMempBEGIN隐含打开游标FORvsalINcsalLOOP隐含执行一个FETCH语句DBMSOUTPUTPUTLINE(tochar(vsalempno)||’‘||vsalename||’‘||tochar(vsalsal))隐含监测csalNOTFOUNDENDLOOP隐含关闭游标END例:当所声明的游标带有参数时通过游标FOR循环语句为游标传递参数。DECLARECURSORc(deptnoNUMBERDEFAULT)ISSELECTdname,locFROMdeptWHEREdeptno<=deptnoBEGINDBMSOUTPUTPUTLINE(‘deptno参数值为:’)FORcrecINc()LOOPDBMSOUTPUTPUTLINE(crecdname||’‘||crecloc)ENDLOOPDBMSOUTPUTPUTLINE(CHR()||’使用默认的deptno参数值:’)FORcrecINcLOOPDBMSOUTPUTPUTLINE(crecdname||’‘||crecloc)ENDLOOPEND例:PLSQL还允许在游标FOR循环语句中使用子查询来实现游标的功能。BEGINFORcrecIN(SELECTdname,locFROMdept)LOOPDBMSOUTPUTPUTLINE(crecdname||’‘||crecloc)ENDLOOPEND§处理隐式游标显式游标主要是用于对查询语句的处理尤其是在查询结果为多条记录的情况下而对于非查询语句如修改、删除操作则由ORACLE系统自动地为这些操作设置游标并创建其工作区这些由系统隐含创建的游标称为隐式游标隐式游标的名字为SQL这是由ORACLE系统定义的。对于隐式游标的操作如定义、打开、取值及关闭操作都由ORACLE系统自动地完成无需用户进行处理。用户只能通过隐式游标的相关属性来完成相应的操作。在隐式游标的工作区中所存放的数据是与用户自

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

评分:

/61

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利