OraclePLSQL经典练习题1.docx

上传人:b****8 文档编号:9422620 上传时间:2023-02-04 格式:DOCX 页数:13 大小:73.78KB
下载 相关 举报
OraclePLSQL经典练习题1.docx_第1页
第1页 / 共13页
OraclePLSQL经典练习题1.docx_第2页
第2页 / 共13页
OraclePLSQL经典练习题1.docx_第3页
第3页 / 共13页
OraclePLSQL经典练习题1.docx_第4页
第4页 / 共13页
OraclePLSQL经典练习题1.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

OraclePLSQL经典练习题1.docx

《OraclePLSQL经典练习题1.docx》由会员分享,可在线阅读,更多相关《OraclePLSQL经典练习题1.docx(13页珍藏版)》请在冰豆网上搜索。

OraclePLSQL经典练习题1.docx

OraclePLSQL经典练习题1

Oracle---PL-SQL经典练习题1

Oracle作业题

一.创建一个简单的PL/SQL程序块

使用不同的程序块组件工作

使用编程结构编写PL/SQL程序块

处理PL/SQL程序块中的错误

1.编写一个程序块,从emp表中显示名为“SMITH”的雇员的薪水和职位。

declare

v_empemp%rowtype;

begin

select*intov_empfromempwhereename='SMITH';

