Oracle PL SQL 编程手册(SQL大全)_第1页
Oracle PL SQL 编程手册(SQL大全)_第2页
Oracle PL SQL 编程手册(SQL大全)_第3页
Oracle PL SQL 编程手册(SQL大全)_第4页
Oracle PL SQL 编程手册(SQL大全)_第5页
已阅读5页,还剩84页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第89页 共89页Oracle PL/SQL 编程手册(SQL大全) 一、SQLPLUS1引言SQL命令以下17个是作作为语句开头头的关键字:alterddroprevokkeauditggrantrollbback*commit*inserrtselecctcommenttlockupdattecreatenoaudditvaliddatedeleterenamme这些命令必须以以“;”结尾带*命令句尾不不必加分号,并并且不存入SSQL缓存区区。SQL中没有的的SQL*PPLUS命令令这些命令不存入入SQL缓存存区definnepausee#delqquit$descrriberemarrk

2、/discoonnecttrunacceptdocummentsaveappendeditsetbreakeexitshowbtitlegetspoollchangehelpsqlpllusclearhhoststarttcolumninputttiminngcomputeelistttitlleconnecttnewpaageundeffinecopy2数据库查询询数据字典TAB用户创创建的所有基基表、视图和和同义词清单单DTAB构成成数据字典的的所有表COL用户创创建的基表的的所有列定义义的清单CATALOGG用户可存取取的所有基表表清单select*fromtab;describbe命令

3、描述基表的的结构信息describbedeptselect*fromemmp;selectempnoo,enamme,jobbfromemmp;select*fromdeptorderbbydeptnnodesc;逻辑运算符=!=或=.05*saalorderbbycomm/saldesc;日期型数据的运运算addtwoodaysto6-Marr-876-Mar-887+2=8-Marr-87addtwoohourssto6-Marr-876-Mar-887+2/24=6-Marr-87and2hrsadd15seconndsto6-Marr-876-Mar-887+15/(224*60*60

4、)=6-Marr-87and15secs列名的别名selectenameeemplooyeefromempwhereddeptnoo=10;(别名:empployeee)selectenamee,sal,comm,comm/salC/SRATIOOfromempwhereccomm.05*saalorderbbycomm/saldesc;SQL命令的编编辑listorrl显示缓冲区区的内容list4显示当前SQQL命令的第第4行,并把把第4行作为为当前行,在在该行号后面面有个*。changeorc用新的内容容替换原来在在一行中第一一次出现内容容SQLc/(.)/(anaalyst)/input

5、oori增加一行或或多行appendora在一行后追追加内容del删除当当前行删除SQL缓缓冲区中的当当前行run显示并并运行SQLL缓冲区中的的命令/运行SQLL缓冲区中的的命令edit把SSQL缓冲区区中的命令写写到操作系统统下的文本文文件,并调用操作系统统提供的编辑辑器执行修改改。3数据操纵数据的插入insertintodeptvalues(10,accouuntingg,neewyork);insertintodept(dnamme,depptno)values(acccountiing,110);从其它表中选择择插入数据insertintoemp(empnno,enaame,deep

6、tno)selectid,naame,deepartmmentfromolld_emppwhereddeparttmentin(100,20,330,40);使用参数insertintodeptvalues(&depttno,&ddname,&loc);执行时,SQLL/PLUSS对每个参数数将有提示用用户输入参数对应日期型型或字符型数数据时,可在在参数上加引引号,输入时时就可不用引引号insertintodeptvalues(&depttno,&dnamee,&lloc);插入空值(NUULL)insertintodeptvalues(50,eeducattion,null);插入日期型数据

7、据日期型数据缺省省格式:DDD-MON-YYinsertintoemp(empno,enamee,hireedate)values(7963,stonne,007-APRR-87);系统时间:SYYSDATEEinsertintoemp(empno,enamee,hireedate)values(7600,kohnn,SYSSDATE);数据更新updateempsetjobb=mannagerwhereeename=marttin;updateempsetjobb=marrketrepwhereeename=saleesman;updateempsetdepptno=440,jobb=mar

