Oracle经典练习题很全面Word文档下载推荐.docx

上传人:b****3 文档编号:16924358 上传时间:2022-11-27 格式:DOCX 页数:13 大小:19.15KB
下载 相关 举报
Oracle经典练习题很全面Word文档下载推荐.docx_第1页
第1页 / 共13页
Oracle经典练习题很全面Word文档下载推荐.docx_第2页
第2页 / 共13页
Oracle经典练习题很全面Word文档下载推荐.docx_第3页
第3页 / 共13页
Oracle经典练习题很全面Word文档下载推荐.docx_第4页
第4页 / 共13页
Oracle经典练习题很全面Word文档下载推荐.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

Oracle经典练习题很全面Word文档下载推荐.docx

《Oracle经典练习题很全面Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Oracle经典练习题很全面Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。

Oracle经典练习题很全面Word文档下载推荐.docx

'

||pname||'

所在位置:

||ploc);

exception–异常处理

whenno_data_found

thendbms_output.put_line('

你输入的部门编号有误!

!

);

whenothers

其他异常'

end;

方法二:

(使用%rowtype)

erowdept%rowtype;

begin

select*intoerowfromdeptwheredeptno=&

dbms_output.put_line(erow.dname||'

--'

||erow.loc);

exception

你输入的部门号有误'

whenothers

end;

3.编写一个程序块,利用%type属性,接受一个雇员号,从emp表中显示该雇员的整体薪水(即,薪水加佣金)。

pempnoemp.empno%type;

totalSalemp.sal%type;

pempno:

请输入员工编号;

selectsal+nvl(comm,0)intototalSalfromempwhereempno=pempno;

该员工总共薪水'

||totalSal);

你输入的员工编号有误!

4.编写一个程序块,利用%rowtype属性,接受一个雇员号,从emp表中显示该雇员的整体薪水(即,薪水加佣金)。

erowemp%rowtype;

select*intoerowfromempwhereempno=&

dbms_output.put_line(erow.sal+nvl(m,0));

exception

5.某公司要根据雇员的职位来加薪,公司决定按下列加薪结构处理:

DesignationRaise

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

Clerk500

Salesman1000

Analyst1500

Otherwise2000

编写一个程序块,接受一个雇员名,从emp表中实现上述加薪处理。

erowemp%rowtype;

select*intoerowfromempwhereename='

&

name'

iferow.job='

Clerk'

then

updateempsetsal=sal+500whereempno=erow.empno;

elsiferow.job='

Salesman'

updateempsetsal=sal+1000whereempno=erow.empno;

Analyst'

updateempsetsal=sal-1500whereempno=erow.empno;

else

updateempsetsal=sal+2000whereempno=erow.empno;

endif;

commit;

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

cursorcsisselectenamefromemp;

forerowincsloop

dbms_output.put_line(erow.ename);

endloop;

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

方式一:

cursorcsisselectt.*from(selecte.ename,rownumrmfromempe)twheret.rmbetween1and6;

方式二:

--方式二

inumber:

=1;

i:

=i+1;

--迭代

exitwheni>

5;

--退出条件

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

pjobemp.job%type;

totalsalemp.sal%type;

selectjob,salintopjob,totalsalfromempwhereename='

请输入员工姓名'

dbms_output.put_line(pjob||'

----'

||totalsal);

whenno_data_foundthen

你输入的员工姓名有误!

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

num1float;

num2float;

resfloat;

my_exceptionException;

num1:

被除数;

num2:

除数;

res:

=num1/num2;

raisemy_exception;

whenmy_exceptionthen

dbms_output.put_line(res);

whenothersthen

除数不能为0'

二.声明和使用游标

------游标:

(集合),处理返回多行记录的问题

--声明游标

--语法:

cursor游标名isDQL;

--遍历游标

