1、单击此处编辑母版标题样式,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,Oracle SQL&PL/SQL,第,18,章,控制结构,了解控制结构的用途和类型,识别并构造不同的循环语句,使用嵌套循环和标签控制块的流程,本章要点,控制执行部分的流程,使用,IF,语句和循环控制结构改变块的逻辑流程,IF,语句:,IF-THEN-END IF,IF-THEN-ELSE-END IF,IF-THEN-ELSIF-END IF,IF,语句,语法,简单的,IF,语句:,将员工名为,Osborne,的,manager ID,设为22,IF v_,ename,=OSBORNE THEN,v_mg
2、r:=22;,END IF;,IF,condition,THEN,statements,;,ELSIF,condition,THEN,statements,;,ELSE,statements,;,END IF;,简单的,IF,语句,举例:,为,last name,是,Miller,的员工设定新信息:工作是,Salesman,;所在部门是35;佣金是当前工资的20%。,.,IF v_,ename,=MILLER THEN,v_job :=SALESMAN;,v_,deptno,:=35;,v_new_,comm,:=,sal,*0.20;,END IF;,.,IF-THEN-ELSE,语句执行流
3、程,IF,条件,TRUE,THEN,动作,(,包含更深层次的,IF,语句,),FALSE,ELSE,动作,(,包含更深层次的,IF,语句,),IF-THEN-ELSE,语句,举例:,如果预定日期与装运日期相差5天,则将,v_ship_flag,设为,Acceptable.,.,IF v_,shipdate,-v_,orderdate,100 THEN,v_start:=2*v_start;,ELSIF v_start=50 THEN,v_start:=.5*v_start;,ELSE,v_start:=.1*v_start;,END IF;,.,创建逻辑条件,使用,IS NULL,操作符处理,
4、null,变量。,任何包含空值的算术表达式结果均为空值。,可把空变量当作空字符串来连接表达式。,逻辑表,使用比较运算符创建一个简单的布尔条件。,NOT,TRUE,FALSE,NULL,OR,TRUE,FALSE,NULL,TRUE,FALSE,NULL,FALSE,TRUE,NULL,AND,TRUE,FALSE,NULL,TRUE,FALSE,NULL,TRUE,NULL,NULL,NULL,FALSE,FALSE,FALSE,FALSE,FALSE,TRUE,TRUE,TRUE,TRUE,TRUE,FALSE,NULL,NULL,NULL,布尔条件,V_FLAG,的各种可能值:,V_REO
5、RDER_FLAG,V_AVAILABLE_FLAG,V_FLAG,TRUETRUE,TRUEFALSE,NULLTRUE,NULLFALSE,v_flag:=v_reorder_flag AND v_available_flag;,TRUE,FALSE,NULL,FALSE,CASE,语句,CASE,语句可以根据条件从多个执行分支中选择相应的执行动作,并能返回一个值。,语法:,CASE selector,WHEN expression1 THEN result1,WHEN expression2 THEN result2.,WHEN,expressionN,THEN,resultN,ELSE
6、,resultN,+1;,END;,CASE,语句,SET SERVEROUTPUT ON,DEFINE p_grade=a,DECLARE,v_grade CHAR(1):=UPPER(,v_appraisal VARCHAR2(20);,BEGIN,v_appraisal:=,CASE v_grade,WHEN A THEN Excellent,WHEN B THEN Very Good,WHEN C THEN Good,ELSE No such grade,END;,DBMS_OUTPUT.PUT_LINE(Grade:|v_grade|,Appraisal|v_appraisal);,
7、END;/,搜索,CASE,语句,SET SERVEROUTPUT ON,DEFINE p_grade=a,DECLARE,v_grade CHAR(1):=UPPER(,v_appraisal VARCHAR2(20);,BEGIN,v_appraisal:=,CASE,WHEN v_grade=A THEN Excellent,WHEN v_grade=B THEN Very Good,WHEN v_grade=C THEN Good,ELSE No such grade,END;,DBMS_OUTPUT.PUT_LINE(Grade:|v_grade|,Appraisal|v_appra
8、isal);,END;/,循环控制:,LOOP,语句,LOOP,语句多次执行语句序列。,LOOP,语句有三种形式:,Basic loop,无条件的循环,FOR loop,有计数的循环,WHILE loop,有条件的循环,Basic Loop,语法,LOOP,statement1,;,.,EXIT WHEN,condition,;,END LOOP;,where:,condition,is a Boolean variable or,expression(TRUE,FALSE,or NULL);,-,delimiter,-statements,-EXIT statement,-delimiter
9、,Basic Loop,DECLARE,v_,ordid,item.,ordid,%TYPE:=601;,v_counterNUMBER(2):=1;,BEGIN,LOOP,INSERT INTO item(,ordid,itemid,),VALUES(v_,ordid,v_counter);,v_counter:=v_counter+1;,EXIT WHEN v_counter 10;,END LOOP;,END;,举例:,FOR Loop,语法,使用,FOR loop,缩小循环的范围。,FOR,中的,counter,不须声明;,PL/SQL,隐式声明,counter。,如果循环的下界大于上
10、界,循环就不会执行,FOR,counter,in REVERSE,lower_bound.upper_bound,LOOP,statement1,;,statement2,;,.,END LOOP;,FOR Loop,规则:,仅在循环体中引用 计数器,,,在循环体外计数器没被定义。,在表达式中可引用计数器的当前值。,在循环体中不能为计数器赋值。,FOR Loop,举例:,给次序号601插入10行新的,items,DECLARE,v_,ordid,item.,ordid,%TYPE:=601;,BEGIN,FOR i IN 1.10 LOOP,INSERT INTO item(,ordid,it
11、emid,),VALUES(v_,ordid,i);,END LOOP;,END;,WHILE Loop,语法,在,WHILE loop,中,如果条件成立(,TRUE),则重复执行语句序列。,WHILE,condition,LOOP,statement1,;,statement2,;,.,END LOOP;,Condition is,evaluated at the,beginning of,each iteration.,WHILE Loop,举例:,ACCEPT p_new_order PROMPT Enter the order number:,ACCEPT p_items-,PROMP
12、T Enter the number of items in this order:,DECLARE,v_countNUMBER(2):=1;,BEGIN,WHILE v_count,LOOP,v_counter:=v_counter+1;,EXIT WHEN v_counter10;,LOOP,.,EXIT Outer_loop WHEN total_done=YES;,-Leave both loops,EXIT WHEN,inner_,done=YES;,-Leave inner loop only,.,END LOOP,Inner_loop,;,.,END LOOP,Outer_loop,;,END;,使用控制结构改变语句的逻辑流程。,条件控制,(IF,语句),循环控制,:,Basic loop,FOR loop,WHILE loop,EXIT,语句,小结,