oracle结构控制语句.docx
- 文档编号:7091817
- 上传时间:2023-01-17
- 格式:DOCX
- 页数:14
- 大小:19.48KB
oracle结构控制语句.docx
《oracle结构控制语句.docx》由会员分享,可在线阅读,更多相关《oracle结构控制语句.docx(14页珍藏版)》请在冰豆网上搜索。
oracle结构控制语句
结构控制语句
分支结构
分支结构是最基本的程序结构,分支结构由IF语句实现。
使用IF语句,根据条件可以改变程序的逻辑流程。
IF语句有如下的形式:
IF条件1THEN
语句序列1;
[ELSIF条件2THEN
语句序列2;
ELSE
语句序列n;]
ENDIF;
其中:
条件部分是一个逻辑表达式,值只能是真(TRUE)、假(FALSE)或空(NULL)。
语句序列为多条可执行的语句。
根据具体情况,分支结构可以有以下几种形式:
IF-THEN-ENDIF
IF-THEN-ELSE-ENDIF
IF-THEN-ELSIF-ELSE-ENDIF
1.IF-THEN-ENDIF形式
这是最简单的IF结构,练习如下:
范例:
在emp表中,输入雇员编号,如果其工作是业务员(CLERK),工资提高10%(其他员工工资不变)。
(plsql7.sql)
输入并执行以下程序:
SETSERVEROUTPUTON
DECLARE
v_empnoemp.empno%TYPE;
v_jobemp.job%TYPE;
BEGIN
v_empno:
=&empno;
SELECTjobINTOv_job
FROMemp
WHEREempno=v_empno;
IFv_job='CLERK'THEN
UPDATEempSETsal=1.1*sal
WHEREempno=v_empno;
ENDIF;
EXCEPTION
WHENNO_DATA_FOUNDTHEN
DBMS_OUTPUT.PUT_LINE('输入的雇员编号不存在');
COMMIT;
END;
2.IF-THEN-ELSE-ENDIF形式
这种形式的练习如下:
范例:
在emp表中,输入雇员编号,如果其工作是业务员(CLERK),工资提高10%,其他员工工资都增加20。
(plsql8.sql)
输入并执行以下程序:
SETSERVEROUTPUTON
DECLARE
v_empnoemp.empno%TYPE;
v_jobemp.job%TYPE;
BEGIN
v_empno:
=&empno;
SELECTjobINTOv_job
FROMemp
WHEREempno=v_empno;
IFv_job='CLERK'THEN
UPDATEempSETsal=1.1*sal
WHEREempno=v_empno;
ELSE
UPDATEempSETsal=sal+20
WHEREempno=v_empno;
ENDIF;
EXCEPTION
WHENNO_DATA_FOUNDTHEN
DBMS_OUTPUT.PUT_LINE('输入的雇员编号不存在');
COMMIT;
END;
3.IF-THEN-ELSIF-ELSE-ENDIF形式
这种形式的练习如下:
范例:
根据雇员工资分级显示税金。
(plsql9.sql)
输入并运行以下程序:
SETSERVEROUTPUTON
DECLARE
v_salNUMBER(5);
v_taxNUMBER(5,2);
BEGIN
SELECTsalINTOv_sal
FROMemp
WHEREempno=7788;
IFv_sal>=3000THEN
v_tax:
=v_sal*0.08;--税率8%
ELSIFv_sal>=1500THEN
v_tax:
=v_sal*0.06;--税率6%
ELSE
v_tax:
=v_sal*0.04;--税率4%
ENDIF;
DBMS_OUTPUT.PUT_LINE('应缴税金:
'||V_tax);
END;
说明:
该程序根据工资计算7788号雇员应缴税金,不同工资级别的税率不同。
选择结构
CASE语句适用于分情况的多分支处理,可有以下三种用法。
1.基本CASE结构
语句的语法如下:
CASE选择变量名
WHEN表达式1THEN
语句序列1
WHEN表达式2THEN
语句序列2
WHEN表达式nTHEN
语句序列n
ELSE
语句序列n+1
ENDCASE;
在整个结构中,选择变量的值同表达式的值进行顺序匹配,如果相等,则执行相应的语句序列,如果不等,则执行ELSE部分的语句序列。
以下是一个使用CASE选择结构的练习。
范例:
使用CASE结构实现职务转换。
(plsql10.sql)
输入并执行程序:
SETSERVEROUTPUTON
DECLARE
v_jobVARCHAR2(10);
BEGIN
SELECTjobINTOv_job
FROMemp
WHEREempno=7788;
CASEv_job
WHEN'PRESIDENT'THEN
DBMS_OUTPUT.PUT_LINE('雇员职务:
总裁');
WHEN'MANAGER'THEN
DBMS_OUTPUT.PUT_LINE('雇员职务:
经理');
WHEN'SALESMAN'THEN
DBMS_OUTPUT.PUT_LINE('雇员职务:
推销员');
WHEN'ANALYST'THEN
DBMS_OUTPUT.PUT_LINE('雇员职务:
系统分析员');
WHEN'CLERK'THEN
DBMS_OUTPUT.PUT_LINE('雇员职务:
业务员');
ELSE
DBMS_OUTPUT.PUT_LINE('雇员职务:
未知');
ENDCASE;
END;
执行结果:
雇员职务:
系统分析员
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'优'
WHEN'B'THEN'良'
WHEN'C'THEN'中'
WHEN'D'THEN'差'
ELSE'未知'
END;
DBMS_OUTPUT.PUT_LINE('评价等级:
'||v_result);
END;
执行结果为:
评价等级:
良
PL/SQL过程已成功完成。
说明:
该CASE表达式通过判断变量v_grade的值,对变量v_result赋予不同的值。
3.搜索CASE结构
Oracle还提供了一种搜索CASE结构,它没有选择变量,直接判断条件表达式的值,根据条件表达式决定转向。
CASE
WHEN条件表达式1THEN
语句序列1
WHEN条件表达式2THEN
语句序列2
WHEN条件表达式nTHEN
语句序列n
ELSE
语句序列n+1
ENDCASE;
范例:
使用CASE的搜索结构,输出工资等级(plsql12.sql)。
SETSERVEROUTPUTON
DECLARE
v_salNUMBER(5);
BEGIN
SELECTsalINTOv_salFROMemp
WHEREempno=7788;
CASE
WHENv_sal>3000THEN
DBMS_OUTPUT.PUT_LINE('工资等级:
一级');
WHENv_sal>2000THEN
DBMS_OUTPUT.PUT_LINE('工资等级:
二级');
WHENv_sal>1400THEN
DBMS_OUTPUT.PUT_LINE('工资等级:
三级');
WHENv_sal>1200THEN
DBMS_OUTPUT.PUT_LINE('工资等级:
四级');
ELSE
DBMS_OUTPUT.PUT_LINE('工资等级:
五级');
ENDCASE;
END;
执行结果为:
工资等级:
二级
PL/SQL过程已成功完成。
说明:
此结构类似于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)
输入并执行以下程序:
SETSERVEROUTPUTON
DECLARE
v_totalNUMBER(5):
=0;
v_countNUMBER(5):
=1;
BEGIN
LOOP
v_total:
=v_total+v_count**2;
EXITWHENv_count=15;--条件退出
v_count:
=v_count+2;
ENDLOOP;
DBMS_OUTPUT.PUT_LINE(v_total);
END;
输出结果为:
680
PL/SQL过程已成功完成。
说明:
基本循环一定要使用EXIT退出,否则就会成为死循环。
练习:
求1*2*3*4*...*10的值。
2.FORLOOP循环
FOR循环是固定次数循环,格式如下:
FOR控制变量in[REVERSE]下限..上限
LOOP
语句1;
语句2;
ENDLOOP;
循环控制变量是隐含定义的,不需要声明。
下限和上限用于指明循环次数。
正常情况下循环控制变量的取值由下限到上限递增,REVERSE关键字表示循环控制变量的取值由上限到下限递减。
以下是FOR循环结构的练习。
范例:
使用FOR循环,分别计算1~10阶乘,并将结果存入total表(plsql14.sql)
步骤1:
CREATETABLEtotal(nint,resultint);
步骤2:
SETSERVEROUTPUTON
DECLARE
v_iINT:
=1;
v_fINT:
=1;
BEGIN
FORv_iIN1..10LOOP
v_f:
=v_f*v_i;
INSERTINTOtotalVALUES(v_i,v_f);
ENDLOOP;
END;
步骤3:
select*fromtotal;
3.WHILELOOP循环
WHILE循环是有条件循环,其格式如下:
WHILE条件LOOP
语句1;
语句2;
ENDLOOP;
当条件满足时,执行循环体;当条件不满足时,则结束循环。
如果第一次判断条件为假,则不执行循环体。
以下是WHILE循环结构的练习。
范例:
使用WHILE循环向emp表连续插入5个记录。
(plsql15.sql)
步骤1:
执行下面的程序:
SETSERVEROUTPUTON
DECLARE
v_countNUMBER
(2):
=1;
BEGIN
WHILEv_count<6LOOP
INSERTINTOemp(empno,ename)
VALUES(5000+v_count,'临时');
v_count:
=v_count+1;
ENDLOOP;
COMMIT;
END;
输出结果为:
PL/SQL过程已成功完成。
步骤2:
显示插入的记录:
SELECTempno,enameFROMempWHEREename='临时';
输出结果为:
EMPNOENAME
----------------------------
5001临时
5002临时
5003临时
5004临时
5005临时
已选择5行。
步骤3:
删除插入的记录:
DELETEFROMempWHEREename='临时';
COMMIT;
输出结果为:
已删除5行。
提交完成。
说明:
该练习使用WHILE循环向emp表插入5个新记录(雇员编号根据循环变量生成),并通过查询语句显示新插入的记录,然后删除。
4.多重循环
循环可以嵌套,以下是一个二重循环的练习。
范例:
使用二重循环求1!
+2!
+...+10!
的值。
步骤1:
第1种算法:
SETSERVEROUTPUTON
DECLARE
v_totalNUMBER(8):
=0;
v_niNUMBER(8):
=0;
JNUMBER(5);
BEGIN
FORIIN1..10
LOOP
J:
=1;
v_ni:
=1;
WHILEJ<=I
LOOP
v_ni:
=v_ni*J;
J:
=J+1;
ENDLOOP;--内循环求n!
v_total:
=v_total+v_ni;
ENDLOOP;--外循环求总和
DBMS_OUTPUT.PUT_LINE(v_total);
END;
输出结果为:
4037913
PL/SQL过程已成功完成。
步骤2:
第2种算法:
SETSERVEROUTPUTON
DECLARE
v_totalNUMBER(8):
=0;
v_niNUMBER(8):
=1;
BEGIN
FORIIN1..10
LOOP
v_ni:
=v_ni*I;--求n!
v_total:
=v_total+v_ni;
ENDLOOP;--循环求总和
DBMS_OUTPUT.PUT_LINE(v_total);
END;
输出结果为:
409114
PL/SQL过程已成功完成。
说明:
第1种算法的程序内循环使用WHILE循环求阶层,外循环使用FOR循环求总和。
第2种算法是简化的算法,根据是:
n!
=n*(n?
1)!
。
范例:
插入雇员,如果雇员已经存在,则输出提示信息。
SETSERVEROUTPUTON
DECLARE
v_empnoNUMBER(5):
=7788;
v_numVARCHAR2(10);
iNUMBER(3):
=0;
BEGIN
SELECTcount(*)INTOv_numFROMSCOTT.empWHEREempno=v_empno;
IFv_num=1THEN
DBMS_OUTPUT.PUT_LINE('雇员'||v_empno||'已经存在!
');
ELSE
INSERTINTOemp(empno,ename)VALUES(v_empno,'TOM');
COMMIT;
DBMS_OUTPUT.PUT_LINE('成功插入新雇员!
');
ENDIF;
END;
说明:
在本程序中,使用了一个技巧来判断一个雇员是否存在。
如果一个雇员不存在,那么使用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%
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- oracle 结构 控制 语句