ITPUB论坛-中国最专业的IT技术社区

 找回密码
 注册
查看: 2643|回复: 11

培训题,求指点或分享~~~

[复制链接]
论坛徽章:
3
目光如炬
日期:2017-01-08 22:00:00火眼金睛
日期:2017-02-06 01:02:33火眼金睛
日期:2017-02-28 22:00:00
发表于 2017-1-1 22:42 | 显示全部楼层 |阅读模式
本人dba初学plsql,此题出自网络培训班(做了老师又没批改,只好请教大家啦)。帮忙看一下我的代码1.是否有瑕疵或不规范等等(此代码能运行)2.希望大家分享下如果是自己写自己的代码
题目:
假如现在要做一个线上订购系统,这个系统首先有一个用户模块,所以我们要设计这个模块,首先要设计一张用户表存放用户信息要求记录用户的用户名,密码,证件号,真实姓名,性别,生日,手机号,地址,email地址,积分,激活状态等,其它信息可各自补充
1. 请大家设计这个用户表
2.假如现在系统已经完成,网站要做一个贴心活动,对于注册且激活了且生日即将到达的用户(生日前五天),
我们根据其注册时间的长短,送积分,积分数=注册时间月数*100,请大家用PLSQL实现这个功能


答案:
作业1:
创建user表:
create table users (userid varchar2(100),passwd varchar2(100),id varchar2(18),name varchar2(10),sex char(1),phone number(11),locate varchar2(100),email varchar2(100),ctime date default sysdate,brith date,credits number default 0,valid char(1) default 0);

作业2:
由于方便,所以重新创建表x:
create table x (ctime date default sysdate,brith date,credits number default 0,valid char(1) default 0);

代码实现:
<<outer>>
declare
  v_x x%rowtype;
  v_id varchar2(10):=1;--此处定义一个复制变量,用来确定某一用户是否满足该活动要求
  v_sub number;        --定义一个变量用于计算“生日时间mmdd减现在时间mmdd差值”判断是否满足该用户是否快到生日
  v_now varchar2(10);  --此处定义一个变量记录现在的时间,用于计算“生日即将到”事件
begin
  select * into v_x from x where id = v_id;
  if v_x.valid = 1
  then
    select to_char(sysdate,'mmdd') into v_now from dual;
    v_sub:=to_char(v_x.brith,'mmdd')-v_now;
    if v_sub < 5 and v_sub >= 0
      then
        <<inner>>
        declare
        v_ntime date:=to_date(sysdate); --此处再定义一个变量记录现在时间,用于计算“注册事件月数”事件
        v_submon number;
        begin
          v_submon:=trunc(months_between(v_ntime,v_x.ctime));--使用函数trunc计算注册月数
          --dbms_output.put_line(v_submon);
          v_x.credits:=v_submon*100;
          update x set credits = v_x.credits where id = outer.v_id;
          dbms_output.put_line('credits recharged successed,now values:'||v_x.credits);
        end;
    else
      dbms_output.put_line('credits recharged faied');
    end if;
      commit;
  else
    dbms_output.put_line('user is not valied');
  end if;
end;



论坛徽章:
3
目光如炬
日期:2017-01-08 22:00:00火眼金睛
日期:2017-02-06 01:02:33火眼金睛
日期:2017-02-28 22:00:00
 楼主| 发表于 2017-1-2 00:23 | 显示全部楼层
自己顶一个
来自安卓客户端来自客户端

使用道具 举报

回复
认证徽章
论坛徽章:
166
SQL数据库编程大师
日期:2016-01-13 10:30:43SQL极客
日期:2013-12-09 14:13:35SQL大赛参与纪念
日期:2013-12-06 14:03:45最佳人气徽章
日期:2015-03-19 09:44:03现任管理团队成员
日期:2015-08-26 02:10:00秀才
日期:2015-07-28 09:12:12举人
日期:2015-07-13 15:30:15进士
日期:2015-07-28 09:12:58探花
日期:2015-07-28 09:12:58榜眼
日期:2015-08-18 09:48:03
发表于 2017-1-3 12:18 | 显示全部楼层
小网站,注册用户少怎么玩都行,真正数据量大以后,我觉得可以按生日1-365给客户表分区,然后在里面建分区索引开干,每天就去找对应5天前的那个分区表,在里面捣鼓一番。

