1.
Drop PROCEDURE IF EXISTS Pro_InsertShopStorage;
CREATE PROCEDURE Pro_InsertShopStorage()
BEGIN
DECLARE cnt int default 0;
declare i int default 0;
drop table if exists tmp;
create TEMPORARY table tmp like waretype;
select count(1) as total from (select count(1) from waretype where 1 GROUP BY TypeID) T into cnt;
WHILE i < cnt DO
set @stmt = concat("select TypeID from waretype GROUP BY TypeID order by TypeID asc LIMIT ", i, ",1 into @t_typeid");
PREPARE s1 from @stmt;
EXECUTE s1;
DEALLOCATE PREPARE s1;
set @stmt = NULL;
set @stmt2 = concat("insert into tmp select Id,TypeID, TypeName from waretype where TypeID = '", @t_typeid, "' order by TypeID asc");
prepare s2 from @stmt2;
EXECUTE s2;
DEALLOCATE PREPARE s2;
set @stmt2 = NULL;
set i = i + 1;
END WHILE;
select * from tmp;
END
call Pro_InsertShopStorage();
2.
Drop PROCEDURE IF EXISTS Pro_InsertShopStorage;
CREATE PROCEDURE Pro_InsertShopStorage()
BEGIN
DECLARE cnt_shop int default 0;
declare cnt_type int default 0;
declare cnt_model int default 0;
declare i_shop int default 0;
declare i_type int default 0;
declare i_model int default 0;
select count(1) as total from (select count(1) from Shop where 1 GROUP BY ShopID) T into cnt_shop;
select count(1) as total from (select count(1) from WareType where 1 group by TypeID) T into cnt_type;
WHILE i_shop < cnt_shop DO
set @stmt = concat("select ShopID from Shop GROUP BY ShopID order by ShopID asc LIMIT ", i_shop, ",1 into @t_shopid");
PREPARE s from @stmt;
EXECUTE s;
DEALLOCATE PREPARE s;
set @stmt = NULL;
while i_type < cnt_type DO
set @stmt1 = concat("select TypeID from WareType group by TypeID order by TypeID asc limit ", i_type, ",1 into @t_typeid");
prepare s1 from @stmt1;
execute s1;
DEALLOCATE prepare s1;
set @stmt1 = NULL;
-- 注释,-- 后面有空格
-- if语句要有end if;
/* if @t_shopid = '001' THEN
select @t_typeid;
end if;
*/
-- 用户变量赋值给变量的方法一
/* set @stmt2 = concat("select count(1) from WareModel where TypeID = '", @t_typeid, "' into @t_model");
prepare s2 from @stmt2;
execute s2;
DEALLOCATE PREPARE s2;
set @stmt2 = NULL;
set cnt_model = @t_model;
*/
-- 用户变量赋值给变量的方法二
/* select count(1) from WareModel where TypeID = @t_typeid into @t_model;
set cnt_model = @t_model;
*/
-- 用户变量赋值给变量的方法三
select count(1) from waremodel where TypeID = @t_typeid into cnt_model;
while i_model < cnt_model DO
set @stmt3 = concat("select ModelID from WareModel where TypeID = '", @t_typeid, "' order by ModelID asc limit ", i_model, ", 1 into @t_modelid");
prepare s3 from @stmt3;
execute s3;
deallocate prepare s3;
set @stmt3 = NULL;
set @stmt4 = concat("insert into shopstorage (ShopID, TypeID, ModelID, StorNumber) values ('", @t_shopid, "','", @t_typeid, "','", @t_modelid, "', '", cast(rand() as char(32)), "')"); -- 最后记得加")",否则提示near ''错误
prepare s4 from @stmt4;
EXECUTE s4;
DEALLOCATE PREPARE s4;
set @stmt4 = NULL;
set i_model = i_model + 1;
end while;
set i_type = i_type + 1;
set cnt_model = 0;
set i_model = 0;
end while;
set i_shop = i_shop + 1;
set i_type = 0;-- 千万千万记得,i_type需要重置(:-……
END WHILE;
END
call Pro_InsertShopStorage();
truncate table shopstorage
select * from shopstorage
3.
Drop procedure if exists Pro_Disp;
create procedure Pro_Disp(in p_TypeID varchar(32), in p_ModelID varchar(32), in p_DispNum int, in p_DispDate varchar(32), in p_DispShop varchar(32))
BEGIN
declare sum int default 0;
declare gap int default 0;
declare every_id int default 0;
declare every_num int default 0;
declare record varchar(64);
set record = '';-- 不能置为NULL,否则后面concat就加不上内容
start TRANSACTION;
while_label:WHILE TRUE DO
set @stmt = concat("select Id, RemainNum from WareStock where TypeID = '", p_TypeID, "' and ModelID = '", p_ModelID, "' and DispState <> 'AllDisp' order by StockDate, Id asc limit 0, 1 into @t_Id, @t_num");
prepare s from @stmt;
execute s;
DEALLOCATE prepare s;
set @stmt = NULL;
set every_id = @t_Id;
set every_num = @t_num;
IF (sum + every_num) = p_DispNum THEN
UPDATE WareStock set RemainNum = 0, DispState = 'AllDisp' where Id = every_id;
set record = concat(record, cast(every_id as char(8)), "|", cast(every_num as char(8)), ",");
leave while_label;
elseif (sum + every_num > p_DispNum) THEN -- elseif 不是 else if
set gap = p_DispNum - sum;
update WareStock set RemainNum = every_num - gap, DispState = 'SomeDisp' where Id = every_id;-- 可以直接用运算
set record = concat(record, cast(every_id as char(8)), "|", cast(gap as char(8)), ",");
leave while_label;
else
update WareStock set RemainNum = 0, DispState = 'AllDisp' where Id = every_id;
set record = concat(record, cast(every_id as char(8)), "|", cast(every_num as char(8)), ",");
set sum = sum + every_num;
end if;
end WHILE;
set @stmt2 = concat("insert into waredispatch (TypeID, ModelID, DispNumber, ShopID, DispDate, SaleState, RemainNum, StockRecord) values ('", p_TypeID, "','", p_ModelID, "',", cast(p_DispNum as char(8)), ",'", p_DispShop, "','", p_DispDate, "','NoSale',", cast(p_DispNum as char(8)), ",'", record, "')");
prepare s2 from @stmt2;
execute s2;
deallocate prepare s2;
set @stmt2 = NULL;
update ShopStorage set StorNumber = StorNumber - p_DispNum where ShopID = '001' and TypeID = p_TypeID and ModelID = p_ModelID;
insert into shopstorage (ShopID, TypeID, ModelID, StorNumber) values (p_DispShop, p_TypeID, p_ModelID, cast(p_DispNum as char(8))) on duplicate key update StorNumber = StorNumber + p_DispNum;
COMMIT;
end
-- call Pro_Disp("001", "001001", 1, "2011-04-19", "002");
4.
drop procedure if exists Pro_RecoverDisp;
create procedure Pro_RecoverDisp(in p_Record varchar(128), in p_Cnt int, in p_DelID int)
BEGIN
declare i int;
declare rec int default 0;
declare ori int default 0;
declare stock int default 0;
declare subRemain varchar(128);
start TRANSACTION;
set i = 0;
set subRemain = p_Record;
while i < p_Cnt DO
set @every_sub = substring_index(SubRemain, ',', 1);
set SubRemain = substring_index(SubRemain, ',', i - p_Cnt);
set @t_id = substring_index(@every_sub, '|', 1);
set @t_rec = substring_index(@every_sub, '|', -1);
set rec = @t_rec;
select RemainNum from warestock where Id = @t_id into @t_ori;
select StockNumber from warestock where Id = @t_id into @t_stock;
set ori = @t_ori;
set stock = @t_stock;
if ori + rec < stock THEN
update warestock set RemainNum = ori + rec, DispState = 'SomeDisp' where Id = @t_id;
elseif ori + rec = stock THEN
update warestock set RemainNum = ori + rec, DispState = 'NoDisp' where Id = @t_id;
end if;
set i = i + 1;
set rec = 0;
set ori = 0;
set stock = 0;
end while;
delete from waredispatch where Id = p_DelID;
commit;
END
-- call Pro_RecoverDisp("4|4,1|3,2|1,", 3, 16);
5.
Drop procedure if exists Pro_Sale;
create procedure Pro_Sale(in p_TypeID varchar(32), in p_ModelID varchar(32), in p_ShopID varchar(32), in p_SaleNum int, in p_SaleDate varchar(32))
BEGIN
declare sum int default 0;
declare gap int default 0;
declare every_id int default 0;
declare every_num int default 0;
declare record varchar(64);
set record = '';-- 不能置为NULL,否则后面concat就加不上内容
start TRANSACTION;
while_label:WHILE TRUE DO
set @stmt = concat("select Id, RemainNum from WareDispatch where TypeID = '", p_TypeID, "' and ModelID = '", p_ModelID, "' and SaleState <> 'AllSale' order by DispDate, Id asc limit 0, 1 into @t_Id, @t_num");
prepare s from @stmt;
execute s;
DEALLOCATE prepare s;
set @stmt = NULL;
set every_id = @t_Id;
set every_num = @t_num;
IF (sum + every_num) = p_SaleNum THEN
UPDATE waredispatch set RemainNum = 0, SaleState = 'AllSale' where Id = every_id;
set record = concat(record, cast(every_id as char(8)), "|", cast(every_num as char(8)), ",");
leave while_label;
elseif (sum + every_num > p_SaleNum) THEN -- elseif 不是 else if
set gap = p_SaleNum - sum;
update waredispatch set RemainNum = every_num - gap, SaleState = 'SomeSale' where Id = every_id;-- 可以直接用运算
set record = concat(record, cast(every_id as char(8)), "|", cast(gap as char(8)), ",");
leave while_label;
else
update waredispatch set RemainNum = 0, DispState = 'AllSale' where Id = every_id;
set record = concat(record, cast(every_id as char(8)), "|", cast(every_num as char(8)), ",");
set sum = sum + every_num;
end if;
end WHILE;
set @stmt2 = concat("insert into WareSale (TypeID, ModelID, ShopID, SaleNumber, SaleDate, DispRecord) values ('", p_TypeID, "','", p_ModelID, "','", p_ShopID, "',", cast(p_SaleNum as char(8)), ",'", p_SaleDate, "','", record, "')");
prepare s2 from @stmt2;
execute s2;
deallocate prepare s2;
set @stmt2 = NULL;
update ShopStorage set StorNumber = StorNumber - p_SaleNum where ShopID = p_ShopID and TypeID = p_TypeID and ModelID = p_ModelID;
COMMIT;
end
-- call Pro_Sale("001", "001001", "002", 5, "2011-04-19");
6.
drop procedure if exists Pro_RecoverSale;
create procedure Pro_RecoverSale(in p_Record varchar(128), in p_Cnt int, in p_DelID int)
BEGIN
declare i int;
declare rec int default 0;
declare ori int default 0;
declare disp int default 0;
declare subRemain varchar(128);
start TRANSACTION;
set i = 0;
set subRemain = p_Record;
while i < p_Cnt DO
set @every_sub = substring_index(SubRemain, ',', 1);
set SubRemain = substring_index(SubRemain, ',', i - p_Cnt);
set @t_id = substring_index(@every_sub, '|', 1);
set @t_rec = substring_index(@every_sub, '|', -1);
set rec = @t_rec;
select RemainNum from waredispatch where Id = @t_id into @t_ori;
select DispNumber from waredispatch where Id = @t_id into @t_disp;
set ori = @t_ori;
set disp = @t_disp;
if ori + rec < disp THEN
update waredispatch set RemainNum = ori + rec, SaleState = 'SomeSale' where Id = @t_id;
elseif ori + rec = disp THEN
update waredispatch set RemainNum = ori + rec, SaleState = 'NoSale' where Id = @t_id;
end if;
set i = i + 1;
set rec = 0;
set ori = 0;
set disp = 0;
end while;
select TypeID, ModelID, ShopID, SaleNumber from waresale where Id = p_DelID into @t_type, @t_model, @t_shop, @t_num;
update ShopStorage set StorNumber = StorNumber + @t_num where ShopID = @t_shop and TypeID = @t_type and ModelID = @t_model;
delete from waresale where Id = p_DelID;
commit;
END
-- call Pro_RecoverSale("1|5,", 1, 1);
7.
DROP PROCEDURE IF EXISTS Pro_InnerNetUser;
CREATE PROCEDURE Pro_InnerNetUser()
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE cntPc INT DEFAULT 0;
DECLARE j INT DEFAULT 0;
DROP TABLE IF EXISTS tmpTable;
CREATE TEMPORARY TABLE tmpTable(pcName char(64));
INSERT INTO tmpTable(pcName) SELECT pcName FROM T_SC_UserManager;
SELECT COUNT(*) FROM tmpTable INTO cntPc;
WHILE i < 100 DO
WHILE j < cntPc DO
SET @stmt = concat("SELECT pcName FROM tmpTable LIMIT ", j, ",1 into @t_pc");
PREPARE s from @stmt;
EXECUTE s;
DEALLOCATE PREPARE s;
SET @stmt = NULL;
SET @stmt1 = concat("INSERT INTO T_Task_NWAQY_User (vTaskName, pcName, IP1, iState, bZiDingYi, isOnline, ndisFreshTime, bStatus, config) VALUES ('", i, "','", @t_pc, "', INET_NTOA(INET_ATON('192.168.1.1') + ", j, "), 1, 0, IF(", j, " > 300, 0, 1), 60, IF(", j, " > 350, 0, 1), CASE WHEN ", j, " >= 0 AND ", j, " < 100 THEN 0 WHEN ", j, " >= 100 AND ", j, " < 200 THEN 1 ELSE 2 END)");
PREPARE s1 FROM @stmt1;
EXECUTE s1;
DEALLOCATE PREPARE s1;
SET @stmt1 = NULL;
SET j = j + 1;
END WHILE;
SET i = i + 1;
SET j = 0;
END WHILE;
SET i = 0;
SET j = 0;
WHILE i < 100 DO
WHILE j < cntPc DO
SET @stmt = concat("SELECT pcName FROM tmpTable LIMIT ", j, ",1 into @t_pc");
PREPARE s from @stmt;
EXECUTE s;
DEALLOCATE PREPARE s;
SET @stmt = NULL;
SET @stmt1 = concat("INSERT INTO T_Task_NWAQY_User (vTaskName, pcName, IP1, iState, bZiDingYi, isOnline, ndisFreshTime, bStatus, config) VALUES ('", i, "','", CONCAT(@t_pc, "_zdy"), "', INET_NTOA(INET_ATON('192.168.1.1') + ", j, "), 1, 1, IF(", j, " > 300, 0, 1), 60, IF(", j, " > 350, 0, 1), CASE WHEN ", j, " >= 0 AND ", j, " < 100 THEN 0 WHEN ", j, " >= 100 AND ", j, " < 200 THEN 1 ELSE 2 END)");
PREPARE s1 FROM @stmt1;
EXECUTE s1;
DEALLOCATE PREPARE s1;
SET @stmt1 = NULL;
SET j = j + 1;
END WHILE;
SET i = i + 1;
SET j = 0;
END WHILE;
END;
CALL Pro_InnerNetUser();