dbms_output.put_line('员工的工作是:

'||v_emp.job||';他的薪水是:

'||v_emp.sal);

end;

2.编写一个程序块,接受用户输入一个部门号,从dept表中显示该部门的名称与所在位置。

方法一:

(传统方法)

declare

v_locdeptcp.dname%type;

v_dnamedeptcp.dname%type;

v_deptnodeptcp.deptno%type;

begin

v_deptno:

=&部门编号;

selectloc,dnameintov_loc,v_dnamefromdeptcpwheredeptno=v_deptno;

dbms_output.put_line('员工所在地是:

'||v_loc||';部门名称是:

'||v_dname);

exception

whenno_data_found

thendbms_output.put_line('您输入的部门编号不存在,请从新输入,谢谢');

end;

 

6.编写一个程序块,将emp表中雇员名全部显示出来。

declare

cursorv_cursorisselect*fromemp;

begin

forv_empinv_cursor

loop

dbms_output.put_line(v_emp.ename);

endloop;

end;

7.编写一个程序块,将emp表中前5人的名字显示出来。

declare

cursorv_cursorisselect*fromemp;

v_countnumber:

=1;

begin

forv_empinv_cursor

loop

dbms_output.put_line(v_emp.ename);

v_count:

=v_count+1;

exitwhenv_count>5;

endloop;

end;

 

8.编写一个程序块,接受一个雇员名,从emp表中显示该雇员的工作岗位与薪水,若输入的雇员名不存在,显示“该雇员不存在”信息。

(*期末考试试题*)

declare

v_empemp%rowtype;

my_exceptionException;

begin

select*intov_empfromempwhereename='&name';

raisemy_exception;

exception

whenno_data_foundthen

dbms_output.put_line('该雇员不存在!

');

whenothersthen

dbms_output.put_line(v_emp.job||'---'||v_emp.sal);

end;

 

9.接受两个数相除并且显示结果,如果第二个数为0,则显示消息“除数不能为0”(课堂未讲)。

declare

v_dividendfloat;

v_divisorfloat;

v_resultfloat;

my_exceptionException;

begin

v_dividend:

=&被除数;

v_divisor:

=&除数;

v_result:

=v_dividend/v_divisor;

raisemy_exception;

exception

whenmy_exceptionthen

dbms_output.put_line(v_result);

whenothersthen

dbms_output.put_line('除数不能为0');

end;

二.声明和使用游标

使用游标属性

使用游标For循环工作

声明带参数的游标

(使用FORUPDATEOF和CURRENTOF子句工作)

 

1.通过使用游标来显示dept表中的部门名称。

declare

cursorv_cursorisselect*fromdept;

begin

forv_deptinv_cursor

loop

dbms_output.put_line(v_dept.dname);

endloop;

end;

 

2.使用For循环,接受一个部门号,从emp表中显示该部门的所有雇员的姓名,工作和薪水。

declare

cursorv_cursorisselect*fromempwheredeptno=&部门号;

begin

forv_empinv_cursor

loopdbms_output.put_line(v_emp.ename||'--'||v_emp.job||'--'

||v_emp.sal);

endloop;

end;

 

3.使用带参数的游标,实现第2题。

declare

cursorv_cursor(p_deptnonumber)isselect*fromempwheredeptno=p_deptno;

v_deptnonumber

(2);

begin

v_deptno:

=&部门号;

forv_empinv_cursor(v_deptno)

loop

dbms_output.put_line(v_emp.ename||'--'||v_emp.job||'--'||v_emp.sal);

endloop;

end;

4.编写一个PL/SQL程序块,从emp表中对名字以“A”或“S”开始的所有雇员按他们基本薪水的10%给他们加薪。

declare

cursorv_cursorisselect*fromemp;

begin

forv_empinv_cursor

loop

ifv_emp.enamelike'A%'then

updateempsetsal=sal+sal*0.1whereempno=v_emp.empno;

elsifv_emp.enamelike'S%'then

updateempsetsal=sal+sal*0.1whereempno=v_emp.empno;

endif;

commit;

endloop;

end;

5.emp表中对所有雇员按他们基本薪水的10%给他们加薪,如果所增加后的薪水大于5000卢布,则取消加薪。

declare

cursorv_cursoris

select*fromemp;

begin

forv_empinv_cursorloop

ifv_emp.sal*1.1<5000then

updateempsetsal=sal*1.1whereempno=v_emp.empno;

endif;

commit;

endloop;

end;

 

三,创建PL/SQL记录和PL/SQL表

创建过程

创建函数

 

3.创建一个过程,能向dept表中添加一个新记录.(in参数)

createorreplaceprocedure

insert_dept(dept_noinnumber,dept_nameinvarchar2,dept_locinvarchar2)

is

begin

insertintodeptvalues(dept_no,dept_name,dept_loc);

end;

调用该存储过程:

begin

insert_dept(50,'技术部','武汉');

end;

 

4.创建一个过程,从emp表中带入雇员的姓名,返回该雇员的薪水值。

(out参数)

然后调用过程。

createorreplaceprocedure

find_emp3(emp_nameinvarchar2,emp_saloutnumber)

is

v_salnumber(5);

begin

selectsalintov_salfromempwhereename=emp_name;

emp_sal:

=v_sal;

exception

whenno_data_foundthen

emp_sal:

=0;

end;

调用:

declare

v_salnumber(5);

begin

find_emp3('ALLEN',v_sal);

dbms_output.put_line(v_sal);

end;

5.编写一个程序块,接受一个雇员号与一个百分数,从emp表中将该雇员的薪水增加输入的百分比(*课堂没讲)。

(利用过程,inout参数)

createorreplaceprocedure

update_sal(emp_noinnumber,parsentinfloat)

is

begin

updateempsetsal=sal+sal*parsentwhereempno=emp_no;

end;

调用:

begin

update_sal(7499,0.5);

end;

 

6.创建一个函数,它以部门号作为参数且返回那个部门的所有的所有雇员的整体薪水。

然后调用此函数。

7.创建一个函数,它以部门号作为参数传递并且使用函数显示那个部门名称与位置。

然后调用此函数。

createorreplacefunction

find_dept(dept_nonumber)

returndept%rowtype

is

v_deptdept%rowtype;

begin

select*intov_deptfromdeptwheredeptno=dept_no;

returnv_dept;

end;

调用函数:

declare

v_deptdept%rowtype;

begin

v_dept:

=find_dept(30);

dbms_output.put_line(v_dept.dname||'---'||v_dept.loc);

end;

 

四,创建程序包

创建程序件

创建触发器

 

1.创建在dept表中插入和删除一个记录的数据包,它且有一个函数(返回插入或删除的部门名称)和两个过程。

然后调用包。

createorreplacepackagepack_1

is

procedurefind_emp(emp_noinnumber,emp_nameoutvarchar2);

procedurefind_emp1(emp_nameinvarchar2,emp_nooutnumber);

functionfind_dname(dept_nonumber)

returnvarchar2;

endpack_1;

createorreplacepackagebodypack_1

is

functionfind_dname(dept_nonumber)

returnvarchar2

is

v_dnamevarchar2(20);

begin

selectdnameintov_dnamefromdeptwheredeptno=dept_no;

retrunv_dname;

end;

endpack_1;

调用包:

declare

v_dnamevarchar2(20);

begin

v_dname:

=pack_1.find_dname(50);

dbms_output.put_line(v_dname);

end;

3.使用单独过程打开游标变量,将dept表中的记录显示出来。

只创建程序包,无需主体。

4.创建一个行级别触发器,将从emp表中删除的记录输入到ret_emp表中。

createorreplacetriggerdelete_emp

afterdeleteonemp

foreachrow

begin

insertintoret_empvalues(:

old.empno,:

old.ename,:

old.job,

:

old.mgr,:

old.hiredate,:

old.sal,:

m,:

old.deptno);

end;

5.创建一个行级别触发器,停止用户删除雇员名为"SMITH"的记录。

createorreplacetriggerdelete_smith

beforedeleteonemp

foreachrow

when(old.ename='SMITH')

begin

raise_application_error(-20001,'不能删除该条信息!

');

end;

 

6.创建一个语句级别触发器,不允许用户在"Sundays"使用emp表。

createorreplacetriggert_control_emp

beforeinsertorupdateordeleteonemp

begin

ifto_char(sysdate,'DY','nls_date_language=AMERICAN')

in('SUN')then

raise_application_error(-20001,'不允许在星期天操作emp表');

endif;

end;

 

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

当前位置:首页 > PPT模板 > 国外设计风格

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1