1. 创建一个函数fun_sal,该函数根据部门号获得该部门下所有员工的平均工资
Create or replace function fun_sal(deptnos number)
return varchar2
Is
Avgs number(10);
Begin
Select avg(sal) into Avgs from scott.emp where deptno=deptnos;
Return Avgs;
End;
2.创建一个动态游标,根据部门编号查询该部门下员工所有信息。
declare
cursor emp_cursor(deptnos number)
is
select * from scott.emp where deptno=deptnos;
v_temp emp_cursor%rowtype;
begin
if not emp_cursor%isopen then
Open emp_cursor(&deptno);
end if;
loop
fetch emp_cursor into v_temp;
exit when emp_cursor%notfound;
dbms_output.put_line(‘编号是:‘||v_temp.empno||‘姓名是:‘||v_temp.ename||‘工资是:‘||v_temp.sal);
end loop;
close emp_cursor;
end;
3 创建一个存储过程,根据该员工的编号,查询该员工的工资,如果该工资少于2000.把工资提高到2000.
create or replace procedure proc_sal(empnos number)
is
sals number(10);
begin
select sal into sals from scott.emp where empno=empnos;
if sals<2000 then
update scott.emp set sal=2000 where empno=empnos;
end if;
end;
4 显示在一个月为30天的情况所有员工的日薪金,忽略余数
Select sal+nvl(comm,0) from emp
第二部分
第一阶段:创建用户和基础表
1. 创建用户developer密码developer,为其赋予足够的权限,然后用该用户完成下面功能。
create user developer identified by developer;
grant connect,resource to developer;
2. 创建数据表
--客户信息表
--(会员编号、会员姓名、会员密码、邮箱地址、注册时间)
create table customer
(
cId number(20) primary key,
cName varchar2(20),
cPwd varchar2(20),
email varchar2(20),
cTime date
);
--商品信息表
--(商品id,商品名字、价格、折扣、是否新品、现存量)
create table goodsInfo
(
gId number(20) primary key,
gName varchar2(20),
price number(5,2),
zc number(1,1),
isNew number(10),
total number(20)
);
--订单信息表
--(订单id、会员id、订单状态(0未付款、1已付款、2已审核、3完成)、下单时间)
create table orderInfo
(
oId int primary key,
cId number(20) references customer(cId),
isStage number(10),
endTime date
);
--订单明细信息表
--(订单id、商品id、商品数量)
create table orderd
(
oId references orderInfo(oId),
gId references goodsInfo(gId),
goodsnum number(30)
);
要求:
1. 会员姓名唯一
create unique index names on customer(cName);
2. 商品折扣介于0.0-10.0之间
alter table goodsInfo
add
constraint zc check(zc>=0.0 and zc<=10.0);
3. 订单明细表中订单id和商品id唯一
create unique index weiyi on orderd(oId,gId);
4. 订单id由系统自动生成,请使用序列完成
create sequence xu start with 1 increment by 1 ;
insert into customer values(1,‘离宿舍‘,‘123‘,‘[email protected]‘,to_date(‘2014-1-2‘,‘yyyy-MM-dd‘));
insert into orderInfo values(xu.nextval,1,1,to_date(‘2014-4-2‘,‘yyyy-MM-dd‘));
5. 外键关系1:订单信息表(会员id)-客户信息表(会员编号)
6. 外键关系2:订单明细表(订单id)-订单信息表(订单id)
7. 外键关系3:订单明细表(商品id)-客户信息表(商品id)
第三阶段:数据录入与查询
向每张表添加3条以上的数据
--客户信息表
--(会员编号、会员姓名、会员密码、邮箱地址、注册时间)
insert into customer values(1,‘离宿舍‘,‘123‘,‘[email protected]‘,to_date(‘2014-1-2‘,‘yyyy-MM-dd‘));
insert into customer values(2,‘王五‘,‘123‘,‘[email protected]‘,to_date(‘2014-2-2‘,‘yyyy-MM-dd‘));
insert into customer values(3,‘李四‘,‘123‘,‘[email protected]‘,to_date(‘2014-3-2‘,‘yyyy-MM-dd‘));
insert into customer values(4,‘流量‘,‘123‘,‘[email protected]‘,to_date(‘2014-4-2‘,‘yyyy-MM-dd‘));
insert into customer values(5,‘士大夫‘,‘123‘,‘[email protected]‘,to_date(‘2014-3-4‘,‘yyyy-MM-dd‘));
商品id,商品名字、价格、折扣、是否新品、现存量
insert into goodsInfo values(1,‘鞋子‘,45.50,0.9,1,50);
insert into goodsInfo values(2,‘帽子‘,35.50,0.8,1,500);
insert into goodsInfo values(3,‘衣服‘,45.50,0.9,1,150);
insert into goodsInfo values(4,‘裤子‘,100.50,0.5,1,100);
insert into goodsInfo values(5,‘袜子‘,45.50,0.7,1,500);
--订单信息表
--(订单id、会员id、订单状态(0未付款、1已付款、2已审核、3完成)、下单时间)
insert into orderInfo values(xu.nextval,1,1,to_date(‘2014-4-2‘,‘yyyy-MM-dd‘));
insert into orderInfo values(xu.nextval,1,1,to_date(‘2014-4-2‘,‘yyyy-MM-dd‘));
insert into orderInfo values(xu.nextval,1,1,to_date(‘2014-4-2‘,‘yyyy-MM-dd‘));
insert into orderInfo values(xu.nextval,1,1,to_date(‘2014-4-2‘,‘yyyy-MM-dd‘));
insert into orderInfo values(xu.nextval,1,1,to_date(‘2014-4-2‘,‘yyyy-MM-dd‘));
insert into orderInfo values(xu.nextval,2,1,to_date(‘2014-4-2‘,‘yyyy-MM-dd‘));
--订单明细信息表
--(订单id、商品id、商品数量)
insert into orderd values(2,1,2);
insert into orderd values(3,2,2);
insert into orderd values(4,5,1);
insert into orderd values(5,3,2);
insert into orderd values(6,4,2);
insert into orderd values(7,2,1);
insert into orderd values(7,3,5);
1. 查询订单信息:订单编号、订单状态(显示中文状态)、下单时间、订单总金额
select o.oId, case isStage
when 0 then ‘未付款‘
when 1 then ‘已付款‘
when 2 then ‘已审核‘
when 3 then ‘完成‘ end ,endTime,sum(price*zc*goodsnum) from orderInfo o inner join orderd o1 on o.oId=o1.oId inner join goodsInfo g on g.gId =o1.gId
group by o.oId,o.isstage,o.endtime;
2. 查询商品信息:商品编号、商品名称、商品价格、折扣价
select gId,gName,price,zc*price from goodsInfo;
3. 查询订单明细:订单编号、下单时间、商品名称、商品价格、购买数量
select o.oId,endTime,gName,price,goodsnum from orderInfo o inner join orderd o1 on o.oId=o1.oId inner join goodsInfo g on g.gId =o1.gId ;
4. 查询消费金额排在前5名的顾客信息:会员id、会员姓名、邮箱、注册时间
select c.cId,cName,email,cTime from
(select rownum,o.cId, o.oId,isStage,endTime,price*zc*goodsnum prices from orderInfo o inner join orderd o1 on o.oId=o1.oId inner join goodsInfo g on g.gId =o1.gId order by prices desc ) temp
inner join customer c on c.cId=temp.cId and (rownum>=0 and rownum<=5) ;
5. 查询销量最大的商品信息:商品id、商品名称、销售数量
select rownum,goodsInfo.* from
(
select g.gId,g.gname,sum(o1.goodsnum) from orderd o1 inner join goodsInfo g on o1.gid=g.gid group by g.gid,g.gname order by sum(goodsnum) desc) temp where rownum=1;
)
第四阶段:视图、存储过程、函数
1. 创建视图view_OrderDetail:订单编号、订单状态、订单总金额、下单日期、会员id、会员姓名、会员邮箱。通过视图进行数据查询。
create or replace view view_OrderDetail
as
select o.oId, case isStage
when 0 then ‘未付款‘
when 1 then ‘已付款‘
end case ,endTime, (select sum(goodsnum * (select price * zc from goodsInfo where gid=o1.gId)) "TotalMoney" from orderd o1 where oid = o.oid) as "TotalMoney"
from order o
inner join customer c on c.cid = o.cid;
2. 创建存储过程pro_InsertProduct:
输入参数:商品名字、价格、折扣、是否新品、现存量
输出参数:商品id
create or replace procedure pro_InsertProduct
(
sname varchar2,
price number,
zc number,
isnew number,
total number,
sIds out number
)
is
begin
sIds :=xu.nextval;
insert into goodsInfo values(xu.nextval,sname,price,zc,isnew,total);
end;*/
测试:调用存储过程新增一条商品信息。
declare
sids number;
begin
pro_InsertProduct(‘sdf‘,565,0.2,0,56,sids);
dbms_output.put_line(‘ID号是:‘||sids);
end;
3. 创建函数func_getCustomerCostMoney:该函数通过会员编号计算该会员总的消费金额。
参数:会员编号
返回值:该会员总的消费金额
create or replace function func_getCustomerCostMoney
(
id number
)
return number
is
v_money number(9,3);
begin
select sum(price*zc*goodsnum) prices into v_money from goodsInfo g inner join orderd o1 on g.gid =o1.gid where o1.oid in
(select oid from orderInfo o inner join customer c on id=o.cid);
return v_money;
end;
测试:查询所有会员的消费情况:会员编号、会员姓名、注册时间、邮箱、消费金额。
select cId,cName,endtime,email,func_getCustomerCostMoney(cId) totals from customer;
第五阶段:触发器、包
? 新添加一张日志记录表。每次对商品信息进行删除操作时,需要将被删除的商品信息记录到该日志记录表中。要求:使用触发器完成该功能。
create table rizi
(
gId number(20) primary key,
gName varchar2(20),
price number(5,2),
zc number(1,1),
isNew number(10),
total number(20)
);
create or replace trigger tiger_name
after delete on goodsInfo for each row
begin
insert into rizi values(:old.gId,:old.gName,:old.price,:old.zc,:old.isNew,:old.total);
end;
? 新创建一个包pack_order。该包内包括:
1. 函数:func_getOrderMoney。该函数根据订单id计算该订单的总金额
参数:订单id
返回值:订单总金额
/*create or replace package pack_order
is
function func_getOrderMoney(dId number) return number;
end;
*/
create or replace package body pack_order
is
function func_getOrderMoney(dId number) return number
is
v_total number(5,2);
begin
select sum(price*zc*goodsnum) prices into v_total from goodsInfo g inner join orderd o1 on g.gid =o1.gid where o1.oid=dId;
return v_total;
end;
end;
测试:查询订单:订单编号、订单状态(显示中文状态)、下单时间、订单总金额
2. 函数:func_getSaleProductCount。该函数能够根据商品id计算其销售数量。
参数:商品id
返回值:销售数量
create or replace function func_getSaleProductCount(ids number)
return number
is
v_snum number(10);
begin
select sum(goodsnum) s into v_snum from orderd o where o.gid=ids;
return v_snum;
end;
测试:查询销量前10名的商品信息,并按销售数量倒序排列。
商品id、商品名称、商品价格、销量