使用道具 举报

回复
论坛徽章:
452
秀才
日期:2015-08-18 09:49:27举人
日期:2015-09-09 10:34:21秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01状元
日期:2015-09-09 10:34:21榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01
发表于 2017-1-4 02:59 | 显示全部楼层
一个UPDATE就搞定的东西,要写这么一大堆?

核心错误:
v_sub:=to_char(v_x.brith,'mmdd')-v_now;
    if v_sub < 5 and v_sub >= 0
跨月你怎么算?

表名X也莫名奇妙,要起有意义的名字。看不出这个表有什么用。

没有防止重复运行的功能,也就是说同一个人积分可以加很多次。

使用道具 举报

回复
招聘 : 数据库管理员
认证徽章
论坛徽章:
98
技术图书徽章
日期:2014-03-27 09:30:56股神
日期:2017-01-09 16:05:54
发表于 2017-1-4 14:35 | 显示全部楼层
为什么不分开这个表的信息?
login ,和 user  俩表

使用道具 举报

回复
论坛徽章:
1
娜美
日期:2017-03-07 10:57:36
发表于 2017-1-4 16:06 | 显示全部楼层
update x set credits:=credits+mod(sysdate-createdtime,365)*100 where mod(to_number((sysdate - createdtime),365) <=5
4楼说的我测试了一下,只要月份不同,就不准确了。

使用道具 举报

回复
论坛徽章:
391
宝马
日期:2013-11-22 20:41:54马上加薪
日期:2014-02-19 11:55:14马上有钱
日期:2014-03-11 11:59:122014年世界杯参赛球队:喀麦隆
日期:2014-07-11 12:10:53马上有对象
日期:2014-04-09 16:19:542014年世界杯参赛球队: 洪都拉斯
日期:2014-06-25 08:25:55itpub13周年纪念徽章
日期:2014-09-28 10:55:55itpub13周年纪念徽章
日期:2014-10-01 15:27:22itpub13周年纪念徽章
日期:2014-10-09 12:04:18马上有钱
日期:2014-10-14 21:37:37
发表于 2017-1-4 19:48 | 显示全部楼层
微笑谊容 发表于 2017-1-4 16:06
update x set credits:=credits+mod(sysdate-createdtime,365)*100 where mod(to_number((sysdate - create ...

如果你觉得4楼错了,一般是你先错了

使用道具 举报

回复
论坛徽章:
3
目光如炬
日期:2017-01-08 22:00:00火眼金睛
日期:2017-02-06 01:02:33火眼金睛
日期:2017-02-28 22:00:00
 楼主| 发表于 2017-1-4 20:44 | 显示全部楼层
newkid 发表于 2017-1-4 02:59
一个UPDATE就搞定的东西,要写这么一大堆?

核心错误:

1.夸月是没问题的。夸年我这个有问题,比如生日在2017/1/1而现在为2016/12/30
2.我能想到的update就是一个一个找然后更新....,请你给出update解决办法
3.x名字不用过于纠结,这只是我培训是老师出的一道题 不用于生产

使用道具 举报

回复
论坛徽章:
452
秀才
日期:2015-08-18 09:49:27举人
日期:2015-09-09 10:34:21秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01状元
日期:2015-09-09 10:34:21榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01
发表于 2017-1-4 23:13 | 显示全部楼层
2月1号和1月31号差几天? 0201-0131等于几?
到目前为止需求还不明确,你的代码UPDATE的是X表,还用了ID列,但是你的X表并没有ID列,所以不知道你的目的是要改哪个。
学习就要培养好习惯,不要因为是练习就可以乱写。表名要取有意义的让人一看就知道大概是做什么用的。

使用道具 举报

回复
认证徽章
论坛徽章:
7
秀才
日期:2015-11-23 10:00:44双子座
日期:2015-11-26 09:43:00秀才
日期:2016-01-06 14:01:09秀才
日期:2016-01-06 14:06:43SQL大赛参与纪念
日期:2016-01-13 10:32:19秀才
日期:2016-01-22 17:57:47秀才
日期:2016-08-05 10:28:31
发表于 2017-1-5 09:24 | 显示全部楼层
链数马总第1课的作业,当时老师分享的一个哥们的作业,用的逆向思维,代码简单,没有跨年跨越的问题

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京皓辰网域网络信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表