/*

1.打开游标,open游标名;

2.从游标中提取一行的记录:

fetch游标名into变量名,...;

3.使用循环,exitwhen游标名%notfound;

4.关闭游标,close游标名;

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

declare

cursorcoisselectdnamefromdept;

forvnameinco

loop

dbms_output.put_line(vname.dname);

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

cursorc_empisselect*fromempwheredeptno=&

请输入部门号;

forerowinc_emploop

dbms_output.put_line(erow.ename||'

||erow.job||'

||erow.sal);

输入的部门编号有误'

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

cursorc_cs(c_deptnonumber)isselect*fromempwheredeptno=c_deptno;

v_deptnonumber;

v_deptno:

forerowinc_cs(v_deptno)loop

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

cursorc_empisselectenamefromemp;

forerowinc_emploop

iferow.enamelike'

A%'

updateempsetsal=sal+sal*0.1whereename=erow.ename;

elsiferow.enamelike'

S%'

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

cursorc_empisselect*fromemp;

iferow.sal*1.1<

5000then

三存储过程

-----存储过程(dba声明,得授予dba权限):

封装了一组sql语句,提前编译好,效率较高,存储在服务端

--场景:

网购:

数据库发生什么改变

--库存量-1(update),订单增加(insert),钱(update),物流(insert),日志(insert)

---语法

create[orreplace]procedure存储过程名称(参数名in|out类型,....)

as|is

--声明变量

--过程化语言

*/

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

createorreplaceprocedure

insert_dept(p_deptnoinnumber,p_dnameinvarchar2,p_locinvarchar2)

is

insertintodeptvalues(p_deptno,p_dname,p_loc);

--调用该存储过程

insert_dept(50,'

DEVELOP'

'

SHENGZ'

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

(out参数)

然后调用过程。

find_emp(p_nameinvarchar2,p_saloutnumber)

e_salemp.sal%type;

selectsalintoe_salfromempwhereename=p_name;

p_sal:

=e_sal;

=0;

--调用存储过程

msalnumber(5);

find_emp('

SCOTT'

msal);

dbms_output.put_line(msal);

3.编写一个程序块,接受一个雇员号与一个百分数,从emp表中将该雇员的薪水增加输入的百分比。

(利用过程,inout参数)

createorreplaceprocedureaddSal(p_empnoinnumber,p_numinfloat)

updateempsetsal=sal+sal*p_numwhereempno=p_empno;

输入的员工编号有误'

--访问存储过程

addSal(7788,0.5);

存储函数

---存储函数:

封装了一组sql语句,提前编译好,效率较高,存储在服务端

---存储函数必须有一个返回值,存储函数可以用select语句中

/**

createorreplacefunction函数名(参数名in|out类型,....)

returntype

as|is

return值;

4.创建一个函数,它以部门号作为参数且返回那个部门的所有的雇员的整体薪水(其实就是该部门的平均工资)。

然后调用此函数。

createorreplacefunction

getAllSal(f_deptnoinnumber)

returnnumber

selectavg(sal)intoe_salfromempwheredeptno=f_deptno;

returne_sal;

return0;

--调用存储函数

selectgetAllSal(20)fromdual;

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

然后调用此函数。

createorreplacefunction

showDnameAndLoc(f_deptnoinnumber)

returndept%rowtype

as

e_rowdept%rowtype;

select*intoe_rowfromdeptwheredeptno=f_deptno;

returne_row;

--访问存储函数

erow:

=showDnameAndLoc(20);

dbms_output.put_line(erow.dname||'

||erow.loc);

四触发器练习

-----触发器(监听器):

监听表中的数据是否发生了改变

--增删改操作

/*

createorreplacetrigger触发器名

after|before在改变之前还是之后执行触发器

insert|delete|update监听表的哪个操作

on表对哪张表的监听

触发器的级别:

表级触发器,行级触发器

表级触发器不能使用old,new

行级触发器:

可以使用old,new

*/

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

createorreplacetriggerdel_emp

after

delete

onemp

foreachrow

insertintoret_empvalues(:

old.empno,:

old.ename,:

old.job,

:

old.mgr,:

old.hiredate,:

old.sal,:

m,:

old.deptno);

2.创建一个行级别触发器,停止用户删除雇员名为"

SMITH"

的记录。

createorreplacetriggernodel_SMITH

before

when(old.ename='

raise_application_error(20001,'

不能删除该用户信息'

3.创建一个语句级别触发器,不允许用户在"

Sundays"

使用emp表。

createorreplacetriggercontrol_emp

before

insertorupdateordeleteonemp

ifto_char(sysdate,'

DY'

nls_date_language=AMERICAN'

)--显示系统当前日期以美国格式表示的名字缩写的一天

in('

SUN'

)then

raise_application_error(-20001,'

不允许在星期天操作emp表'

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

当前位置:首页 > 工作范文 > 制度规范

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

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