Oracle实验四下PLSQL的游标和异常文档格式.docx

上传人:b****4 文档编号:7662729 上传时间:2023-05-08 格式:DOCX 页数:13 大小:61.92KB
下载 相关 举报
Oracle实验四下PLSQL的游标和异常文档格式.docx_第1页
第1页 / 共13页
Oracle实验四下PLSQL的游标和异常文档格式.docx_第2页
第2页 / 共13页
Oracle实验四下PLSQL的游标和异常文档格式.docx_第3页
第3页 / 共13页
Oracle实验四下PLSQL的游标和异常文档格式.docx_第4页
第4页 / 共13页
Oracle实验四下PLSQL的游标和异常文档格式.docx_第5页
第5页 / 共13页
Oracle实验四下PLSQL的游标和异常文档格式.docx_第6页
第6页 / 共13页
Oracle实验四下PLSQL的游标和异常文档格式.docx_第7页
第7页 / 共13页
Oracle实验四下PLSQL的游标和异常文档格式.docx_第8页
第8页 / 共13页
Oracle实验四下PLSQL的游标和异常文档格式.docx_第9页
第9页 / 共13页
Oracle实验四下PLSQL的游标和异常文档格式.docx_第10页
第10页 / 共13页
Oracle实验四下PLSQL的游标和异常文档格式.docx_第11页
第11页 / 共13页
Oracle实验四下PLSQL的游标和异常文档格式.docx_第12页
第12页 / 共13页
Oracle实验四下PLSQL的游标和异常文档格式.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Oracle实验四下PLSQL的游标和异常文档格式.docx

《Oracle实验四下PLSQL的游标和异常文档格式.docx》由会员分享,可在线阅读,更多相关《Oracle实验四下PLSQL的游标和异常文档格式.docx(13页珍藏版)》请在冰点文库上搜索。

Oracle实验四下PLSQL的游标和异常文档格式.docx

PL/SQL过程已成功完成。

SQL语句

setserveroutputon

declare

v_empnoemp.empno%type;

v_enameemp.ename%type;

v_salemp.sal%type;

v_deptnoemp.deptno%type:

deptno_id;

v_gradevarchar2(20);

cursoremp_cursor(emp_deptnoemp.deptno%type)is

selectempno,ename,salfromempwheredeptno=emp_deptno;

begin

openemp_cursor(v_deptno);

loop

fetchemp_cursorintov_empno,v_ename,v_sal;

exitwhenemp_cursor%notfound;

begin

ifv_sal<

1000then

v_grade:

='

低'

;

endif;

ifv_sal>

=1000andv_sal<

=3000

thenv_grade:

中'

3000

高'

ifv_salisnull

'

dbms_output.put_line(v_empno||'

'

||v_ename||'

||v_sal||'

||v_grade);

end;

endloop;

closeemp_cursor;

end;

/

实验结果截图

2、创建一个PL/SQL块,要求根据用户输入的员工编号(EMPNO),查询出EMP表中该编号员工所在的部门编号(deptno)及其直接管理者的姓名(ename),要有异常处理(该员工编号不存在时或者该员工是总裁无直接主管时)。

查询效果形如下:

输入员工编号的值:

7788

原值6:

v_empno:

员工编号;

新值6:

=7788;

员工编号部门编号上司姓名

----------------------------------

778820JONES

或者:

8001

=8001;

该员工不存在!

7839

原值7:

新值7:

=7839;

该员工是总裁,无直接主管!

v_deptnoemp.deptno%type;

v_empnoemp.empno%type:

v_mgremp.mgr%type;

e_nullexception;

--声明异常

e_mgrexception;

cursoremp_cursor(emp_empnoemp.empno%type)is

selectdeptno,mgrfromempwhereempno=emp_empno;

openemp_cursor(v_empno);

fetchemp_cursorintov_deptno,v_mgr;

ifemp_cursor%notfoundthen

raisee_null;

--显式抛出异常

endif;

ifv_mgrisnullthen

raisee_mgr;

selectemp2.enameintov_ename

fromempemp1,empemp2whereemp1.mgr=emp2.empnoandemp1.empno=v_empno;

dbms_output.put_line('

员工编号部门编号上司姓名'

);

----------------------------------'

dbms_output.put_line(v_empno||'

'

||v_deptno||'

||v_ename);

Exception

whene_nullthen--处理异常

此员工不存在!

commit;

whene_mgrthen--处理异常

3、*创建一个PL/SQL块,根据输入的部门编号,逐条输出EMP表中该部门每位员工的序号、编号(empno)、姓名(ename)和工资(sal)信息,要求用游标实现(参见教材P244例10.43)。

信息显示格式要求如下:

序号编号姓名工资

17782CLARK2450

27839KING5000

37934MILLER1300

部门编号;

v_countnumber:

=1;

