mysql 存储过程学习


mysql存储过程详解参考这个文章

转:http://blog.csdn.net/dengsilinming/article/details/8484880

看了解释的挺详细的 就自己写了几个 

下面是我自己写的


DROP TABLE IF EXISTS `points_balance`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `points_balance` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) unsigned NOT NULL COMMENT '用户id',
  `total` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '用户总的积分',
  `remaining` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '余额',
  `created_time` int(10) unsigned NOT NULL COMMENT '创建时间',
  `update_time` int(10) unsigned NOT NULL COMMENT '上次修改时间',
  `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '用户状态:1:被冻结0:正常',
  PRIMARY KEY (`id`),
  UNIQUE KEY `user_id` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COMMENT='账户情况';
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Table structure for table `points_consume`
--

DROP TABLE IF EXISTS `points_consume`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `points_consume` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) unsigned NOT NULL COMMENT '用户id',
  `points` int(10) unsigned NOT NULL COMMENT '积分',
  `description` text CHARACTER SET utf8 NOT NULL COMMENT '积分用途说明',
  `product_id` int(10) unsigned NOT NULL COMMENT '游戏产品id',
  `mark` varchar(10) CHARACTER SET utf8 NOT NULL COMMENT '标识 活动',
  `created_time` int(10) unsigned NOT NULL,
  `status` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=ucs2 COMMENT='积分消耗明细';
/*!40101 SET character_set_client = @saved_cs_client */;

DROP TABLE IF EXISTS `points_obtain`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `points_obtain` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) unsigned NOT NULL COMMENT '用户id',
  `points` int(10) unsigned NOT NULL COMMENT '积分',
  `description` text CHARACTER SET utf8 NOT NULL COMMENT '积分用途说明',
  `product_id` int(10) unsigned NOT NULL COMMENT '游戏产品id',
  `mark` varchar(10) CHARACTER SET utf8 NOT NULL COMMENT '标识 活动',
  `created_time` int(10) unsigned NOT NULL,
  `status` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=44 DEFAULT CHARSET=ucs2 COMMENT='积分获取明细';
/*!40101 SET character_set_client = @saved_cs_client */;



/**用户积分增加存储过程*/
/**
--userId 用户id
--point  积分
--remark 积分说明
--status 状态
*/
DELIMITER //
CREATE PROCEDURE addpoint(IN userId int,IN point int,IN remark varchar(255),OUT status int)
BEGIN
DECLARE oldUserId int default 0; -- 是否存在这个用户
insert into points_obtain(`user_id`,`points`,`description`,`created_time`) values(userId,point,remark,UNIX_TIMESTAMP(now()));
select user_id into oldUserId  from points_balance where user_id = userId limit 1;
if oldUserId = 0 then
    insert into points_balance(user_id,created_time) values(userId,unix_timestamp(now()));
end if;
update points_balance set total = total+point , remaining = remaining+point,update_time=unix_timestamp(now()) where user_id = userId;
select row_count() into status; --ROW_COUNT()返回被前面语句升级的、插入的或删除的行数
end;
//
DELIMITER ;

set @status = 0;
CALL addpoint(123456,100,'add point',@status);
select @status;

/**
积分增减存储过程
--userId 用户id
--point  积分
--类型 ptype 1增加 2减少
--remark 积分说明
--status 状态
*/
DELIMITER //
CREATE PROCEDURE pointchange(IN userId int, IN point int, IN ptype int, IN remark varchar(255),OUT status int)
BEGIN
DECLARE oldUserId int default 0; -- 是否存在这个用户
select user_id into oldUserId  from points_balance where user_id = userId limit 1;
if oldUserId = 0 then
    insert into points_balance(user_id,created_time) values(userId,unix_timestamp(now()));
end if;
case ptype
when 1 then
    insert into points_obtain(`user_id`,`points`,`description`,`created_time`) values(userId,point,remark,UNIX_TIMESTAMP(now()));
    update points_balance set total = total+point , remaining = remaining+point,update_time=unix_timestamp(now()) where user_id = userId;
    select row_count() into status;
when 2 then
    insert into points_consume(`user_id`,`points`,`description`,`created_time`) values(userId,point,remark,UNIX_TIMESTAMP(now()));
    update points_balance set remaining = remaining-point,update_time=unix_timestamp(now()) where user_id = userId;
    select row_count() into status;
end case;
end;
//
DELIMITER ;

CALL pointchange(123456,100,1,'consume point',@status);
CALL pointchange(123456,100,2,'consume point',@status);

这个是参考这篇文章的作者 自己又写了一遍

/**查询一个表的数量的存储过程*/
DELIMITER //
CREATE PROCEDURE count_table_num(OUT num int)
BEGIN
SELECT count(1) INTO num from tmp;
END;
//
DELIMITER ;

set @tbl_count=0;
CALL count_table_num(@tbl_count);
SELECT @tbl_count;

/**生成订单编号的存储过程*/
CREATE TABLE `test_orders` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `orderNo` varchar(25) NOT NULL DEFAULT '',
  `orderName` char(10) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=76 DEFAULT CHARSET=utf8

DELIMITER //
CREATE PROCEDURE getorderno(IN orderNamePre char(2),IN num int, OUT newOrderNo varchar(32))
BEGIN
DECLARE currentDate varchar (15);   -- 当前日期,有可能包含时分秒
DECLARE maxNo int DEFAULT 0;     -- 离现在最近的满足条件的订单编号的流水号最后5位,如:SH2013011000002的maxNo=2
DECLARE oldOrderNo varchar(32) DEFAULT ''; -- 离现在最近的满足条件的订单编号

if num = 8 then
    select DATE_FORMAT(NOW(),"%Y%m%d") INTO currentDate;    -- 订单编号形式:前缀+年月日+流水号,如:SH2013011000002
elseif num = 12 then
    select date_format(now(),"%Y%m%d%H%i%s") into currentDate;
else
    select DATE_FORMAT(NOW(),"%Y%m%d%H%i") into currentDate;
end if;

-- 有多条时只显示离现在最近的一条
SELECT IFNULL(orderNo,'') INTO oldOrderNo From test_orders where SUBSTRING(orderNo,3,num) = currentDate and SUBSTRING(orderNo,1,2) = orderNamePre and length(orderNo) = 7+num order by id desc limit 1;
IF oldOrderNo != '' THEN
    SET maxNo = CONVERT(SUBSTRING(oldOrderNo,-5),DECIMAL);  -- SUBSTRING(oldOrderNo, -5):订单编号如果不为‘‘截取订单的最后5
END IF;
SELECT CONCAT(orderNamePre,currentDate,LPAD((maxNo+1),5,'0')) INTO newOrderNo;  -- LPAD((maxNo + 1), 5, '0'):如果不足5位,将用0填充左边
insert into test_orders(orderNo,orderName) values (newOrderNo,'testNo'); -- 向订单表中插入数据
select newOrderNo;
end;
//
DELIMITER ;

set @orderNo='';
CALL getorderno('SB',12,@orderNo);
select @orderNo;


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值