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 网上商城首页都有热门商品,那么这些商品的点击率是很高的,当用户点击某个热门商品后需要 ...
随机推荐
- C# 中奇妙的函数–7. String Split 和 Join
很多时候处理字符串数据,比如从文件中读取或者存入 - 我们可能需要加入分隔符(如CSV文件中的逗号),或使用一个分隔符来合并字符串序列. 很多人都知道使用split()的方法,但使用与其对应的Join ...
- OAuthBase.cs
using System; using System.Security.Cryptography; using System.Collections.Generic; using System.Tex ...
- CSS3 简易照片墙
代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title& ...
- C#.net连接SQLite及遇到的问题
1.Slite简介 SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需 ...
- C#的Split用法
1.用字符串分隔: using System.Text.RegularExpressions;string str="aaajsbbbjsccc";string[] sArray= ...
- Android快速开发不可或缺的11个工具类
Android快速开发不可或缺的11个工具类 :http://www.devst ore.cn/code/info/363.html
- 蓝桥杯算法训练<二>
一.最小乘积(基本型)[这个题需要认真阅读试题,内容量较大,刚开始的时候,由于练习系统上给出的输入输出的格式有问题,没看懂,最后在MikCu的博客上看到了正确的格式,参考了代码,最终得到正确的结果.为 ...
- 初识-Android之智能短信项目相关技术整理
标签页切换采用传统的TabHost: 采用TabActivty实现TabHost. 效果图-后补: 相关技术详解推荐: http://blog.csdn.net/zhouli_05/article/d ...
- 1、 Linux中的root用户切换(转载)
su和su - 的区别 大部分Linux发行版的默认账户是普通用户,而更改系统文件或者执行某些命令,需要root身份才能进行,这就需要从当前用户切换到root用户,Linux中切换用户的命令是su或s ...
- leetcode Same Tree python
# Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = ...