💻博主现有专栏:
C51单片机(STC89C516),c语言,c++,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux,基于HTML5的网页设计及应用,Rust(官方文档重点总结),jQuery,前端vue.js,Javaweb开发,设计模式、Python机器学习等
🥏主页链接:Y小夜-CSDN博客
目录
🎯把字符串'1,1,2,2,3,3,4,1,'还原为表,写出存储过程
🎯实现销售过程的存储过程
🎯把字符串'1,1,2,2,3,3,4,1,'还原为表,写出存储过程
(注意该字符串两个数字为一组,前者代表gid(货品id),后者代表xssl(销售数量))
DELIMITER $$ USE `xiaoshou`$$ DROP PROCEDURE IF EXISTS `xsjlcp`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `xsjlcp`(xsmx VARCHAR(1000)) BEGIN DROP TABLE IF EXISTS lsb; CREATE TEMPORARY TABLE lsb (gid INT,xssl NUMERIC(18,3)); WHILE(xsmx<>'') DO SET @k=POSITION(',' IN xsmx); SET @gid=LEFT(xsmx,@k-1); SET xsmx=SUBSTR(xsmx,@k+1); SET @k=POSITION(',' IN xsmx); SET @xssl=LEFT(xsmx,@k-1); SELECT @xssl; INSERT INTO lsb VALUES(@gid,@xssl); SET xsmx=SUBSTR(xsmx,@k+1); END WHILE; SELECT *FROM lsb; SELECT barcode,gname,unit,retail_Price promotional_Price,xssl,xssl*promotional_Price AS 金额 FROM goods,lsb WHERE goods.`gid`=lsb.gid; END$$ DELIMITER ;
这是一个MySQL存储过程,名为
xsjlcp
,接受一个参数xsmx
,该参数是一个包含多个逗号分隔的字符串。存储过程的主要功能是创建一个临时表lsb
,将xsmx
中的每个逗号分隔的值插入到lsb
表中,然后从goods
表中查询与lsb
表中的gid
匹配的商品信息,并计算金额。以下是存储过程的解析:
- 删除已存在的
lsb
表(如果存在)。- 创建一个临时表
lsb
,包含两个字段:gid
(整数类型)和xssl
(数值类型,保留3位小数)。- 使用
WHILE
循环处理xsmx
中的每个逗号分隔的值。- 在每次循环中,将
xsmx
中的前两个逗号分隔的值分别赋给变量@gid
和@xssl
。- 将
@gid
和@xssl
插入到lsb
表中。- 更新
xsmx
,去掉已经处理过的部分。- 当
xsmx
为空时,结束循环。- 查询
lsb
表中的所有数据。- 查询
goods
表和lsb
表的连接结果,包括商品条形码、商品名称、单位、零售价、促销价、销售数量和金额(销售数量乘以促销价)。
🎯实现销售过程的存储过程
DELIMITER $$ CREATE PROCEDURE `xiaoshou`.`XSjlcp_new`(cashierid INT,uid INT,payment TINYINT,xsmx VARCHAR(8000)) BEGIN DROP TABLE IF EXISTS lsb; CREATE TEMPORARY TABLE lsb(gid INT,xssl NUMERIC(18,3)); WHILE(xsmx<>'') DO SET @k=POSITION(',' IN xsmx); SET @gid = LEFT(xsmx,@k-1); SET xsmx=SUBSTR(xsmx,@k+1); SET @k=POSITION(',' IN xsmx); SET @xssl = LEFT(xsmx,@k-1); INSERT INTO lsb VALUES(@gid,@xssl); SET xsmx = SUBSTR(xsmx,@k+1); END WHILE; SELECT SUM(xssl*retail_Price) INTO @amount_money FROM goods,lsb WHERE goods.gid=lsb.gid; SELECT SUM(xssl*promotional_Price) INTO @actual_money FROM goods,lsb WHERE goods.gid=lsb.gid; SET @discount_money=@amount_money-@actual_money; /*插入收银记录表*/ INSERT INTO `cashaccount`(cashierid,uid,payment,amount_money,actual_money,discount_money) VALUES(cashierid,uid,payment,@amount_money,@actual_money,@discount_money); /*销售明细表*/ INSERT INTO `cashaccount_detail`(cashaccountid,gid,salesquantity,retailprice,promotionalprice) SELECT @@identity,lsb.gid,xssl,retail_Price,promotional_Price FROM lsb,goods WHERE lsb.gid = goods.`gid`; /*货物库存表*/ DROP TABLE IF EXISTS lsb1; CREATE TEMPORARY TABLE lsb1(gid INT,xssl NUMERIC(18,3)); INSERT INTO lsb1(gid,xssl) SELECT gid,SUM(xssl) FROM lsb GROUP BY gid; UPDATE stock b1,lsb1 b2 SET b1.quantity=b1.quantity-b2.xssl WHERE b1.gid = b2.gid; /*用户表*/ IF uid>=10000 THEN UPDATE `user` SET card_balance = card_balance-@actual_money,points = points+FLOOR(@actual_money) WHERE `user`.uid = uid; END IF; END$$ DELIMITER ;
这是一个MySQL存储过程,名为`XSjlcp_new`,用于处理销售记录。它接收四个参数:收银员ID(cashierid)、用户ID(uid)、支付方式(payment)和销售明细(xsmx)。
1. 首先,它创建一个临时表lsb,用于存储商品ID(gid)和销售数量(xssl)。
2. 然后,它遍历销售明细(xsmx),将商品ID和销售数量插入到lsb表中。
3. 接下来,它计算总金额(@amount_money)和实际金额(@actual_money),并计算折扣金额(@discount_money)。
4. 将收银记录插入到`cashaccount`表中。
5. 将销售明细插入到`cashaccount_detail`表中。
6. 更新库存表中的商品数量。
7. 如果用户ID大于等于10000,更新用户的卡余额和积分。