MySQL 存储过程例子

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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值