pl sql项目演练--B2C商城项目
SQL> create table UserInfo
2 (UserId varchar2(50) not null primary key, --用户ID
3 UserName varchar2(50) not null, --真实姓名
4 PassWord varchar2(50) not null, --密码
5 UserRole number(2), --角色
6 Gender number(1) not null check(Gender in(0,1)), --性别
7 PassQuestion varchar2(50) not null, --密码提示问题
8 PassAnswer varchar2(50) not null , --密码提示答案
9 Email varchar2(50) not null, --电子邮箱
10 TelNO number(11) not null, --电话号码
11 Address varchar2(50), --联系地址
12 IdCardNO number(18), --身份证号
13 Money number, --用户余额
14 UserState number --用户状态
15 );
创建用户注册存储过程完成用户注册
CREATE OR REPLACE PROCEDURE INSERTINFO_PROC
(
UserId VARCHAR2 ,
Username varchar2,
password varchar2,
Gender number,
PassQuestion varchar2,
PassAnswer varchar2,
Email varchar2,
TelNo varchar2,
Address varchar2 :=null,
IdCardNo varchar2,
UserRole number:=5,
Money number :=0,
UserState number:=1
) AS
BEGIN
Insert into userinfo values(UserId,UserName,PassWord,UserRole,Gender,PassQuestion,PassAnswer,Email,TelNO,
Address,IdCardNO, Money, UserState);
commit;
if sql%NOtFound then
dbms_output.put_line('注册失败');
end if;
END INSERTINFO_PROC;
create or replace PROCEDURE USERINFO_PROC
(P_UserId varchar2)
AS
BEGIN
update userinfo set uerrole=3 where userid=p_userid;
commit;
END USERINFO_PROC;
查看会员信息:
create or replace PACKAGE PKG_USERINFO AS /* TODO enter package declarations (types, exceptions, methods etc) here */
type userinfos is ref cursor;
procedure select_userinfo(p_userid varchar2,p_userinfo out userinfos);
END PKG_USERINFO; create or replace PACKAGE BODY PKG_USERINFO AS procedure select_userinfo(p_userid varchar2,p_userinfo out userinfos) AS
sqlstr varchar2(500);
BEGIN
-- TODO: procedure PKG_USERINFO.select_userinfo所需的实施
sqlstr:='select UserID,UserName,PassWord,Gender,PassQuesstion,PassAnswer,Email,TelNo,Address,
IDCardNo,Money from UserInfo where UserID=:v_userid';
open p_userinfo for sqlstr using p_userid;
END select_userinfo; END PKG_USERINFO;
对角色信息扩展,增加角色表:
truncate table userinfo;
alter table userinfo add constraint fk_roleinfo foreign key (uerrole) references roleinfo (roleid); create table RoleInfo
2 (RoleId number(2) primary key, --角色ID
3 RoleName varchar2(50), --角色名称
4 RoleDesc varchar2(50), --角色描述
5 DisCount number(2) --会员折扣
6 );
同时对多个用户操作首先获取多个用户的userid
create global temporary table temptable (col varchar2(30)) on commit delete rows; CREATE OR REPLACE PROCEDURE GETUSERID_PROC (p_str varchar2)AS
result_str varchar2(30);
i number :=1;
s number:=1;
j number:=0;
BEGIN
while i!=0 loop
i:=instr(p_str,',',1,s);
if(i=0) then
result_str:=substr(p_str,j+1,length(p_str)-j);
else
--xiaomi,maf,an
-- j i
-- 7 11
result_str:=substr(p_str,j+1,i-j-1);
end if;
j:=i;
s:=s+1;
dbms_output.put_line(result_str);
insert into temptable values(result_str);
end loop;
END GETUSERID_PROC;
同时对多个用户删除,修改角色
create or replace procedure updaterole_proc --修改角色
2 (UserID_String varchar2,
3 parm_UserRole varchar2)
4 as
5 begin
6 getuserid_proc(UserID_String); --多个用户ID之间用逗号隔开
7 update UserInfo
8 set UserRole=parm_UserRole
9 where Userid in(select col from temptable);
10 commit;
11 end;
12 / 过程已创建。 SQL> create or replace procedure DeleteUser_proc --删除用户
2 (UserID_String varchar2)
3 as
4 begin
5 getuserid_proc(UserID_String);
6 delete userinfo
7 where userid in(select col from temptable);
8 commit;
9 end;
10 /
3.
create table sysfun --存放菜单功能基本信息
(nodeid number(2) not null, --菜单编号
displayname varchar2(50) not null, --菜单名称
nodeurl varchar2(50) not null, --菜单连接地址
displayorder number(2) not null, --菜单显示顺序
parentnodeid number(2)not null --父节点
);
将各个功能与相应角色对应
create table roleright
(rolerightid number(2) not null,
roleid number(2),
nodeid number(2) );
alter table sysfun add constraint pk_sysfun primary key (nodeid);
alter table roleright
add constraint fk_roleid foreign key(roleid) references roleinfo(roleid);
alter table roleright
add constraint fk_nodeid foreign key(nodeid) references sysfun(nodeid);
create sequence seq_id
increment by 1
start with 1; CREATE OR REPLACE TRIGGER TRI_ROLEID
BEFORE INSERT ON ROLEINFO
for each row
declare new_key number(2);
BEGIN
new_key:=seq_id.nextval;
:new.roleid:=new_key;
END; create or replace PROCEDURE INSERTROLE
(
P_ROLENAME IN VARCHAR2 ,
p_roledesc in varchar2
) AS
BEGIN
insert into roleinfo(rolename,roledesc) values(
p_rolename,p_roledesc
);
commit;
END INSERTROLE;
设置优惠:
create or replace procedure U_discount --设定优惠价比
2 (parm_rolename varchar2,
3 parm_discount number)
4 as
5 begin
6 update roleinfo
7 set discount=parm_discount
8 where rolename=parm_rolename;
9 end;
10 /
4.sql优化
1.表名顺序 table A 1000条
table B 1 select count(*)
from A, B (最佳方法) select count(*)
from B,A (不好方法) 2.where 子句条件采用自下而上顺序解析
(低效方法)
select ...
from emp E
where sal>2000
and job='MANAGER'
and 25<(select count(*) from where mgr=E.EMPNO) (高效方法)
select ...
from emp E
where 25<(select count(*) from where mgr=E.EMPNO)
and job='MANAGER'
and sal>2000 3.减少访问数据库的次数
(低效方法)
select ename,sal,job from emp
where empno=7369;
select ename,sal,job from emp
where empno=7499; (高效方法)
select A.ename, A.sal, A.job,B.ename,B.sal, B.job
from emp A, emp B
where empno=7369 and empno=7499; 4. decode减少处理时间
select count(*),sum(sal)from emp
where deptno=20 and ename like 'SMITH%';
select count(*),sum(sal)from emp
where deptno=30 and ename like 'SMITH%'; 高效方法
select count(decode(deptno,20,'*',0)) as count20,
count(decode(deptno,30,'*',0)) as count30,
sum(decode(deptno,20,sal,0)) as sumsal20,
sum(decode(deptno,30,sal,0)) as sumsal20,
from emp
where ename like 'SMITH%'; 5.删除重复记录
(高效方法)
delete from emp E
where E.rowid>(select min(X.ROWID) from emp X where X.empno=E.empno); 6.where替换having
先后顺序
on
where
having 7.使用表的别名
select A.COL1,A.col2,B.COL1
from test1 A, test2 B 8.exists distinct
(低效)
select distinct deptno,deptname from dept D, emp E
where D.deptno=E.deptno; (高效)
select distinct deptno,deptname from dept D
where EXISTS(select * from emp where E.deptno=D.deptno); 9.索引不要使用在计算字段上
select ... from emp where sal*12>20000 (低效)
select ... from emp where sal>20000/12 (高效) 10.
select * from student where cno='' or cno='' select * from student where cno=''
union
select * from student where cno='' 11.
select ename,sal from emp
where sal+2000>5000;(停用索引) select ename,sal from emp
where sal>3000;(启用索引) 12.耗费资源的操作
distinct,union,intersect, order by 13.优化group by
(低效)
select job,avg(sal)
from emp
group by job
having job='MANAGER' or job='CLERK'; (高效)
select job,avg(sal)
from emp
where job='MANAGER' or job='CLERK'
group by job;
pl sql项目演练--B2C商城项目的更多相关文章
- python实战项目练习-Django商城项目之注册功能实现
设计到的前端知识 项目的前端页面使用vue来实现局部刷新,通过数据的双向绑定实现与用户的交互,下面来看一下需求,在用户输入内容后,前端需要做一些简单的规则校验,我们希望在在用户输入后能够实时检测,如果 ...
- PL/SQL Developer几个使用小技巧
1.选中sql语句的当前行 鼠标连续点击所在行3次. 2.记住登陆密码 工具 -> 首选项 -> Oracle -> 登录历史,勾选“带口令存储”. 3.查看Oracle的tnsna ...
- Tornado实战项目(伪JD商城)
预备知识 在之前tornado商城项目中,在开始之前需要引入一些项目设计知识,如接口,抽象方法抽象类,组合,程序设计原则等,个人理解项目的合理设计可增加其灵活性, 降低数据之间的耦合性,提高稳定性,下 ...
- .NET大型B2C开源项目nopcommerce解析——项目结构
.NET大型B2C开源项目nopcommerce解析——项目结构 编写本文档是为了向程序员说明nopcommerce的解决方案结构,亦是程序员开发nopcommerce的居家必备良书.首先nopcom ...
- C# RabbitMQ优先级队列实战项目演练
一.需求背景 当用户在商城上进行下单支付,针对客户等级的不同和订单金额的大小划分客户级别,需要优先处理给标识为大订单的客户发送一份订单邮件提醒.那么我们应用程序如何解决这样的需求场景呢?今天阿笨给大家 ...
- C# RabbitMQ延迟队列功能实战项目演练
一.需求背景 当用户在商城上进行下单支付,我们假设如果8小时没有进行支付,那么就后台自动对该笔交易的状态修改为订单关闭取消,同时给用户发送一份邮件提醒.那么我们应用程序如何实现这样的需求场景呢?在之前 ...
- Django商城项目笔记No.1项目准备工作
Django商城项目笔记No.1项目准备工作 一.本项目商城属于B2C商业模式 二.项目采用前后端分离的应用模式 前端使用Vue.js 后端使用Django REST framework 1.创建gi ...
- 【SSH网上商城项目实战27】域名空间的申请和项目的部署及发布
转自:https://blog.csdn.net/wwww_com/article/details/54405355 前面陆陆续续的完成了网上商城的一些基本功能,虽然还有很多地方有待完善,但是不影响 ...
- 【SSH网上商城项目实战16】Hibernate的二级缓存处理首页的热门显示
转自:https://blog.csdn.net/eson_15/article/details/51405911 网上商城首页都有热门商品,那么这些商品的点击率是很高的,当用户点击某个热门商品后需要 ...
随机推荐
- nova availability zone
find a bug: at first there is only one zone. create aggregate host1 in zone1 create aggregate host1 ...
- 利用rman进行异机还原(目录相同)
利用rman进行异机还原(目录相同) 源始库:192.168.201.2 目标库:192.168.201.3 --192.168.201.2 --rman [oracle@db01 ~]$ rman ...
- @Transactional 注解说明
先让我们看代码吧! 以下代码为在"Spring3事务管理--基于tx/aop命名空间的配置"基础上修改.首先修改applicationContext.xml如下: <pre ...
- wormhole提升hivereader读取速度方案
背景: 最近dw用户反馈wormhole传输速度很慢,有些作业甚至需要3-4个小时才能完成,会影响每天线上报表的及时推送.我看了下,基本都是从Hive到其他数据目的地,也就是使用的是hivereade ...
- UI标签库专题十三:JEECG智能开发平台 ckfinder(ckfinder插件标签)
1. ckfinder(ckfinder插件标签) 1.1. 參数 属性名 类型 描写叙述 是否必须 默认值 name string 属性名称 是 null value string 默认值 否 nu ...
- BFS+状态压缩 HDU1429
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- [转]不用Cookie的“Cookie”技术
有另外一种比较隐蔽的用户追踪技术,不使用cookie或者Javascript.很多网站已经在用了,但知道的人不多.本文就来介绍一下这种技术是如何追踪用户,用户又该如何避免追踪. 这种技术不依赖于: C ...
- SVN导出增量包的方法
此方法是在svn1.7版本基础上进行的操作,其他版本没有验证 第一步.点击右键,选择“TortoiseSVN–> Show log”. 进入日志页面,如下图所示: 第二步.选择版本区间,右键选择 ...
- linux 图形界面切换
开机为文本界面,由文本界面切换到图形界面: 方法1:运行命令 #startx , 需要先配置图形界面信息,(暂时不会~) : 方法2:修改/etc/inittab文件中的 ...
- 安装Ubuntu小计
因为想学Linux了,所以想装一个Linux版本尝尝鲜,听说Ubuntu桌面版很炫,所以也没有啥特定理由的选了这个版本(实际我装的时候用了Ubuntu Kylin). 具体安装过程可以参考如下的教程: ...