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 网上商城首页都有热门商品,那么这些商品的点击率是很高的,当用户点击某个热门商品后需要 ...
随机推荐
- 在自定义的js验证规则中调用magento的VarienForm方法验证表单
js部分<script type="text/javascript"> //<![CDATA[ var loginForm = new VarienForm('l ...
- bootstrap注意事项(二)
1.内联子标题 在标题内还可以包含 <small> 标签或赋予 .small 类的元素,可以用来标记副标题. <!DOCTYPE html> <html> < ...
- css黑魔法
多行文本溢出显示省略号(...)的方法 p { overflow : hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-li ...
- 看到当年自己学SQL Server 的笔记
数据库 数据量DataBase,不同类型的数据应该放到不同的数据库中, .便于对各个数据类别进行个性管理 .避免命名冲突 .安全性更高; table(表):数据库中的关系指的就是表; 一张表就是一个类 ...
- api (二) 创建控件 (转)
在Win32 SDK环境下,怎么来创建常用的那些基本控件呢?我们知道如果用MFC,简单的拖放即可完成大多数控件的创建,但是我们既然是用Windows SDK API编程,当然是从根上解决这个问题,实际 ...
- 游戏基础元素——Cocos2d-x学习历程(八)
1.Director:导演 从字面上理解,这是一个"导演"类,Director是控制游戏流程的主要组件.CCDirector的工作确实跟导演非常类似,主要负责以下工作: 游戏呈现方 ...
- BZOJ 3672: [Noi2014]购票( 树链剖分 + 线段树 + 凸包 )
s弄成前缀和(到根), dp(i) = min(dp(j) + (s(i)-s(j))*p(i)+q(i)). 链的情况大家都会做...就是用栈维护个下凸包, 插入时暴力弹栈, 查询时就在凸包上二分/ ...
- firefox 自写扩展改版,总结
自己写的扩展,油猴功能,进一步改进,增加了许多操作.原来只是在13以下版本下面能用,主要是在13版本下面chrome代码和page下面代码能够直接互调,13版本以后就不可以了,最近考虑到新版Firef ...
- [原创]使用GCC创建 Windows NT 下的内核DLL
原文链接:使用GCC创建 Windows NT 下的内核DLL 在温习<<Windows 2000 Driving>>分层驱动程序一章的时候,看到了关于紧耦合驱动连接方式,这种 ...
- ASP.NET 连接 SQL Server 和 Oracle 教程
临近期末,有很多同学都问我怎么关于ASP.NET 连接 SQL Server 和 Oracle 的问题.由于人太多了,我也不能一一去帮忙,就写了这篇博客.希望对大家有用处. 首先,前期准备是要安装数据 ...