dbms_output.put_line('

序号编号姓名工资'

fetchemp_cursorintov_empno,v_ename,v_sal;

exitwhenemp_cursor%notfound;

dbms_output.put_line(v_count||'

||v_empno||'

||v_sal);

v_count:

=v_count+1;

4、创建一个PL/SQL块,每输出DEPT表的一条记录(DEPTNO,DNAME,LOC)后,随后输出该部门的员工记录(EMPNO,ENAME,HIREDATE,SAL),输出格式形如下:

部门编号:

10部门名称:

ACCOUNTING部门位置:

NEWYORK

------------------------------------------------------------

7782CLARK06-09-81$2450

7839KING11-17-81$5000

7934MILLER01-23-82$1300

20部门名称:

RESEARCH部门位置:

DALLAS

7369SMITH12-17-80$800

7566JONES04-02-81$2975

7788SCOTT04-19-87$3000

7876ADAMS05-23-87$1100

7902FORD12-03-81$3000

30部门名称:

SALES部门位置:

CHICAGO

7499ALLEN02-20-81$1600

7521WARD02-22-81$1250

7654MARTIN09-28-81$1250

7698BLAKE05-01-81$2850

7844TURNER09-08-81$1500

7900JAMES12-03-81$950

40部门名称:

OPERATIONS部门位置:

BOSTON

v_deptnodept.deptno%type;

v_dnamedept.dname%type;

v_locdept.loc%type;

v_hiredateemp.hiredate%type;

v_marknumber;

v_tmp_deptnodept.deptno%type;

cursoremp_dept_cursoris

selectdeptno,empno,ename,hiredate,salfromemporderbydeptno;

v_mark:

v_tmp_deptno:

=0;

openemp_dept_cursor;

fetchemp_dept_cursorintov_deptno,v_empno,v_ename,v_hiredate,v_sal;

exitwhenemp_dept_cursor%notfound;

ifv_tmp_deptno=v_deptnothen

v_mark:

else

ifv_mark=1then

||v_hiredate||'

$'

begin

selectdname,locintov_dname,v_locfromdeptwheredeptno=v_deptno;

v_tmp_deptno:

=v_deptno;

dbms_output.put_line('

部门名称:

||v_dname||'

部门位置:

||v_loc);

------------------------------------------------------------'

end;

closeemp_dept_cursor;

5、*利用REF游标(游标变量)在student表中完成以下组合查询任务:

根据姓名、所在系任意组合查询学员信息。

输出格式形如下:

输入name的值:

王名

l_name:

&

Name'

王名'

输入dept的值:

MA

原值10:

l_sdept:

dept'

新值10:

MA'

SELECT*FROMstudentWHERE1=1ANDsname='

ANDsdept='

95003,王名,女,18,MA

v_snamestudent.sname%type:

name'

v_sdeptstudent.sdept%type:

typecur_typeisrefcursor;

curcur_type;

recstudent%rowtype;

select*fromstudentwheresname='

||v_sname||'

andsdept='

||v_sdept||'

opencurfor'

select*fromstudentwheresname='

andsdept='

||v_sdept||'

fetchcurintorec.sno,rec.sname,rec.ssex,rec.sage,rec.sdept;

exitwhencur%notfound;

dbms_output.put_line(rec.sno||'

||rec.sname||'

||rec.ssex||'

||rec.sage||'

||rec.sdept);

附加题:

*

1、利用SELECT…FORUPDATE游标和UPDATE语句中的WHERECURRENTOF子句完成以下任务:

把所有年龄小于18岁的学员成绩增加10分。

DECLARE

CURSORscore_cursorIS

selects.sno,sage,grade

fromstudents,stuscoreg

wheres.sno=g.snoandsage<

18

FORUPDATEOFgradeNOWAIT;

BEGIN

FORscore_recordINscore_cursorLOOP

UPDATEstuscore

SETgrade=score_record.grade+10

WHERECURRENTOFscore_cursor;

ENDLOOP;

COMMIT;

END;

2、有这么一张表t_t,他只有一个number(8)的字段a,由于在创建表时忘记设置主键约束,导致表中有很多重复的记录。

请你编写一个程序,将表中重复的记录保留一个,删除其余的。

createtablet_t(anumber(8));

insertintot_tvalues

(1);

insertintot_tvalues(3);

insertintot_tvalues(6);

insertintot_tvalues(5);

--可以通过查看表t_t的值来验证程序的执行情况。

Select*fromt_t;

v_anumber;

cursort_t_cursoris

selectafromt_t;

opent_t_cursor;

fetcht_t_cursorintov_a;

exitwhent_t_cursor%notfound;

deletefromt_twherea=v_a;

insertintot_t(a)values(v_a);

执行失败

出现的问题:

解决方案(列出遇到的主要问题和解决办法,列出没有解决的问题):

问题一:

附加题2无法成功运行

原因:

表或视图不存在

解决方案:

建立表或视图

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 党团工作 > 其它

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2