您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > 第6章 PL-SQL编程基础(2)
1第六章PL/SQL编程基础PL/SQL的简介PL/SQL程序结构PL/SQL的控制结构出错处理2第三节:PL/SQL的控制结构PL/SQL的控制结构包括条件语句和循环语句两种类型●条件控制结构:是根据另一条语句或表达式的结果执行一个操作或一条语句。●循环控制结构:重复地执行一条或多条语句,或者循环一定的次数,或者直到满足某一条件时退出。3二、循环循环被分为四种类型:●简单循环(LOOP...ENDLOOP)●WHILE循环(WHILE...LOOP...ENDLOOP)●数字式FOR循环(FOR...LOOP...ENDLOOP)在循环体内必须有退出循环的语句,否则就是死循环。退出循环的语法有两种:●EXITWHENCONDITION;●IFCONDITIONTHENEXIT;ENDIF;41、简单循环简单循环的语法如下:LOOP语句序列;...EXIT[WHENcondition];ENDLOOP;5例1:用简单循环loop语句实现输出1-10之间的平方数declareinumber:=1;beginloopdbms_output.put_line(i||'的平方数为'||i*i);i:=i+1;exitwheni10;endloop;end;/Loop开始退出循环体语句Loop结束6例2:declareinumber:=1;beginloopdbms_output.put_line(i||'的平方数为'||i*i);i:=i+1;ifi10thenexit;endif;endloop;end;/72、WHILE循环WHILE循环的语法如下:WHILEconditionLOOP语句序列;ENDLOOP;8例3:用WHILE循环结构求10的阶层。declarennumber:=1;count1number:=1;beginwhilecount1=10loopn:=n*count1;count1:=count1+1;endloop;dbms_output.put_line(n);end;/While语句控制Loop开始While语句控制Loop结束93、数字式FOR循环数字式FOR循环的语法如下:FORloop_counterIN[REVERSE]low_bound..high_boundLOOP语句序列;ENDLOOP;其中:IN:表示索引变量的值从小到大INREVERSE:表示索引变量的值从大到小loop_counter:INTEGER类型的索引变量。low_bound:指定索引变量值范围的最小值high_bound:指定索引变量值范围的最大值10例4:用FOR循环结构求10的阶层。declarennumber:=1;count1number;beginforcount1in2..10loopn:=n*count1;endloop;dbms_output.put_line(n);end;/11例5:Declareinumber;beginforiin1..5loopdbms_output.put_line('i='||i);endloop;dbms_output.put_line('endofforloop');end;/12例6:在FOR循环中考虑索引变量的值从大到小beginforiinREVERSE1..5loopdbms_output.put_line('i='||i);endloop;dbms_output.put_line('endofforloop');end;/13第四节:出错处理出错处理方法是程序对运行时刻出现的错误作出反应并进行处理的方法。在PL/SQL块中,当错误发生时,程序控制无条件地转移到当前PL/SQL块的出错处理部分。一旦控制转移到出错处理部分,就不能再转到相同块的可执行部分。出错处理是PL/SQL块中可选部分。14一、出错处理的语法和原则1、出错处理的语法EXCEPTIONWHEN错误1[OR错误2]THEN语句序列1;WHEN错误3[OR错误4]THEN语句序列2;...WHENOTHERSTHEN语句序列3;END;152、出错处理的原则●将WHENOTHERS从句放置在所有其他出错处理从句的后面。●最多只能有一个WHENOTHERS从句。●在块中必须以关键字EXCEPTION开始一个出错处理。●可以在块中定义多个出错处理(WHEN语句),每一个出错处理包含一组语句。●当一个错误发生时,在离开块之前,PL/SQL只处理一个出错处理。16二、各种错误处理出错情况包括:系统预定义的错误、用户自定义的错误。错误描述处理方向系统预定义的错误在PL/SQL中经常出现的25个系统定义的错误不必定义,允许服务器隐式地触发它们,只需要在出错处理部分处理它们。用户自定义的错误开发者认为是非正常的一个条件必须在说明部分定义,在执行部分显式地触发它们,在出错处理部分处理它们。171、系统预定义的错误这些错误是在系统的STANDARD包中定义的。直接在PL/SQL块的出错处理部分的WHEN从句中进行处理。例8:declarenamestudent.sname%type;beginselectsnameintonamefromstudentwheresno='05880110';dbms_output.put_line(name);exceptionwhenno_data_foundthendbms_output.put_line('没有找到所需要的数据!');end;/系统错误异常处理18例9:declarenamestudent.sname%type;beginSelectsnameintonamefromstudentwheresno='05880101';dbms_output.put_line(name);exceptionwhenno_data_foundthendbms_output.put_line('没有找到所需要的数据!');end;/19例10:declareanumber:=8;bnumber:=0;cnumber(3);beginc:=a/b;dbms_output.put_line(c);exceptionwhenzero_dividethendbms_output.put_line('错误,除数不能为0!');end;/20预定义的ORACLE异常情况ORACLE错误对应的异常情况说明ORA-0001DUP_VAL_ON_INDEX唯一值约束被破坏ORA-0051TIMEOUT_ON_RESOURCE在等待资源时发生超时现象ORA-0061TRANSACTION_BACKED_OUT由于发生死锁事物处理被撤消了ORA-1001INVALID_CURSOR非法的游标操作ORA-1012NOT_LOGGED_ON没有连接到ORACLEORA-1017LOGIN_DENIED无效的用户名/口令ORA-1403NO_DATA_FOUND没有找到数据ORA-1422TOO_MANY_ROWSSELECT...INTO语句匹配多个行ORA-1476ZERO_DIVIDE被零除ORA-1722INVALID_NUMBER转换为一个数字失败。21ORA-6500STORAGE_ERROR如果PL/SQL运行时内存不够就引发内部的PL/SQL错误ORA-6501PROGRAM_ERROR内部PL/SQL错误ORA-6502VALUE_ERROR截尾、算术或转换错误ORA-6504ROWTYPE_MISMATCH宿主游标变量和PL/SQL游标变量有不兼容的行类型ORA-6511CURSOR_ALREADY_OPEN试图打开已存在的游标ORA-6530ACCESS_INTO_NULL试图为NULL对象的属性赋值ORA-6531COLLECTION_IS_NULL试图将EXISTS以外的集合方法应用于一个NULLPL/SQL表或VARRAY上ORA-6532SUBSCRIPT_OUTSIDE_LIMIT对嵌套表或VARRAY索引的引用超出说明范围以外ORA-6533SUBSCRIPT_BEYOND_COUNT对嵌套表或VARRAY索引的引用大于集合中元素的个数222、用户自定义的错误用户自定义的错误是程序定义的一个错误,并不一定是一个Oracle错误,它可能是与业务相关的一个错误,比如违反了业务规则。处理用户自定义的错误分三步:(1)定义错误(2)触发错误(3)处理错误23(1)定义错误用户定义的错误是在PL/SQL块的说明(declare)部分进行定义的。和变量相类似,错误也有一个作用范围。定义错误的语法:错误名exception;例:DECLAREMY_EXCEPTIONexception;24(2)触发错误当一个相关的条件满足时,在语句执行部分通过显式使用RAISE语句来触发用户定义的错误。而预定义的错误是当相关的Oracle错误发生时被PL/SQL执行引擎隐式触发的。触发错误的语法:RAISE错误名;例:触发用户自定义的错误BEGINIFV_COMMISNULLTHENRAISEMY_EXCEPTION;ENDIF;…25(3)处理错误在程序的出错处理部分对自定义的错误进行处理。处理方法与系统预定义的错误一样。处理错误的语法:WHEN错误名THEN…例:处理用户自定义的错误EXCEPTIONWHENMY_EXCEPTIONTHENDbms_output.put_line(‘奖金为空’);26例11:declarev_namestudent.sname%type;eexception;beginselectsnameintov_namefromstudentwheresno='05880102';ifv_name'王五'thenraisee;endif;dbms_output.put_line(v_name);exceptionwhenethendbms_output.put_line('错误,不是要找的王五同学!');end;/27例12:输出李四选修c2这门课程的成绩。declarev_gradesc.grade%type;eexception;beginselectgradeintov_gradefromsc,studentwherestudent.sno=sc.snoandsname='李四'andcno='c2';ifv_grade0thenraisee;endif;dbms_output.put_line('李四同学选修c2课程的成绩是'||v_grade);exceptionwhenethendbms_output.put_line('成绩是'||v_grade||',错误,成绩不能为负值!');end;/
本文标题:第6章 PL-SQL编程基础(2)
链接地址:https://www.777doc.com/doc-3259969 .html