/*阶段项目案例
第一部分 案例描述
案例目的
学习Oracle数据库的基本概念、建库、建表、基本增删改查,复杂查询(条件、关联、复合),,同时学习数据库对象:视图、索引的使用,还有oralce独有的两个数据库对象:序列和同义词的使用方法和场合,培养学生关于数据库的设计能力与数据的操作能力。
案例难度
★★★
案例覆盖技能点
1、 Oracle数据库基本概念
2、 建库、建表、建约束
3、 实现基本增删改查等数据的操作
1) 对数据库进行增加
2) 删除
3) 修改
4、 根据业务的需要建视图、索引、序列和同义词
1) 建视图
2) 建索引
3) 建序列
4) 建同义词
5、 高级查询技术
1) 会使用 group by、关键字
2) 会使用CASE…WHEN…THEN…
3) 会使用关联查询
4) 会使用子查询
推荐案例完成时间
1天
第二部分 需求和开发环境
使用技术和开发环境
Oracle10g
背景
以前身处不同城市的朋友之间交流感情、互通信息主要通过写信,根据路程的远近一封信寄出去可能需要几天甚至十几天,朋友如果再写回信,往返一次的时间就更长了;随着科技的发展,出现了电报、电话,人与人之间的沟通变得更加迅速和高效;而伴随着计算机的普及和互联网的飞速发展,出现了MSN、QQ等各种可以即时通讯的聊天工具,还有数不清的在线聊天室,越来越多的人选择通过网上聊天来交流感情和互通信息。
案例需求
聊天系统最终要实现的功能与QQ大致相同,主要包括聊天(支持文本、语音和视频)、传送文件和远程协助等功能。在此,只实现其最基本功能——以文本形式进行聊天。*/
/*1. 注册用户管理
包括用户的注册、用户基本信息的修改(包括修改密码)、用户的删除、用户的登录验证,以及用户信息的查看和查找等。
2. 管理员管理
包括管理员的添加、修改、删除、登录验证和查询等。
3. 好友管理
包括申请添加好友、对添加好友的验证信息进行处理、删除好友(从好友列表中删除)等。
4. 聊天信息管理
包括发出聊天信息、显示聊天信息等。
*/
————————————————————————————————————————————————————————————————————————————
第一部分 项目描述
1.1项目目的
学习Oracle数据库的基本概念、建库、建表、基本增删改查,复杂查询(条件、关联、复合),同时学习数据库对象:视图、索引的使用,还有oralce独有的两个数据库对象:序列和同义词的使用方法和场合,培养学生关于数据库的设计能力与数据的操作能力。
第二部分 需求和开发环境
2.1使用技术和开发环境
Oracle-11g
2.2项目需求
教学质量是学校生存与发展的生命线,不断提高课堂教学水平是学校和每一位教师的共同心愿。及时了解课堂教学的主体—学生对教学情况的评价及建议,有利于教师发现自己教学中的优点以及不足,从而进一步改进教学方法,提高教学水平。为了更好的提高教学水平,建立学校与学员的更好勾通,院领导研究决定研发本系统,并提供考核内容管理、反馈项目管理、反馈表管理、数据统计分析等主要功能,本阶段案例主要以考核内容管理为主要分析目标。
2.3详细功能
考核内容管理、反馈项目管理、反馈表管理、数据统计分析等主要功能
2.4 E-R图
2.5数据表的设计
表1 用户表
表名 |
t_user (用户表) |
|||
列名 |
描述 |
数据类型 |
空/非空 |
约束条件 |
Userid |
用户编号 |
NUMBER(38) |
非空 |
主键(自增) |
Pwd |
密码 |
NVARCHAR2(100) |
非空 |
唯一 |
Nickname |
昵称 |
NVARCHAR2(10) |
非空 |
|
Sex |
性别 |
NUMBER(1) |
||
Birthday |
出生日期 |
DATE |
||
Currstate |
当前状态 |
NUMBER(1) |
默认值0,外键 |
|
friendshipplicy |
交友策略 |
NUMBER(1) |
外键 |
表2 用户状态表
表名 |
t_onlinestate (用户状态表) |
|||
列名 |
描述 |
数据类型 |
空/非空 |
约束条件 |
Stateid |
状态编号 |
NUMBER(1) |
非空 |
主键 |
Statedesc |
状态描述 |
NVARCHAR2(20) |
非空 |
唯一 |
表3 好友表
表名 |
t_friend (好友表) |
|||
列名 |
描述 |
数据类型 |
空/非空 |
约束条件 |
Ufid |
编号 |
NUMBER(38) |
非空 |
主键(自增) |
Userid |
用户编号 |
NUMBER (38) |
非空 |
外键 |
Friendid |
好友编号 |
NUMBER (38) |
非空 |
外键 |
表4 交友策略表
表名 |
t_friendshippolicy(交友策略表) |
|||
列名 |
描述 |
数据类型 |
空/非空 |
约束条件 |
Polid |
编号 |
NUMBER(1) |
非空 |
主键 |
Policy |
交友策略 |
NVARCHAR2(20) |
非空 |
唯一 |
表5 聊天信息表
表名 |
t_message(聊天消息表) |
|||
列名 |
描述 |
数据类型 |
空/非空 |
约束条件 |
Messageid |
编号 |
NUMBER(38) |
非空 |
主键(自增) |
Fromuserid |
信息发出者 |
NUMBER(38) |
非空 |
外键 |
Touserid |
信息接受者 |
NUMBER(38) |
非空 |
外键 |
Coutent |
信息内容 |
NVARCHAR2(50) |
||
messagetype |
信息类型 |
NUMBER(1) |
||
State |
是否已读 |
NUMBER(1) |
||
Sendtime |
发出时间 |
DATE |
表5 管理员表
表名 |
t_admin(管理员表) |
|||
列名 |
描述 |
数据类型 |
空/非空 |
约束条件 |
Admin |
编号 |
NUMBER(10) |
非空 |
主键(自增) |
Adminname |
NVARCHAR2(20) |
非空 |
唯一 |
|
Adminpwb |
密码 |
NVARCHAR2(100) |
非空 |
2.6数据库约束的设计
功能:在user表中设置userid为主键
实现: UseridNUMBER(38) primary key not null
功能:在user表中将stateIid设置为表t_onlinestate的外键
实现:Currstate NUMBER(1)default 0 references t_onlinestate(Stateid)
功能:在user表中将Polid设置为表t_friendshippolicy的外键
实现:friendshippolicyNUMBER(1) references t_friendshippolicy(Polid)
功能:在t_onlinestate设置stateid为主键
实现:Stateid NUMBER(1)primary key not null
功能:在t_friendshippolicy设置Polid为主键
实现:Polid NUMBER(1)primary key not null
功能:在t_friend设置Ufid为主键
实现:Ufid NUMBER(38)primary key not null
功能:在t_message表中设置Messageid为主键,Fromuserid,Touserid为外键
实现:MessageidNUMBER(38) primary key not null,-- 非空 主键(自增)
Fromuserid NUMBER(38) not null references t_user(Userid),-- 非空 外键
Touserid NUMBER(38) not null references t_user(Userid),-- 非空 外键
功能:在t_admin设置Adminid为主键
实现:AdminidNUMBER(10) primary key not null,-- 非空 主键(自增)
2.7数据库序列的设计
功能:在user表中建立seq_user序列并设置取值范围
实现:drop sequenceseq_user;
create sequence seq_user
increment by 1
start with 10001
maxvalue 999999999
nocycle
cache 10;
功能:在friend表中建立seq_friend序列
实现:create sequenceseq_friend;
功能:在admin表中建立seq_admin序列
实现:create sequenceseq_admin;
2.8数据库视图的设计
功能:查询某个好友的聊天记录
实现:drop view v_message;
create view v_message as
select fromuserid,touserid,Content1,sendtime from t_message;
select * from v_message where fromuserid = &fromuserid and touserid =&touserid;
功能:查询某个用户的所有好友。
实现:create view v_friendas
select userid,friendid from t_friend;
select * from v_friend where userid = &userid;
2.10数据库触发器的设计
功能:在插入数据之前,先给userid赋值,以免发生null错误。
实现:create or replacetrigger tir_user
before insert on t_user for each row
begin
selectseq_user.nextval
into :new.Userid from dual;
end;
功能:在插入数据前,先给每一行附上序号,以免发生null错误。
实现:create or replacetrigger tir_friend
before insert on t_friend for each row
begin
select seq_friend.nextval
into :new.Ufid from dual;
end;
功能:在插入数据前,先给每一行附上序号,以免发生null错误。
实现:create or replacetrigger tir_messaged
before insert on t_message for each row
begin
select seq_message.nextval
into :new.Messageid from dual;
end;
功能:在插入数据前,先给每一行附上序号,以免发生null错误。
实现:create or replacetrigger tir_admin
before insert on t_admin for each row
begin
select seq_admin.nextval
into :new.Adminid from dual;
end;
2.11数据库函数的设计
实现:
create or replace procedure all_friend_proc
is
cursorall_friend_cur is select t_friend.userid from t_friend ;
v_useridt_friend.userid%type;
v_friendidt_friend.friendid%type;
v_nicknamet_user.nickname%type;
begin
for fd inall_friend_cur loop
selectt_friend.userid,t_friend.friendid,t_user.nickname
intov_userid,v_friendid,v_nickname from t_friend,t_user
wheret_friend.userid = t_user.userid and t_friend.userid = fd.userid;--关联查询
dbms_output.put_line(v_userid||' '||v_friendid||' '||v_nickname);
end loop;
end;
实现:
create or replace procedure message_proc
is
v_useridt_user.userid%type;
v_touseridt_message.touserid%type;
v_fromuseridt_message.fromuserid%type;
v_contentt_message.content%type;
cursorall_fromuserid_cur is select fromuserid from t_message ;
begin
for fud inall_fromuserid_cur loop
selectt_user.userid,t_message.touserid,t_message.content intov_userid,v_touserid,v_content from t_message,t_user where t_user.userid =t_message.fromuserid and fromuserid=fud.fromuserid;
dbms_output.put_line(v_userid||' '||v_touserid||' '||v_fromuserid||''||' '||v_content);
end loop;
end;
2.12数据库存储过程的设计
功能:将此功能设计成一个存储过程,实现大量的用户进行注册功能,实现数据的存储。
实现:create or replaceprocedure register_proc(
pwd varchar2,
nickname varchar2,
sex number,
birthday date,
currstate number,
friendshippolicynumber
)
is
Begin Insert
into t_uservalues(userid_seq.nextval,pwd,nickname,sex,birthday,currstate,friendshippolicy);
end;
set serveroutput on;
exec register_proc('123','qwert',1,'01-8月-2017',2,3);
附录代码:
ister_proc('123',3);
create table t_user(
--列名 描述 数据类型(精度范围) 空/非空 约束条件
Userid NUMBER(38) primary key not null,-- 非空 主键(自增),初始值10001
Pwd NVARCHAR2(100) not null,-- 非空
Nickname NVARCHAR2(10) not null,-- 非空
Sex NUMBER(1) CHECK( Sex in (0,1)),
Birthday DATE,
Currstate NUMBER(1) default 0 references t_onlinestate(Stateid),-- 默认值0,外键
friendshippolicy NUMBER(1) references t_friendshippolicy(Polid)-- 外键
);
insert into t_user(Pwd,Nickname,Sex,Birthday,Currstate,friendshippolicy) values
('123456','Cong',sysdate,1);
select * from t_user;
drop sequence seq_user; --序列
create sequence seq_user
increment by 1
start with 10001
maxvalue 999999999
nocycle
cache 10;
create or replace trigger tir_user --触发器
before insert on t_user for each row
begin
select seq_user.nextval
into :new.Userid from dual;
end;
--2. 用户状态表
create table t_onlinestate(--(用户在线状态表)
--列名 描述 数据类型(精度范围) 空/非空 约束条件
Stateid NUMBER(1) primary key not null,-- 非空 主键
Statedesc NVARCHAR2(10) unique not null-- 非空 唯一
);
insert into t_onlinestate values (1,'在线');
insert into t_onlinestate values (2,'离线');
insert into t_onlinestate values (3,'隐身');
insert into t_onlinestate values (4,'忙碌');
select * from t_onlinestate;
/*用户状态表里的数据如下:
编号 用户在线状态
1 在线
2 离线
3 隐身
4 忙碌
*/
--3.交友策略表
create table t_friendshippolicy(--(交友策略表)
--列名 描述 数据类型(精度范围) 空/非空 约束条件
Polid NUMBER(1) primary key not null,-- 非空 主键
Policy NVARCHAR2(20) unique not null-- 非空 唯一
);
insert into t_friendshippolicy values (1,'允许任何人加我为好友');
insert into t_friendshippolicy values (2,'不允许任何人加我为好友');
insert into t_friendshippolicy values (3,'经过验证才允许别人加我为好友');
select * from t_friendshippolicy;
/*交友策略表数据如下:
编号 交友策略
1 允许任何人加我为好友
2 不允许任何人加我为好友
3 经过验证才允许别人加我为好友
*/
--4. 好友表
create table t_friend(--(好友表)
--列名 描述 数据类型(精度范围) 空/非空 约束条件
Ufid NUMBER(38) primary key not null,-- 非空 主键(自增)
Userid NUMBER(38) not null references t_user(Userid),-- 非空 外键
Friendid NUMBER(38) not null references t_user(Userid) -- 非空 外键
);
insert into t_friend(userid,friendid) values (10001,10002);
insert into t_friend(userid,friendid) values (10002,10003);
insert into t_friend(userid,friendid) values (10003,10005);
insert into t_friend(userid,friendid) values (10004,10003);
select * from t_friend;
create sequence seq_friend;
create or replace trigger tir_friend
before insert on t_friend for each row
begin
select seq_friend.nextval
into :new.Ufid from dual;
end;
--5. 聊天信息表
create table t_message(--(聊天消息表)
--列名 描述 数据类型(精度范围) 空/非空 约束条件
Messageid NUMBER(38) primary key not null,-- 非空 主键(自增)
Fromuserid NUMBER(38) not null references t_user(Userid),-- 非空 外键
Touserid NUMBER(38) not null references t_user(Userid),-- 非空 外键
Content1 VARCHAR2(50),
messagetype NUMBER(1) CHECK(messagetype in (0,
State NUMBER(1) default 0 CHECK(State in (0,
Sendtime DATE default sysdate-- 默认值
);
insert into t_message(fromuserid,content1,messagetype) values
(10004,10005,'XXXXXXXXXXXXXXXXXXXXXXX',0);
insert into t_message(fromuserid,messagetype) values
(10002,'阿萨大神大所大所大所大所多',0);
select * from t_message;
create sequence seq_message;
create or replace trigger tir_messaged
before insert on t_message for each row
begin
select seq_message.nextval
into :new.Messageid from dual;
end;
--6. 管理员表 create table t_admin(--(管理员表) --列名 描述 数据类型(精度范围) 空/非空 约束条件 Adminid NUMBER(10) primary key not null,-- 非空 主键(自增) Adminname NVARCHAR2(20) unique not null,-- 非空 唯一 Adminpwd NVARCHAR2(100) not null-- 非空 ); insert into t_admin(adminname,adminpwd) values ('sku','111'); select * from t_admin; create sequence seq_admin; --序列 create or replace trigger tir_admin before insert on t_admin for each row--触发器 begin select seq_admin.nextval into :new.Adminid from dual; end;
原文链接:https://www.f2er.com/oracle/208139.html