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 网上商城首页都有热门商品,那么这些商品的点击率是很高的,当用户点击某个热门商品后需要 ...
随机推荐
- 5.4const对象
常成员函数 一个const对象可以调用const函数,但不能调用非const成员函数.必须将关键字const放在函数参数表之后,才能说明该函数是一个const成员函数. 声明常成员函数的格式如下: 类 ...
- oracle 物化视图导入导出报错
1.exp导出报EXP-00008: 遇到 ORACLE 错误 1455,ORA-01455: 转换列溢出整数数据类型 2.imp导入报.注: 表包括 ROWID 列, 其值可能已废弃,不是警告也不是 ...
- POJ2553-The Bottom of a Graph
id=2553">主题链接 题意:求解Bottom(G).即集合内的点能够互相到达. 思路:有向图的强连通.缩点,找出出度为0的点,注意符合的点要按升序输出. 代码: #include ...
- 【转】 LESS CSS 框架简介
简介 CSS(层叠样式表)是一门历史悠久的标记性语言,同 HTML 一道,被广泛应用于万维网(World Wide Web)中.HTML 主要负责文档结构的定义,CSS 负责文档表现形式或样式的定义. ...
- 第三章SignalR在线聊天例子
第三章SignalR在线聊天例子 本教程展示了如何使用SignalR2.0构建一个基于浏览器的聊天室程序.你将把SignalR库添加到一个空的Asp.Net Web应用程序中,创建用于发送消息到客户端 ...
- Android基础之CountDownTimer 倒计时类
app常用的60s倒计时计时功能: private static final int TIME_LIMIT = 60; private void initView() { // 相关控件 mResen ...
- mvc中HttpPost理解
public ActionResult Delete(int id) { Book book = db.Book.Find(id); if (book == null) { //重定向到行动(跳转到i ...
- Row versus Set Processing, Surprise!(集合处理和单行处理数据的差异性)
Row versus Set Processing, Surprise! Craig Shallahamer: 1. Set based processing will likely be much ...
- opcache effect
with open opcache, the monitor cpu idle log , there are so much curl_exec and gzip in our php logic ...
- JVM学习之对象的状态
堆中存放着几乎所有的对象实例,垃圾收集器在堆堆进行回收前,首先要确定这些对象哪些还“活着”,哪些已经“死去”.方法有如下两种: (1)引用计数法 算法思想:为对象添加一个引用计数器,每当有一个地方引用 ...