oracle结构控制语句Word格式文档下载.docx
《oracle结构控制语句Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《oracle结构控制语句Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。
FROMemp
WHEREempno=v_empno;
IFv_job='
CLERK'
THEN
UPDATEempSETsal=1.1*sal
ENDIF;
EXCEPTION
WHENNO_DATA_FOUNDTHEN
DBMS_OUTPUT.PUT_LINE('
输入的雇员编号不存在'
);
COMMIT;
END;
2.IF-THEN-ELSE-ENDIF形式
这种形式的练习如下:
在emp表中,输入雇员编号,如果其工作是业务员(CLERK),工资提高10%,其他员工工资都增加20。
(plsql8.sql)
ELSE
UPDATEempSETsal=sal+20
3.IF-THEN-ELSIF-ELSE-ENDIF形式
根据雇员工资分级显示税金。
(plsql9.sql)
输入并运行以下程序:
v_salNUMBER(5);
v_taxNUMBER(5,2);
SELECTsalINTOv_sal
WHEREempno=7788;
IFv_sal>
=3000THEN
v_tax:
=v_sal*0.08;
--税率8%
ELSIFv_sal>
=1500THEN
v_tax:
=v_sal*0.06;
--税率6%
ELSE
=v_sal*0.04;
--税率4%
DBMS_OUTPUT.PUT_LINE('
应缴税金:
'
||V_tax);
说明:
该程序根据工资计算7788号雇员应缴税金,不同工资级别的税率不同。
选择结构
CASE语句适用于分情况的多分支处理,可有以下三种用法。
1.基本CASE结构
语句的语法如下:
CASE选择变量名
WHEN表达式1THEN
语句序列1
WHEN表达式2THEN
语句序列2
WHEN表达式nTHEN
语句序列n
语句序列n+1
ENDCASE;
在整个结构中,选择变量的值同表达式的值进行顺序匹配,如果相等,则执行相应的语句序列,如果不等,则执行ELSE部分的语句序列。
以下是一个使用CASE选择结构的练习。
使用CASE结构实现职务转换。
(plsql10.sql)
输入并执行程序:
v_jobVARCHAR2(10);
SELECTjobINTOv_job
FROMemp
WHEREempno=7788;
CASEv_job
WHEN'
PRESIDENT'
雇员职务:
总裁'
MANAGER'
经理'
SALESMAN'
推销员'
ANALYST'
系统分析员'
业务员'
ELSE
未知'
ENDCASE;
执行结果:
雇员职务:
系统分析员
PL/SQL过程已成功完成。
以上实例检索雇员7788的职务,通过CASE结构转换成中文输出。
练习:
将雇员号修改成输入雇员号,重新执行。
2.表达式结构CASE语句
在Oracle中,CASE结构还能以赋值表达式的形式出现,它根据选择变量的值求得不同的结果。
它的基本结构如下:
变量:
=CASE选择变量名
WHEN表达式1THEN值1
WHEN表达式2THEN值2
WHEN表达式nTHEN值n
ELSE值n+1
END;
使用CASE的表达式结构。
(plsql11.sql)
SETSERVEROUTPUTON
DECLARE
v_gradeVARCHAR2(10);
v_resultVARCHAR2(10);
BEGIN
v_grade:
='
B'
;
v_result:
=CASEv_grade
WHEN'
A'
THEN'
优'
良'
C'
中'
D'
差'
ELSE'
DBMS_OUTPUT.PUT_LINE('
评价等级:
||v_result);
执行结果为:
评价等级:
良
该CASE表达式通过判断变量v_grade的值,对变量v_result赋予不同的值。
3.搜索CASE结构
Oracle还提供了一种搜索CASE结构,它没有选择变量,直接判断条件表达式的值,根据条件表达式决定转向。
CASE
WHEN条件表达式1THEN
WHEN条件表达式2THEN
语句序列2
WHEN条件表达式nTHEN
语句序列n
语句序列n+1
使用CASE的搜索结构,输出工资等级(plsql12.sql)。
SELECTsalINTOv_salFROMemp
CASE
WHENv_sal>
3000THEN
工资等级:
一级'
2000THEN
二级'
1400THEN
三级'
1200THEN
四级'
五级'
ENDCASE;
工资等级:
二级
此结构类似于IF-THEN-ELSIF-ELSE-ENDIF结构。
本训练判断7788雇员的工资等级。
循环结构
循环结构是最重要的程序控制结构,用来控制反复执行一段程序。
比如我们要进行累加,则可以通过适当的循环程序实现。
PL/SQL循环结构可划分为以下3种:
*基本LOOP循环。
*FORLOOP循环。
*WHILELOOP循环。
1.基本LOOP循环
基本循环的结构如下:
LOOP--循环起始标识
语句1;
语句2;
EXIT[WHEN条件];
ENDLOOP;
--循环结束标识
该循环的作用是反复执行LOOP与ENDLOOP之间的语句。
EXIT用于在循环过程中退出循环,WHEN用于定义EXIT的退出条件。
如果没有WHEN条件,遇到EXIT语句则无条件退出循环。
求12+32+52+...+152的值。
(plsql13.sql)
v_totalNUMBER(5):
=0;
v_countNUMBER(5):
=1;
LOOP
v_total:
=v_total+v_count**2;
EXITWHENv_count=15;
--条件退出
v_count:
=v_count+2;
ENDLOOP;
DBMS_OUTPUT.PUT_LINE(v_total);
输出结果为:
680
基本循环一定要使用EXIT退出,否则就会成为死循环。
练习:
求1*2*3*4*...*10的值。
2.FORLOOP循环
FOR循环是固定次数循环,格式如下:
FOR控制变量in[REVERSE]下限..上限
LOOP
循环控制变量是隐含定义的,不需要声明。
下限和上限用于指明循环次数。
正常情况下循环控制变量的取值由下限到上限递增,REVERSE关键字表示循环控制变量的取值由上限到下限递减。
以下是FOR循环结构的练习。
使用FOR循环,分别计算1~10阶乘,并将结果存入total表(plsql14.sql)
步骤1:
CREATETABLEtotal(nint,resultint);
步骤2:
v_iINT:
v_fINT:
FORv_iIN1..10LOOP
v_f:
=v_f*v_i;
INSERTINTOtotalVALUES(v_i,v_f);
ENDLOOP;
步骤3:
select*fromtotal;
3.WHILELOOP循环
WHILE循环是有条件循环,其格式如下:
WHILE条件LOOP
语句1;
语句2;
ENDLOOP;
当条件满足时,执行循环体;
当条件不满足时,则结束循环。
如果第一次判断条件为假,则不执行循环体。
以下是WHILE循环结构的练习。
使用WHILE循环向emp表连续插入5个记录。
(plsql15.sql)
步骤1:
执行下面的程序:
v_countNUMBER
(2):
=1;
WHILEv_count<
6LOOP
INSERTINTOemp(empno,ename)
VALUES(5000+v_count,'
临时'
v_count:
=v_count+1;
输出结果为:
PL/SQL过程已成功完成。
显示插入的记录:
SELECTempno,enameFROMempWHEREename='
EMPNOENAME
----------------------------
5001临时
5002临时
5003临时
5004临时
5005临时
已选择5行。
步骤3:
删除插入的记录:
DELETEFROMempWHEREename='
COMMIT;
已删除5行。
提交完成。
该练习使用WHILE循环向emp表插入5个新记录(雇员编号根据循环变量生成),并通过查询语句显示新插入的记录,然后删除。
4.多重循环
循环可以嵌套,以下是一个二重循环的练习。
使用二重循环求1!
+2!
+...+10!
的值。
第1种算法:
v_totalNUMBER(8):
v_niNUMBER(8):
JNUMBER(5);
FORIIN1..10
LOOP
J:
v_ni:
WHILEJ<
=I
=v_ni*J;
=J+1;
--内循环求n!
v_total:
=v_total+v_ni;
--外循环求总和
DBMS_OUTPUT.PUT_LINE(v_total);
4037913
第2种算法:
v_totalNUMBER(8):
v_niNUMBER(8):
FORIIN1..10
=v_ni*I;
--求n!
v_total:
=v_total+v_ni;
--循环求总和
409114
第1种算法的程序内循环使用WHILE循环求阶层,外循环使用FOR循环求总和。
第2种算法是简化的算法,根据是:
n!
=n*(n?
1)!
。
插入雇员,如果雇员已经存在,则输出提示信息。
SETSERVEROUTPUTON
v_empnoNUMBER(5):
=7788;
v_numVARCHAR2(10);
iNUMBER(3):
BEGIN
SELECTcount(*)INTOv_numFROMSCOTT.empWHEREempno=v_empno;
IFv_num=1THEN
雇员'
||v_empno||'
已经存在!
ELSE
INSERTINTOemp(empno,ename)VALUES(v_empno,'
TOM'
COMMIT;
成功插入新雇员!
说明:
在本程序中,使用了一个技巧来判断一个雇员是否存在。
如果一个雇员不存在,那么使用SELECT...INTO来获取雇员信息就会失败,因为SELECT...INTO形式要求查询必须返回一行。
但如果使用COUNT统计查询,返回满足条件的雇员人数,则该查询总是返回一行,所以任何情况都不会失败。
COUNT返回的统计人数为0说明雇员不存在,返回的统计人数为1说明雇员存在,返回的统计人数大于1说明有多个满足条件的雇员存在。
本例在雇员不存在时进行插入操作,如果雇员已经存在则不进行插入。
过关练习:
第一关:
编写一个PL/SQL块,循环向dept表中插入10个部门的数据
第二关:
编写一个PL/SQL块,将emp表中的每个员工分别归到不同的部门中,第一个员工归到10部门,第二个员工归到20部门,第三个员工归到30部门……
第三关:
使用if…elsif…else…endif语句,接受用户输入的员工号,按规则给其增加工资。
10部门增加10%,20部门增加20%,30部门增加30%,40部门增加40%,但不能超过5000
1\使用Map接口的实现类完成员工工资(姓名-?
工资)的摸拟:
1)、添加几条信息
2)、列出所有的员工姓名
3)、列出所有员工姓名及其工资
4)、删除名叫“Tom”的员工信息
5)、输出Jack的工资,并将其工资改为1500元
6)、将所有工资低于1000元的员工的工资上涨20%