Oracle(培训班带出来).docx
P1./SQ1.筒介Orac1.e公司在标准SQ1.语言的基珀上开展出TP1./SQ1.(Proccdura11.anguageZSQ1.,即过程化SQ1.语言语言,将变量、控制结构、过程和函数等结构化程序设计的要素引入SQ1.语言中,这样就能缈编写出较复杂的SQ1.程序了“以bdy<1.的身份登录,创立一个用户表testtab1.ccreatetab1.etesttab1.e(recordNuabernumber(4)notnu1.1.,CurrentDatedatenotnu1.1.):向上逑数据库表中插入100条记录setserveroutputondec1.aremaxrecordsconstantint:=100:inumber:=1.;beginforiin1.maxrccords1.oopinsertintotesttab1.e(recordnuaber.currentdate)va1.ues(i.sysdate);end1.oop:db<ns-output.PUJ1.inc('成功录入效据!,);ccxnnit;end;其中.dbms_3HPin为反统联认的程序包pu1.-1.ine是包中定义的方法,功能是输出信息。P1./SQ1.程序结构结合上述实例迸行分析,一个完整的P1./SQ1.程序的结构可以分成以下3局部:1定义局部:以加C1.dre开:.2程序立所要使用的常量、变量等等它不像高级语言那样可以在程序执行过程中进行定义,所有用到的内容都必须在加C1.HrR中进行定义2执行咽以begin开始”培求中间局部是对效据库的操作语句和各种流程控制语句。3异常处理局部:该局都包含在执行局部里面,以exception标识,该局部用来对应用程序产生的例外进行处理一个完整的P1./SQ1.的结为dec1.are定义局部begin执行局部exception异常处理局部Cnd在上述3周部中,只有bcgin.end局部是不可缺少的1.)begin.end局部setserveroutputonbegindbas_output.put.1.inc(,he1.1owor1.d,):end;2)decIare局部setscrvcrouIputondec1.arev-stuNomevarchar2(20):begin'1.SiuName:=,zhangsan,:db®soutput,put1ine(vStuName);end;dec1.arevStuNamcvarchar2(20)notnu1.1.三=r1.isi,:beginco11三it;end:3)exception异常处理局部setserveroutputondec1.arev_nu«number:=。;beginvnu三:=9/v_num;db®s_output.putin。(JnUno;exceptionwhenothersthendb®soutput,put1ine(,error');end;常量常量的定义:常量名constant数据类型:=(例如:dec1.arePIconstantnu三ber(9):=3.1115926;begincommit:end:变量i根本数据类型芟Ii的定义:变量名数无类型(notnu1.1.:=初始值例如:dec1.areagenumber(3):=25;beginco三mit:end:2复合物霜类型变量:法一:使用看iypc定义变量为了让变量的类型和数据库表中字段的数据类型一致.OraCIC9i袋供了N1.ypc的定义方法这样当数据库表中字段的类型修改后,P1./SQ1.程序中相应变量的类型也自动修改.例如:dec1.aremydatetesttab1.e.CurrentDateStype;beginc三mit:end:法二:记录类型变量很多结构化程序设计语盲都提供了记录类型的蚊据类型,在PIVSQ1.中.也支持格多个根本数据类里掴绑在一起的记录他据类型。例如dec1.aretypeStuInfoisrecord(StuNarocvarchar2(20),StuAgcnumber.birthdaydate);my1.nfostuInfo:beginmy1.nfo.StuName:='zhangsan';my1.nfo.StuAge:=25;my1.nfo.hirthday:=SySdaIe:dbms_output.put_1.IncGnyInfo,birthday):end;法三:使用Mow1.ypc定义变量使用机ype可以使殂变量的类型和数据库表中字段的类型一致,而使用,mgype可以使得变量的类3!和整个记录的类型一致。dec1.aremytab1.ctcsttab1.c%rowtyc:beginse1.ectintomytab1.efromtesttab1.ewhererecordnuMber=99;dbMsoutput,put.1.ineytab1.e,currentdate):end:dec1.aremydeptdept%rowt>pe;beginse1.ect*intomydeptfrodeptwheredeptno=10:dbms_output.put.1.inc(mydet.1.oc):end;在上述例如中,定义了一个变量mytHb1.e它的类型和致据库表testab1.e的结构相同,表达式常量,变贵经常葺诅合成表达式来进行各种运算,下面介绍在P1./SQ1.中常见表达式的运算规则.I算术表达式:算术运算符:+-/*例如:setserveroutputondec1.areresu1.tnumber;beginresu1.t:=10*45+5*2;db三sOUtPU1.PUtine(运算结果是'to_char(resu1.t);end:dec1.areareanumber;radiusnumber:=3:beginarea:=3.1.1.*radiusradius;db®soutput.put_1.ine(area);end:还有关系表达式、迈辑表达式等等。条件控制1)ife1.seif条件then语句段1e1.se语句段2endif;例如:setserveroutputondec1.arenu三ber1.number:=90;n三ber2num!x*r:=30:beginifnuBber1.>=nurber2thendb»s_ou1.put.put-1.inc(,number1.>=nunbcr2,);e1.sedb三s-output.put1ine('number1.<nu三ber2,);endif:end:同结四化程序设计语言一样if语句也可以被套。if条件1thenif条件2then语句段1;e1.se语句段2:endif:e1.se语句段3:endif:dec1.arescorenumber:=76;beginifscorc>=85thendbasoutput,putIineCgood*);e1.seifscore>=75andSCare<85thendbms_output.put.1.inc(,no11na):e1.sedbms_output.put1ine('worse');endif:endif:end;case语句dec1.arescorenumber:=88:gradevarchar2(20):begincasewhenscore>=90thendbms_output.put_1.ine('');whenscore>=80andscore<=89then<i1.xns_output.put_1ine(,B*):whenscorebetween70and79thendbms.output.put.1ino(,C*):e1.sedbmsoutput,put1ine(,be1.owC,);endcase;end:循环控制1) 1.oopexitend1.oop1.oop循环体if条件语句thenexit;e1.se退出循环的语句处理endif:end1.oop;例如:setScrvcrouiputondec1.arenUBber1.number:=80;n三ber2number:=90:1 nu三ber:=0:begin1.oopnumher1.z=num1.)er1.÷1.:ifnumber1.=numbcr2thenexit;e1.se1 :=i+1:endif:to-char(i);end1.oop;dbms.output.put_1.ine(,共循环次数:end:2) 1.oopexitwhen.end1.oopexitwhen等价于if条件thenexit:endif:例如:setserverouIputondec1.aren三ber1.number:=80;nmber2num1.wr:=90:1 nu三ber:=0;begin1.oopnumber1:=number1÷1:i:=i+1;exitwhennumber1.=num1.M*r2:end1.oop:dbmsoutput.put1.ine('共循环次数:'tochar(i);end;3) whi1.e-1.oop-end1.oopwhi1.e条件1.oop询环体end1.oop:例如:setserveroutputondec1.are11三ber1.number:=80;nuBber2number:=90;1 nuber:=0:beginwhiIenumber1.<numbcr21.oopnumberz=num1.)er1.÷ki:=i+1:end1.oop;dbms_oUtPUt.putino('共循环次数:1.tohar(i);end:4) forin.1.oopend100Pfa循环变量in循环下界缩环上界1.oop循环体end1.oop;例如:setserveroututondec1.aren三ber1.number:=80;nmber2num!>er:=90:1 nu三bcr:=0:beginforiin1.101.(pnunbcr1.j=numbcr1.÷1.:end1.oop;dbms_output.put_1.ine(,number1='to_char(number1):end:事务为什么需要事务?什么是事务?事务是一种机制.是一不操作序列,它包含了一盥数据库操作令令,并且所有命令作为一个整体一越向系统提交或撤锁操作请求,即这一级数据库命令要么都执行,要么都不执行.因牝事务是一个不