第三章 PLSQL编程上机操作Word格式文档下载.docx
《第三章 PLSQL编程上机操作Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《第三章 PLSQL编程上机操作Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。
![第三章 PLSQL编程上机操作Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2022-12/7/29d77be0-b374-41da-a491-d13078814fb7/29d77be0-b374-41da-a491-d13078814fb71.gif)
1500thenshuilu:
=3;
susuankouchulu:
4500andgongzi>
=1500thenshuilu:
=10;
=105;
9000andgongzi>
=4500thenshuilu:
=20;
=555;
35000andgongzi>
=9000thenshuilu:
=25;
=1005;
55000andgongzi>
=35000thenshuilu:
=30;
=2755;
80000andgongzi>
=55000thenshuilu:
=35;
=5505;
elseshuilu:
=45;
=13505;
endcase;
=gongzi*shuilu/100-susuankouchulu;
endif;
dbms_output.put_line('
king应缴纳的所得税是'
||v_tax);
end;
2.更新某雇员的薪水
nianxianjiangjinNUMBER(10,2);
ruzhishijianemp.hiredate%TYPE;
selecthiredateintoruzhishijian
SCOTT'
if(sysdate-ruzhishijian>
=356*6)then
nianxianjiangjin:
=2000;
else
=1500;
updateemp
setsal=nianxianjiangjin
修改后
3.显示某雇员相应的工资级别并显示所在部门名称、薪水和所在级别
jibieNUMBER
(1);
bumenNamedept.dname%TYPE;
xinshuiemp.sal%TYPE;
selectdname,salintobumenName,xinshui
fromempeinnerjoindeptd
one.deptno=d.deptno
whenxinshui<
=3200andxinshui>
=700thenjibie:
=1;
=4400andxinshui>
=3201thenjibie:
=2;
=5000andxinshui>
=4401thenjibie:
=7000andxinshui>
=5001thenjibie:
=4;
=9999andxinshui>
=7001thenjibie:
=5;
SCOTT所在部门是'
||bumenName||'
薪水'
||xinshui||'
级别'
||jibie);
4.为某雇员增加工资,每次增加100元,直到10000元停止
gongziemp.sal%TYPE;
loop
=gongzi+100;
exitwhengongzi=10000;
endloop;
setsal=gongzi
end;
PL/Sql语句执行后,修改后的数据
上机练习2
DECLARE
v_enamevarchar2(4);
BEGIN
SELECTenameINTOv_ename
FROMemp
WHEREempno=1234;
雇员名:
'
||v_ename);
EXCEPTION
WHENNO_DATA_FOUNDTHEN
雇员号不存在'
);
WHENvalue_errorTHEN
姓名长度超过4位'
WHENOTHERSTHEN
错误号:
||SQLCODE||'
错误描述:
||SQLERRM);
END;
WHEREempno=7654;
WHENNO_DATA_FOUNDTHEN
上机练习3
v_salemp.sal%TYPE;
v_deptnoemp.deptno%TYPE;
e_comm_is_nullEXCEPTION;
--定义异常类型变量
SELECTsal,deptnoINTOv_sal,v_deptno
WHEREempno=7788;
IFv_deptno=10THEN
IFv_sal<
10000THEN
UPDATEemp
SETsal=10000
ELSE
RAISEe_comm_is_null;
ENDIF;
雇员不存在!
错误为:
||SQLCODE||SQLERRM);
WHENe_comm_is_nullTHEN
工资不低于10000元'
WHENothersTHEN
出现其他异常'
解释1:
以empno为7788为例,因为部门是“20”,则不显示
解释2:
修改代码:
WHEREempno=7782;
WHEREempno=7782;
ENDIF
以empno为7782为例,因为部门是“10”,sal〈10000,做更新处理,不抛异常。
解释3:
再次执行以上的代码,因为部门是“10”,sal=10000,抛出异常,显示消息“工资不低于10000元”
解释4:
WHEREempno=3782;
WHEREempno=3782;
再次执行以上的代码,因为empno为3782的雇员不存在,抛出异常
上机练习4
1.使用游标计算所有雇员应缴纳的所得税
v_sumNUMBER(10,2):
CURSORemp_cursorIS
SELECTsal
FROMemp;
OPENemp_cursor;
fetchemp_cursorintogongzi;
EXITWHENemp_cursor%NOTFOUND;
v_sum:
=gongzi+v_tax;
closeemp_cursor;
dbms_output.put_line(v_sum);
2.使用游标更新所有雇员的薪水
SELECThiredate
FROMemp
FORUPDATE;
forcur1inemp_cursorloop
wherecurrentofemp_cursor;
执行代码后,数据变化如下:
因为入职年限都大于6年,所以都修改成了1500
3.使用游标查询并显示部门为“销售部”所有雇员相应的工资级别并显示所在部门名称、薪水和所在级别
SELECTename,sal,dname
FROMempeINNERjoindeptd
ONe.deptno=d.deptno
WHEREdname='
SALES'
forcur1inemp_cursorLoop
whencur1.sal<
=3200andcur1.sal>
=4400andcur1.sal>
=5000andcur1.sal>
=7000andcur1.sal>
=9999andcur1.sal>
雇员姓名:
||cur1.ename||'
||cur1.sal||'
上机练习5
CREATEORREPLACEPROCEDUREfire_employee(
enoinemp.empno%type,--输入参数,雇员编号
on_FlagOUTnumber,--执行状态
os_MsgOUTVARCHAR2--提示信息
)
is
delete
fromemp
whereempno=eno;
on_Flag:
os_Msg:
='
成功'
EXCEPTION
=-1;
该雇员不存在。
=SQLCODE;
=SQLERRM;
v_noemp.empno%TYPE;
on_Flagnumber
(1);
--执行状态
os_MsgVARCHAR2(200);
--提示信息
v_no:
=7788;
fire_employee(v_no,on_flag,os_Msg);
dbms_output.put_line(on_flag);
dbms_output.put_line(os_Msg);
存储过程建立完毕
v_noemployee.empno%TYPE;
--调用get_sals存储过程,显示员工薪水
CREATEORREPLACEPROCEDUREget_sals(
cur_salaryOUTSYS_REFCURSOR,
)
AS
OPENcur_salaryFOR
SELECTempno,salFROMemployee;
其他错误,与管理员联系。
v_empnoemployee.empno%type;
v_salemployee.sal%type;
emp_salarySYS_REFCURSOR;
get_sals(emp_salary,on_Flag,os_Msg);
IFon_flag=1THEN
LOOP
FETCHemp_salaryINTOv_empno,v_sal;
EXITWHENemp_salary%notfound;
DBMS_OUTPUT.PUT_LINE(v_empno||'
的薪水是'
||v_sal);
ENDLOOP;
IFemp_salary%ISOPENTHEN
CLOSEemp_salary;