1PL/SQL程序设计(上册)写在前面之所以不怕麻烦把有关PL/SQL的知识写下来,一方面,是为了加深理解,便于以后随时翻阅,另一方面,是因为自己看书总是不能从头看到尾,仔仔细细,喜欢跳跃式阅读,导致学习过程中,容易有遗漏。所以,将学习到的知识总结起来,方便监督自己,方便大家查阅。本文所记录的内容当然不是本人凭经验而写,而是学习的笔记,参考的资料以《Oracle9iPLSQLFundamentals》和《Oracle9iDevelopPLSQLProgramUnits》为核心,其次,还包括《精通Oracle10gPLSQL编程》和《OraclePLSQLBestPractices》等。由于是学习笔记么,说是教程,其实是在吸引大家的注意,呵呵,主要是想在方便大家查阅和入门者入门外,希望大家多多指教,多多提出意见,共同把这块知识学熟、学通、学透。QuasarWei’sEmail:quasarbrave@gmail.comQuasarWei’sQQ:734089783QuasarWei’sRealName:WeiZhaozheofNEU2目录PL/SQL程序设计(上册)............................................................................................................1第一章认识PL/SQL........................................................................................................................3第二章SQL回顾.............................................................................................................................5第三章PL/SQL的基本结构.............................................................................................................7第四章PL/SQL的数据类型及使用...............................................................................................10第五章流程控制...........................................................................................................................29第六章游标...................................................................................................................................35第七章异常处理...........................................................................................................................46第八章下册预知...........................................................................................................................493第一章认识PL/SQL这一章主要记录了两个问题:1什么是PL/SQL?2PL/SQL有什么优势?下面从这两个问题展开论述。什么是PL/SQL?PL/SQL即procedurallanguage/standardquerylanguage,PL/SQL是具备程序设计语言特性(如:定义变量、流程控制、面向对象等)的、关系数据库标准查询语言SQL的过程性拓展(proceduralextension)。SQL是非过程语言,非过程,让我理解,就是不用你了解语句的处理过程,而直接达到开发者的目的。如:selectnamefromstudent这条语句,就是向数据库说:‚我要学生的姓名‛,然后数据库就会返回相应的字段值而我们并不知道它是如何处理的也基本无法控制。而PL/SQL语言,则具备程序设计语言甚至高级程序设计语言的特点,更好地满足我们对数据的操作。PL/SQL有什么优势?PL/SQL的优势可以概括为以下五点(待补充):1具备程序设计语言的特性(模块化、信息隐藏、面向对象等);2异常处理,PL/SQL具备异常处理的机制;3可移植,想想Java吧,看看两者有什么共同之处?PL/SQL的JVM就是OracleServer,呵呵4改善性能,一方面,通过PL/SQL语句块(Block)可以一次性向OracleServer发送多个SQL语句,减少网络的传输;另一方面,有4些PL/SQL可以在客户端执行(前提是某些客户端含有PL/SQL引擎),可以有效的减少与OracleServer的交互;再有,PL/SQL通常会存储在Oracle数据库中,这对于网络程序来说真是天降福音,因为,这样一系列的处理交互,都可以以一个调用数据库本身存在的程序而完成,大大提高了性能。5可以与SQL交互,在PL/SQL中可以嵌入SQL的DML、DQL、TCL(事务控制语言)语句。5第二章SQL回顾你都开始对PL/SQL感性趣了,那么SQL肯定是多多少少听说过的,呵呵,就回顾一些基础吧,那些拓展的内容,建议是遇见了再研究吧。DQL:源码dql.sql:selectdname,max(sal)--5对列筛选(分组字段或聚集函数)fromempleftouterjoindept--1确定表using(deptno)wheredeptno0--2确定行(记录)groupbydname--3将行分组havingmax(comm)isnullormax(comm)0--4对组筛选orderbydname--6对结果集排序如上的源码表示了SQL语句的执行顺序,这个一定要理解好啊!思考题:问题:为什么带有groupby的select和having只能含有分组字段和聚集函数呢?答:因为groupby分组后,只能对组进行操作了。也就是说,无论你是筛选行having还是列select,都要以组为单位进行,所以只能使用组共有的属性,除了分组字段外,只有像什么每组的最大值啊、最小值啊、平均值啊等等这些组的特性或叫组员共有的特性。所以在使用时一定注意,带有groupby后,having和select中只能有-分组字6段和聚集函数DML:insertintovalues就不再重复了,不过听说现在可以一次性向多个表中插入呢,使用insertintoall和insertintofirst,具体用法如下:insertintoall/firstwhen条件theninto表1when条件theninto表2when条件theninto表3elseinto表4selectfrom表源至于ALL和FIRST的区别就是:如果是ALL,就会插入所有满足条件的表,而如果是FIRST直插入第一个满足条件的表。TCL:commit;rollbacktoA;savepointA;不多写了,因为我也只知道这点儿了,呵呵,不过听说SQL有个优化hint挺好玩,如:insert/+append+/intotablevaluesXXX;还有对Groupby的拓展rollup和cube,还有grouping函数、groupset等,以后再研究把,谁让俺是菜鸟呢?7第三章PL/SQL的基本结构本章将从PL/SQL的分类、PL/SQL的基本结构以及第一个PL/SQL程序展开。PL/SQL的分类:按照PL/SQL的运行环境,可以分为客户端PL/SQL和服务器端PL/SQL。通常,我们(指开发者)接触到的PL/SQL都是存储在服务器Oracle数据库中的,所以主要学习这一种就可以了,至于客户端的PL/SQL,我也不太了解啊…,o(︶︿︶)o唉希望大虾在与我联系,加上啊!按照形式,可分为命名的PL/SQL和匿名的PL/SQL,其中,命名的,又可以分为子程序和触发器,而子程序又可以分为包、函数、过程。是不是有点儿?不过不要紧,等你看过整个文章,再回来看就是很简单了。PL/SQL的基本结构如下:Declare在这里可以定义变量、常量、异常等。Begin在这儿可以写一些执行SQL或PL/SQL语句。Exception这儿可以捕获并处理异常怎样在发生异常后让程序继续执行其他语句呢?8答:写在这块儿不就得了,呵呵End;结束了,别忘了‚;‛啊,呵呵你的第一个程序?也是我的,‚hello,world!‛有人说helloworld太老套了,boring,有什么,在你什么都不懂时还能开发出更高级的么,我们就helloworld呵呵。源码:说明:源码都是由PL/SQLDeveloper8开发,于Oracle10g测试--Createdon2010-4-27byQuasar/*这就是你的第一个程序了,也是我的,哈哈*/declaremsgvarchar2(15);--定义变量beginmsg:='HelloWorld';--赋值dbms_output.put_line(msg);--内臵包使用end;运行结果:HelloWorldPL/SQL的注释可以通过这个程序看出来啊,自己看吧,不多说9了…10第四章PL/SQL的数据类型及使用本章将介绍PL/SQL的数据类型,有些数据类型很‚简单‛,有些很难理解,不过都是因为这些数据类型你没有使用过,用几次就知道了,在这里,先认识认识它们,不熟也没关系。PL/SQL的变量类型可以分为标量、复合类型、参照类型和LOB类型四类,下面就分别介绍给大家。标量,就是单值变量,这么说应该可以理解吧。常用的类型如下:字符串:varchar2(n)、char(n)、long、longraw在程序设计中,常常用到字符串的处理,在PL/SQL中,有很好的支持,不但有字符串函数,还有对正则表达式的支持。我们最常用的数据类型就是varchar2(n)了,n用于最大字符长度。其中,char和long、longraw不推荐使用,原因是:前者浪费资源后者不够灵活。数字:number(m,n)、binary_integer、binary_float、binary_double对于数字类型,number是不错的选择,那么m,n代表什么呢?如果定义为number(6,2)则代表整数位最大长度是4,小数位最大长度是2,你猜猜吧,m和n的含义。其中,binary_integer在定义表时是很常用的。binary_float和binary_double是Oracle10g的新数据类型,注意在赋值时格式分别如下:223.4323f和23423.4545d,像Java吧,可能都遵循IEEE-754的浮点数标准吧。布尔:Boolean11布尔值分别为:TRUE、FALSE、NULL日期:Date和TimestampDate默认只显示日期,而Timestamp默认情况下会显示时间信息,还有上下午标志呢,Timestamp是Oracle9i新加入的数据类型。标量的定义格式:vnameDATATYPE[CONSTANT][NOTNULL][:=/DEFAULTexp]例如:namevarchar2(30);REAL_NAMEvarchar2(30)constantdefault‘魏照哲’;namevarchar2(10):=‘hello’;下面是一