8、rketrepwherejjob=ssalesmman;数据删除deleteempwhereeempno=765;更新的提交commit自动提交方式setauttocommmiton如果状态设为开开,则使用iinesrtt,updaate,deelete会会立即提交。更新取消rollbacck两次连续成功的的commiit之间的操操作,称为一一个事务4创建基表、视视图创建基表createtableedept(deptnoonumbeer(2),dnamecchar(114),locchaar(13);数据字典会自动动更新。一个基表最多2254列。表名列名命名规规则:限制第一个字符必须须是字母,

9、后后面可任意(包包括$#_但不能是逗逗号)。名字不得超过330个字符。唯一某一用户的基表表名必须唯一一,不能是OORACLEE的保留字,同同一基表的列列名互不相同同。使用双引号如果表名用双引引号括起来,则则可不满足上上述规则;只有使用双引号号,才能区别别大、小写;命名时使用了双双引号,在以以后的操作也也必须使用双双引号。数据类型:char(n)(不得超过过240字符符)number(n,d)datelong(最最多655336字符)raw(二进进制原始数据据)空值处理有时要求列值不不能为空createtableedept(deptnoonumberr(2)notnull,dnamecchar(

10、114),locchaar(13);在基表中增加一一列alterttabledeptadd(heeadcnttnumbeer(3);修改已有列属性性alterttabledeptmodifydnameechar(20);注:只有当某列列所有值都为为空时,才能能减小其列值值宽度。只有当某列所有有值都为空时时,才能改变变其列值类型型。只有当某列所有有值都为不空空时,才能定定义该列为nnotnull。例:alterttabledeptmodiffy(locchar(12);alterttabledeptmodiffylocchar(12);alterttabledeptmodiffy(dnammec

11、har(13),llocchar(12);创建视图createviewmanaggersasselectenamee,job,salfromemmpwherejjob=mmanageer;为视图列名取别别名createviewmydeppt(personn,titlle,sallary)asseleectenamee,job,salfromemmpwhereddeptnoo=10;withchheckoptioon选项使用withcheckkoptioon,保证当当对视图插入入或更新数据据时,该数据必须满足足视图定义中中selecct命令所指指定的条件。createviewdept220ass

12、electenamee,job,sal,ddeptnoofromemmpwhereddeptnoo=20withchheckoptioon;在做下述操作时时,会发生错错误updatedept220setdepptno=330whereeename=wardd;基表、视图的拷拷贝createtableeemp2asseleect*fromemp;基表、视图的删删除droptaable表名dropviiew视图名5SQL*PPLUS报表表功能SQL*PLUUS的一些基基本格式命令令columndeptnnoheadiingdeparrtmenttcolumnenameeheadiingnameco

13、lumnsalheadiingsalarrycolumnsalformaat$99,9999.000ttitlesampllereporrtforhhitechhcorpbtitlestricctlyconfiidentiialbreakoondeptnnocomputeesumofsalondeptnnorun表头和表尾ttitlesampllereporrtforhhitechhcorpbtitlerighttstricttlyconfiidentiial“”表示换行行,结尾不必必加分号选项有三种:lleftrighttcenteer使用TTITLLE,系统将将自动地在每每页的顶部显显示日

14、期和页页号。TTITLETT和BTITTLE命令有有效,直至重重新设置表头头或表尾,或或退出SQLL*PLUSS。下面命令使标题题语句失效TTITLEOFFBTITLEOFF列名column命命令定义用于于显示列名若名字为一个单单词,不必加加引号columnenameeheadiingemplooyeecolumnenameheadiingemplloyeename(为换行)取消栏定义columnenameeclearr列的格式columnenameeformaatA15columnsalformaat$9,9999.99columncommlikesallike子句,使使得某一列的的格式参照

15、另另一列格式,它它拷贝列名及及其格式控制记录显示分分组顺序breakoondeptnno(不显示重复值值)selectdeptnno,enaamefromemmporderbbydeptnno;(ORDERBY子句用用于控制BRREAK)显示为10clarrkniller20smitthscott30alleenblake每次只有一个BBREAK命命令起作用,但但一次可以在在多个列上使使用BREAAK命令breakoon列名1on列名2记录分组breakoondeptnnoskip2selectdeptnno,enaamefromemmporderbbydeptnno;每个deptnno之间空

16、两两行clearbbreak(取取消BREAAK命令)breakoonpage(每每次从一新页页开始)breakoonreporrt(每次从从一新报表开开始)breakoonpageonreporrt(联合使使用)分组计算breakoondeptnnoskip2computeesumofsalondeptnno计算每个部门的的工资总和skip子句使使部门之间的的信息分隔开开其他计算命令computeeavgofsalondeptnno(平均值值)count非非空值的总数数MAX最大值值MIN最小值值STD标准偏偏差VAR协方差差NUMBER行数使computte命令失效效一旦定义了COOMPU

17、TEE,则一直有有效,直到关闭COMPUUTE(cllearcompuute)SQL/PLUUS环境命令令show选项项(显示当前参数数设置情况)showalll(显示全全部参数)设置参数set选项值或开关setauttocommmitonSET命令包括括setauttocommmitoffonimmmediaate(自动提交,OOFF缺省)setechhooffon(命令文件执行行,是否在终终端上显示命命令本身,OOFF缺省)setfeeedbackkoffon(ON:查询结结束时,给出出结果,记录录数的信息,缺缺省;OFF:无查询询结果,记录录数的信息)setheaadingoffon(O

18、N:列的头头标在报表上上显示,缺省省;OFF:不在报表上上显示)setlinnesizeen一行显示的最大大字符数,缺缺省为80setpaggesizeen每页的行数,缺缺省是14setpauuseoffonteext(ON:当报表表超过一页时时,每显示一一屏就暂停显显示,等待用用户打回车键键,再接着显显示;OFF:页与页页不停顿,缺缺省;texxt:页与页页停顿,并向向用户提示信信息)SETBUFFFERbuffeer设置当头的命令令缓冲区,通通常情况下,SSQL命令缓缓冲区已为当当前缓冲区。由于SQL命令令缓冲区只能能存放一条SSQL命令,所以可用其它缓缓冲区来存放放SQL命令令和SQL*

19、PLUS命命令。经常用到的设置置可放在loogin.ssql文件中中。SETNULLLsetnulllnodataselectenamee,commmfromemmpwhereddeptnoo=30;把部门30中无无佣金雇员的的佣金显示为为“NODATA”。setnulll是SQLL*PLUSS命令,用它它来标识空值值(NULLL),可以设设置为任意字字符串。存盘命令SAVVEsave文件件名input1selecctempnoo,enamme,jobb2fromemp3whereejob=analyystsavereesearcch目录中会增加一一个reseearch.sql文件件。编辑命令

20、EDIITeditEDIT编辑当当前缓冲区中中的内容。编辑一个文件editreesearcch调入命令GETTgetressearchh把磁盘上的文件件内容调入缓缓冲区,并显显示在屏幕上上,文件名尾尾不必加.ssql。START命令令运行指定的文件件startrresearrch输出命令SPOOOLspoolttryfille不仅可以使查询询结果在屏幕幕上显示,还还可以使结果果存入文件停止向文件输出出spoolooff把查询结果在打打印机上输出出,先把它们们存入一个文文件中,然后不必使用SSPOOLOFF,而而用:spoolooutSPOOLOOUT关闭该该文件并在系系统缺省的打打印机上输出出

21、制作报表举例edittrryfileesetechhooffsetauttocommmitonsetpaggesizee25insertintoemp(empnno,enaame,hiiredatte)values(9999,geigger,ssysdatte);insertintoemp(empnno,enaame,deeptno)values(3333,samsson,220);spoolnnew_emmpselect*fromempwhereddeptnoo=20ordepttnoisnull/spoolooffsetauttocommmitoff用start命命令执行这个个文件6函数字

22、符型函数initcapp(enamme);将eename中中每个词的第第一个字母改改为大写。如:jacksmithh-JacckSmithhlength(enamee);计算字字符串的长度度。substr(job,11,4);其它lowerupperleast取取出字符串列列表中按字母母排序排在最最前面的一个个串greatesst取出字符串串列表中按字字母排序排在在最后的一个个串日期函数add_monnth(hiiredatte,5)在雇佣时间间上加5个月月month_bbetweeen(syssdate,hireddate)计算雇佣时时间与系统时时间之间相差差的月数next_daay(hir

23、redatee,FRIIDAY)计算受雇日日期之后的第第一个星期五五的日期例selectenamee,sal,next_day(ssysdatte,FRRIDAY)as_offfromemmpwhereddeptnoo=20;(as_of是是别名)如果不用to_char函函数,日期在在ORACLLE中的缺省省格式是DDD_MONN_YYto_charr(datee,dateepictuure)selectenamee,to_cchar(hhiredaate,DDyMondd,yyyyy)hireddfromemmpwhereddeptnoo=10;to_datee(字符串,格式)inserti

24、ntoemp(eempno,enamee,hireedate)values(7999,asmss,to_date(07033870833000,MMDDDYYHHMMISS);日期型数据的格格式dd12dyfridayfriidayddspthtwelffthmm03monmarrmonthmmarchyy87yyyy19987例Mar12,1987Mondd,yyyyyMAR12,1987MONdd,yyyyyThursdaayMARCHH12DayMONTHHddMar1211:000amMonddhh:miiamThu,theetwelffthDy,thedddspthh算术函数leas

25、t(vv1,v2)selectenamee,empnno,mgrr,leasst(emppno,mggr)lownuumfromemmpwhereeempno00trunc(ssal,0)取sal的近似似值(截断)空值函数nvl(v1,v2)v1为列名,如如果v1不是是空值,nvvl返回其列列值。v1为空值,返返回v2的值值。聚组函数selectsum(ccomm)fromemmp;(返回一个汇总总信息)不能把sum用用在seleect语句里里除非用grroupby字符型、日期型型、数字型的的聚组函数minmaxxcountt可用于任何何数据类型selectmin(eename)fromemm

26、p;selectmin(hhiredaate)fromemmp;selectmin(ssal)fromemmp;有多少人有工作作?selectcountt(job)fromemmp;有多少种不同的的工种?selectcountt(disttinctjob)fromemmp;countddistinnct计算某一字字段中不同的的值的个数其它聚组函数(只只用于数字型型数据)avg计算平平均工资selectavg(ssal)fromemmp;stddev计算工资的的平均差selectstddeev(sall)fromemmp;sum计算总总工资selectsum(ssal)fromemmp;grou

27、pbby子句selectdeptnno,summ(sal),avg(sal)fromemmpgroupbbydeptnno;按多个条件分组组每个部门的雇员员数selectdeptnno,couunt(*)fromemmpgroupbbydeptnno;每个部门的每个个工种的雇员员数selectdeptnno,jobb,counnt(*)fromemmpgroupbbydeptnno,jobb;满足条件的分组组(where是是针对sellect的,hhavingg是针对grroupby的)哪些部门的工资资总和超过了了9000selectdeptnno,summ(sal)fromemmpgroup

28、bbydeptnnohavingsum(ssal)99000;select小小结除去职员,哪些些部门的工资资总和超过了了8000selectdeptnno,summ(sal)fromemmpwherejjob!=clerkkgroupbbydeptnnohavingsum(ssal)88000orderbbysum(ssal);7高级查询等值联接selectempnoo,enamme,jobb,emp.deptnno,dnaamefromemmp,depptwhereeemp.deeptno=dept.deptnno;外联接selectenamee,deptt.depttno,loocfrom

29、emmp,depptwhereeemp.deeptno(+)=deept.deeptno;如果在deptt.depttno中有的的数值,在eemp.deeptno中中没有(如ddeptnoo=40),则作外联接时,结结果中会产生生一个空值自联接:同一基基表的不同行行要做联接,可可使用自联接接指出每个雇员的的经理名字selectworkeer.enaame,maanagerr.enammemanaggerfromemmpworkeer,emppmanaggerwherewworkerr.mgr=managger.emmpno;非等值联接哪些雇员的工资资属于第三级级别selectenamee,sa

30、lfromemmp,sallgradeewhereggrade=3andsallbetweeenlosallandhisall;(基表salggrade:gradeelosallhisall)集合运算行的连接集合运算把2个个或多个查询询结果合并为为一个union-ssetunionnRowsofffirsttqueryyplusofseconndqueryy,lessdupliicaterowsinterseect-seetinterrsectiionRowsboothqueriieshaveincommoonminus-ssetdiffeerenceerowsunniquetothefirs

31、ttqueryy介绍几个视图accounttviewenamessaljobsalesvviewenamessaljobresearcchviewenamessaljobunion运算算返回一个查询结结果中有但又又不重要的行行,它将基表表或视图中的的记录合并在在一起所有部门中有哪哪些雇员工资资超过20000对应列的数据类类型必须相同同selectenamee,salfromacccounttwheressal20000unionselectenamee,salfromreesearcchwheressal20000unionselectenamee,salfromsaaleswheressal

32、20000;interseect运算返回查询结果中中相同的部分分各个部门中有哪哪些相同的工工种selectjobfromacccounttinterseectselectjobfromreesearcchinterseectselectjobfromsaales;minus运算算返回在第一个查查询结果中与与第二个查询询结果不相同同的那部分行行记录。有哪些工种在财财会部中有,而而在销售部中中没有?selectjobfromaccouuntminusselectjobfromsaless;子查询slecteename,deptnnofromemmpwhereddeptnoo=(selecttdep

33、tnnofromemmpwhereeename=smitth);多级子查询selectenamee,job,salfromemmpwherejjob=(selecttjobfromemmpwhereeename=clarrk)orsal(selecttsalfromemmpwhereeename=clarrk);多个基表与子查查询selectenamee,job,salfromemmp,depptwherelloc=nnewyorkandempp.depttno=deept.deeptnoandsall(selecttsalfromemmpwhereeename=scottt);子查询中使用聚

34、聚组函数selectenamee,hireedatefromemmpwherehhiredaate=(selecttmin(hhiredaate)fromemmp);8授权系统权限DBA所有权权限RESOURCCE注册,创建建新的基表CONNECTT,注册,查查询只有DBA才有有权创建新的的用户grantcconneccttoscotttidentiffiedbytigerr;DBA或用户自自己可以改变变用户口令grantcconneccttoscotttidentiffiedbyleopaard;基表权限1有两种方法获得得对基表操作作的权限创建自己的基表表获得基表创建用用户的许可grants

35、selectt,inseertonemptoscottt;这些权限有selectinserrtupdattedelettealterrindexx把所有权限授于于他人grantaallonemptoscottt;同义词select*fromsccott.eemp创建同义词为用户alleen的EMPP基表创建同同义词empployeeecreatesynonnymemplooyeeforalllen.emmp基表权限2你可以使其他用用户有这样的的权力,即其其他用户可以以把你的基表表权限授予他他人grantaallonemptoscotttwithgrrantoptioon;收回权限系统权限只有有

36、被DBA收收回基表权限随时时都可以收回回revokeinserrtonempfromsccott;9索引建立索引createindexxemp_eenameonemp(enamee);删除索引dropinndexemp_eename;关于索引只对较大的基表表建立索引(至至少50条记记录)建立索引之前插插入数据对一个基表可建建立任意多个个索引一般是在作为主主键的列上建建立索引建立索引之后,不不影响SQLL命令的执行行建立索引之后,OORACLEE自动维护和和使用索引保证数据唯一性性提高执行速度的的同时,索引引还可以保证证每个记录中中的每个列值值是不重复的的。createuniquueindexx

37、emp_eempnoonemp(empnoo);练习和答案有没有工资比奖奖金多的雇员员?如果有,按按工资的降序序排列。如果有两个以上上的雇员工资资相同,按他他们的名字排排序。selectenameeemplooyee,ssalsalarry,commmcommiisionfromemmpwheressalcoommorderbbysaldesc,enamee;列出有关雇员姓姓名、奖金占占收百分比的的信息。要求显示时列名名意义明确,按按雇员姓名排排序,不包括括奖金未知的的雇员。selectenameeemplooyee,(comm/(commm+sal)*1000incenntivefromem

38、mpwhereccommisnotnullorderbbyenamee;在chicaggo(部门330)工作的的所有雇员的的工资上涨110%。updateempsetsall=1.1*salwhereddeptnoo=30;updateempsetsall=1.1*salwhereddeptnoo=(sellectdeptnnofromdeeptwherelloc=cchicaggo);为hitechh公司新建一一个部门,编编号为50,其其它信息均不不可知。insertintodept(dnamee,depttno)values(facllitiess,50);创建视图,三个个列名,其中中不包

39、括职员员信息createviewemplooyee(emplooyeename,employyeenumbeer,employyeejob)asseleectenamee,empnno,jobbfromemmpwherejjob!=clerkk;制作工资报表,包包括雇员姓名名、受雇时间间(按星期计计算),工资资和部门编号号,一页显示一个部部门的信息,每每页尾,显示示该页的工资资之和以及受受雇时间之和和,报表结尾处,显显示所有雇员员的工资总和和以及受雇时时间总和,工资按美元计算算,受雇时间间按星期计算算,每页的上上方应有标题题。ttitleservvicebreakoondeptnnoonpag

40、eonreporrtcomputeesumofsalondeptnnocomputeesumofsalonreporrtcomputeesumofserviice_leengthondeptnnocomputeesumofserviice_leengthonreporrtcolumnsalformaat$99,9999.000columnserviice_leengthformaat9999selectdeptnno,enaameemplooyee,(sysdaate-hiiredatte)/7serviice_leength,salfromemmporderbbydeptnno;制作报表,包

41、括括雇员姓名、总总收入和受佣佣日期,且:姓名的第一一个字母必须须大写,雇佣佣日期格式为为MM/DDD/YYYYY,总收入包括没有有奖金的雇员员的总收入,姓姓名按字母顺顺序排列。colhiiredateformaatA12colemmployeeeformaatA10colcoompenssationnformaat$99,9999.000selectinitccap(enname)emplloyee,(sal+nvvl(commm,0)comppensattion,to_charr(hireedate,MM/DDD/YYYYY)hireedatefromemmporderbbyenamee;列

42、出有超过7个个周边国家的的国家名字和和面积。selectnatioon,areeafromnaationwhereccodein(selecttnatioon_coddefromboordergroupbbynatioon_coddehavingcountt(*)77);列出所有面积大大于等于日本本的岛国的国国名和人口。selectnatioon,poppulatiionfromnaation,bordeerwhereccode=nnationn_codee(+)andnattion_ccodeisnullandareea=(selecttareafromnaationwhereuupper(

43、natioon)=JJAPAN);列出所有边界在在其它国家中中的国名,并并且显示其边边界国家名字字。breakoonnatioonselectnatioon1.naation,nation22.natiionborderrin_coountryyfromnaationnatioon1,boorder,natioonnatioon2wherennationn1.codde=borrder.nnationn_codeeandborrder.bborderr_codee=natiion2.ccodeorderbbynatioon1.naation;PL/SQL2PL/SQQL的块结构构和数据类型型块

44、结构的特点嵌套beginbeginexceptiionend;exceptiionend;标识符:不能超过30个个字符第一个字符必须须为字母其余字符可以是是字母,数字字,$,_,或或#不区分大小写形形式如果用双引号括括起来,则字字符顺序可以以任意排列,并并区分大小写写形式无SQL保留字字数据类型数字型:整数,实数,以以及指数字符串:用单引号括起来来若在字符串表示示单引号,则则使用两个单单引号字符串长度为零零(两个单引引号之间没有有字符),则则表示NULLL字符:长度为1的字符符串数据定义语法标识符常数数据类型NNOTNULL:=PLL/SQL表表达式;:=表示给给变量赋值数据类型包括数字型nu

45、mmber(77,2)字符型chaar(1200)日期型datte布尔型booolean(取取值为truue,fallse或nuull,不存存贮在数据库库中)日期型anniverrsarydate:=05-JUL-995;projectt_comppletioondate;布尔型over_buudgetbooleeannotnull:=falsee;availabblebooleean;(初始值为NUULL)%type类型型匹配books_pprinteednumbeer(6);books_ssoldbook_printted%tyype;managerr_nameeemp.eename%ty

46、pe;变量赋值变量名:=PLL/SQL表表达式numvar:=5;boolvarr:=truue;datevarr:=111-JUN-87;字符型、数字型型表达式中的的空值null+=nuull(空值值加数字仍是是空值)null=nuull(空值值与数字进行行比较,结果果仍是空值)null字符串=字符串(nulll即)(空值与字符串串进行连接运运算,结果为为原字符串)变量作用范围标识符在宣言它它的块中有效效标识符如果不在在子块中重新新定义,则在在PL/SQQL块的所有有子块中同样样有效重新定义后的标标识符,作用用范围仅在本本子块中有效效例declareee_messchar(80);begin

47、/*子块1*/declareev1numbber(4);beginselectempnoointov1fromempwherejjob=ppresiddent;exceptiionwhentooo_manny_rowwstheninsertintojob_eerrorssvalues(moreethanonepresiident);end;/*子块2*/declareev1numbber(4);beginselectempnoointov1fromempwherejjob=mmanageer;exceptiionwhentooo_manny_rowwstheninsertintojob_eer

48、rorssvalues(moreethanonemanagger);end;exceptiionwhenotthersthene_mess:=subsstr(sqqlerrmm,1,800);insertintogenerralerrorrsvaluees(e_mmess);end;3SQL和PPL/SQLL插入declareemy_salnumbeer(7,22):=30040.555;my_enammechar(25):=wandda;my_hireedatedate:=08-SEP-888;begininsertintoemp(empno,enmaee,job,hireddate,ssa

49、l,deeptno)values(2741,my_enname,cabdriveer,myy_hireedate,my_saal,20);end;删除declareebad_chiild_tyypechar(20):=naugghty;begindeletefromsantaas_gifft_lisstwhereekid_ratting=bbad_chhild_ttype;end;事务处理commitWORK;rollbacckWORRK;(关键字WORRK可选,但但对命令执行行无任何影响响)savepoiint标记名;(保保存当前点)在事务中标记当当前点rollbacckWORKKtoSAV

50、EEPOINTT标记名;(回回退到当前保保存点)取消saveppoint命命令之后的所所有对数据库库的修改关键字WORKK和SAVEEPOINTT为可选项,对对命令执行无无任何影响函数PL/SQL块块中可以使用用SQL命令令的所有函数数insertintophoneebook(lastnname)valuee(uppeer(my_lastnname);selectavg(ssal)intoavg_ssalfromemp;对于非SQL命命令,可使用用大多数个体体函数不能使用聚组函函数和参数个个数不定的函函数,如x:=sqrtt(y);lastnamme:=uppper(llastnaame);a

51、ge_difff:=moonths_betweeen(biirthdaay1,biirthdaay2)/112;赋值时的数据类类型转换4种赋值形式:变量名:=表达达式insertinto基表名valuees(表达式式1,表达式式2,);update基表名set列名=表达式式;select列名into变量名from.;数据类型间能进进行转换的有有:char转成nnumberrnumber转转成charrchar转成ddatedate转成cchar例char_vaar:=nmm_var;数字型转换成字字符型date_vaar:=225-DECC-88;字符型转换成日日期型insertinto表名(

52、numm_col)valuees(6004badnnumberr);错误,无法成功功地转换数据据类型4条件控制例declareenum_jobbsnumbeer(4);beginselectcountt(*)intonum_jjobsfromaudittionswhereaactoriid=&aactor_idandcalleed_bacck=yees;ifnum_jobs100thenupdateactorrsetactorr_ratiing=wwordclassswhereaactoriid=&aactor_id;elsifnnum_joob=75thenupdateactorrsetac

53、torr_ratiing=ddaytimmesoapsswhereaactoriid=&aactor_id;elseupdateactorrsetactorr_ratiing=wwaiterrwhereaactoriid=&aactor_id;endif;endif;commit;end;5循环语法loopendlooop;exit;(退退出循环)exitwwhen;(退出循环环,当满足WWHEN时)例1declareectrnummber(33):=0;beginloopinsertintotablee1valuees(taastesgreatt);insertintotablee2valu

54、ees(leessfilliing);ctr:=cttr+1;exitwhhenctr=1100;endlooop;end;(注:如果cttr取为NUULL,循环环无法结束)例2FOR语法for变量loopendlooop;declareemy_indeexchar(20):=fetttuciniialfreedo;bowlchhar(200);beginformy_indexxinreverrse21.330loopinsertintotemp(coll)valuees(my_indexx);/*循环次数从从30到211*/endlooop;bowl:=mmy_inddex;end;跟在in

55、reeversee后面的数字字必须是从小小到大的顺序序,必须是整整数,不能是是变量或表达达式6游标显式游标打开游标open例opencoolor_ccur;游标属性%notfouund%found%rowcouunt%isopenn例fetchmmy_currintomy_vaar;whilemmy_curr%founndloop(处理数据)fetchmmy_currintomy_vaar;exitwhhenmy_cuur%rowccount=10;endlooop;%notfouund属性取值情况如下:fetch操作作没有返回记记录,则取值值为trueefetch操作作返回一条记记录,则取值

56、值为falsse对游标无fettch操作时时,取值为nnull%notfoound例ifcoloor_curr%notffoundthen注:如果没有ffetch操操作,则%notffound将将导致出错,因为%notffound的的初始值为NNULL。关闭游标close例closeccolor_cur;游标的FOR循循环语法forinloopendlooop;其中:索引是建立在每每条记录的值值之上的记录名不必声明明每个值对应的是是记录名,列列名初始化游标指打打开游标活动集合中的记记录自动完成成FETCHH操作退出循环,关闭闭游标隐式游标隐式游标是指SSQL命令中中用到的,没没有明确定义义的游

57、标insert,updatte,dellete,sselectt语句中不必必明确定义游游标调用格式为SQQL%存贮有关最新一一条SQL命命令的处理信信息隐式游标的属性性隐式游标有四个个属性SQL%NOTTFOUNDDSQL%FOUUNDSQL%ROWWCOUNTT:隐式游标标包括的记录录数例:deletefrombasebball_tteamwhereebattiing_avvg55thninsertintotempvalues(yourrteamneedsshelp);endif;SQL%ISOOPEN:取取值总为FAALSE。SSQL命令执执行完毕,PPL/SQLL立即关闭隐隐式游标。7标

58、号GOTO语句用法:gotoyoou_aree_heree;其中you_aare_heere是要跳跳转的语句标标号标号必须在同一一组命令,或或是同一块中中使用正确的使用(标号)x:=x+1ifabthenb:=b+c;gotodiinner;endif;错误的使用gotojaail;ifabthenb:=b+c;(标号)x:=x+1;endif;标号:解决意义义模糊标号可用于定义义列值的变量量declareedeptnonumbeer:=200;beginupdateempsetsal=ssal*1.1whereddeptnoo=sampple.deeptno;commit;endsammpl

59、e;如果不用标号和和标号限制符符,这条命令令将修改每条条记录。8异常处理预定义的异常情情况任何ORACLLE错误都将将自动产生一一个异常信息息一些异常情况已已命名,如:no_dataa_founnd当SELECCT语句无返返回记录时产产生too_manny_rowws没有定义游游标,而SEELECT语语句返回多条条记录时产生生wheneveernotfoound无对应的记记录用户定义的异常常情况由用户自己获取取在DECLARRE部分定义义:declareexnumbeer;somethiing_issnt_riightexcepption;用户定义的异常常情况遵循一一般的作用范范围规则条件满足

60、时,获获取异常情况况:raissesometthing_isnt_rightt注意:同样可以以获取预定义义的异常情况况exceptiion_innit语句允许为ORACCLE错误命命名调用格式:pragmaexcepption_init(,);例declareedeadlocck_dettecteddexcepption;pragmaexcepption_init(deadllock_ddetectted,-660);raise语句句单独使用RAIISE命令,可可再一次获取取当前的异常常情况(就象象异常情况被被重复处理了了一样)。在异常处理中,此此语句只能单单独使用。异常处理标识符符一组用于处

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论