mysql存储过程和游标以及if-else,while典型实例

-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE DEFINER=`root`@`%` PROCEDURE `P_ReleaseIp`(
In reip varchar(20),
in remac varchar(20),
in ipmode varchar(20),
out out_result int)
BEGIN
#释放的IP
DECLARE t_error INTEGER DEFAULT 0;
    declare t_pid INTEGER DEFAULT 0;
    DECLARE vlannum INTEGER;
    declare m_switch varchar(20);
    declare m_port varchar(20);

    declare cur_release CURSOR for
    select Switch,`Port` from VlanBindDefaultSwtich
    where VlanId=(select ResourceId from AllResourceIpInfo where IpValue=funGetIPValue(reip));

    declare zw_switchport CURSOR for
    SELECT switch,`port` FROM IpManage_v2.StaticIpMacBindInfo
    where ip= reip and mac=remac;

    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET t_pid = 1;
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1;

    select VlanNumber into vlannum from VlanInfo where funGetIPValue(reip) BETWEEN StartIpValue and EndIpValue;
    START TRANSACTION;
    if ipmode='禁用' THEN
          delete from IpDisabledInfo where IpValue=funGetIPValue(reip);
          DELETE from StaticIpMacBindInfo where Ip=reip and Mac='10:00:00:00:00:01';
        /*DELETE from Ipswitcher where Ip=reip;*/
        update AllResourceIpInfo set State=1 where IpValue=funGetIPValue(reip) and State=2;   
        open cur_release;
            FETCH cur_release into m_switch,m_port;
            while t_pid<>1 AND t_error<>1 DO
                insert into StaticIpMacBindTaskInfo(Ip,Mac,Switch,Type,Port,Vlan,VpnInst,CreateTime)
                values(reip,'10:00:00:00:00:01',m_switch,'unbind',m_port,vlannum,0,DATE_FORMAT(NOW(),'%Y-%m-%d %T'));
            FETCH cur_release into m_switch,m_port;
            end while;
            close cur_release;
    elseif ipmode='保护' then
        delete from IpProtectedInfo where Ip=reip;
        DELETE from IpProtectedMacList where Ip=reip and Mac=remac;
        update AllResourceIpInfo set State=1 where IpValue=funGetIPValue(reip) and State=3;
    elseif ipmode='绑定' THEN       

        delete from IpBindedInfo where Ip=reip and Mac=remac;
        delete from StaticIpMacBindInfo where Ip=reip and Mac=remac;       
        update AllResourceIpInfo set State=1 where IpValue=funGetIPValue(reip) and State=4;
        open zw_switchport;
            FETCH zw_switchport into m_switch,m_port;
            while t_pid<>1 AND t_error<>1 DO
                insert into StaticIpMacBindTaskInfo(Ip,Mac,Switch,Type,Port,Vlan,CreateTime)
                values(reip,remac,m_switch,'unbind',m_port,vlannum,DATE_FORMAT(NOW(),'%Y-%m-%d %T'));
            FETCH zw_switchport into m_switch,m_port;
            end while;
        close zw_switchport;
    end if;
    if t_error=1 THEN   
        ROLLBACK;set out_result=0;
    ELSE
        COMMIT;set out_result=1;
    end if;
END

posted @   Seaurl  阅读(574)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示