说明:是想做一个存储过程,当在调用时传一个用户名进去,然后在存储过程时进行处理,返回结果为1或0,
存储过程要操作的:1、首先通才传入的用户名进行判断,此用户是否到期,如要到期,直接返回为0,
2、当用户没有到期,再往下判断此用户是否在线,如果在线,返回为0,
3,当用记没有在线时,接下判断用户是否绑定为(bind_mac,此字段为1为绑定,0 为不绑定,)
当 bind_mac=0时表示不绑定,返回为1,
当 bind_mac=1时表示绑定,在判断两个MAC 地址是否相迥,如果果相,返回为1,不同则返回为0

这下面的是我做了一点的,希望老大些能给点指示的delimiter //
create procedure online_is(in username varchar(128),out returnNum int)
begin   /*这是判断是否到期*/
select count(*) into num from radcheck where UserName=username and Attribute='baduser' and Value=1;
if num>0 then
set returnNum=1;
else 
/*当没有到期时查询是否在线*/
select count(*) into num from radacct where UserName=username and AcctStopTime='0000-00-00 00:00:00';
if num>0 then
set returnNum=0; /*表示在线*/
else
/*当没有在线时判断是否绑定MAC地址*/
select bind_mac,MAC,UserName from userinfo where UserName=username;


end if; /*是否在线结束*/
end if;/*是否到期结束*/

end //

解决方案 »

  1.   

    先帮你改了这么多,看上去逻辑还是有问题,但没有你的测试数据,无法进一步帮你。delimiter //
    create procedure online_is(in v_username varchar(128),out returnNum int)   -- ACMAIN: 变量名不要和字段名重复。v_username
    begin 
    declare num int default 0; -- ACMAIN: 声明你的变量

    /*这是判断是否到期*/
    select count(*) into num from radcheck where UserName=v_username and Attribute='baduser' and Value=1;
    if num>0 then
    set returnNum=1;
    else 
    /*当没有到期时查询是否在线*/
    select count(*) into num from radacct where UserName=v_username and AcctStopTime='0000-00-00 00:00:00';
    if num>0 then
    set returnNum=0; /*表示在线*/
    else
    /*当没有在线时判断是否绑定MAC地址*/
    select bind_mac,MAC,UserName from userinfo where UserName=v_username;
    end if; /*是否在线结束*/
    end if;/*是否到期结束*/

    end //
      

  2.   

    建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
       
       1. 你的 create table xxx .. 语句
       2. 你的 insert into xxx ... 语句
       3. 结果是什么样,(并给以简单的算法描述)
       4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
       
       这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。   
      

  3.   

    delimiter // 
    create procedure online_is(in username varchar(128),out returnNum int) 
    begin
    /*这是判断是否到期*/
    if exists(select 1 from radcheck where UserName=username and Attribute='baduser' and Value=1)
       set returnNum=1;
    else
     /*当没有到期时查询是否在线*/
       if exists(select 1 from radacct where UserName=username and AcctStopTime='0000-00-00 00:00:00')
          set retrunNum=0; /*表示在线*/
       else
          /*当没有在线时判断是否绑定MAC地址*/
          if exists(select 1 from userinfo where UserName=username and bind_mac=0)
             set retrunNum=1; /*当 bind_mac=0时表示不绑定,返回为1*/
          end if;
       end if;
    end if;
    end //
    delimiter ;
      

  4.   

    说明:是想做一个存储过程,当在调用时传一个用户名进去,然后在存储过程时进行处理,返回结果为1或0,
    存储过程要操作的:1、首先通才传入的用户名进行判断,此用户是否到期,如要到期,直接返回为0,
    2、当用户没有到期,再往下判断此用户是否在线,如果在线,返回为0,
    3,当用记没有在线时,接下判断用户是否绑定为(bind_mac,此字段为1为绑定,0 为不绑定,)
    当 bind_mac=0时表示不绑定,返回为1,
    当 bind_mac=1时表示绑定,在判断两个MAC 地址是否相迥,如果果相,返回为1,不同则返回为0

    delimiter //
    create procedure online_is(in username varchar(128),out returnNum int)
    begin   /*这是判断是否到期*/
    select count(*) into num from radcheck where UserName=username and Attribute='baduser' and Value=1;
    if num>0 then
    set returnNum=1;
    else 
    /*当没有到期时查询是否在线*/
    select count(*) into num from radacct where UserName=username and AcctStopTime='0000-00-00 00:00:00';
    if num>0 then
    set returnNum=0; /*表示在线*/
    else
    /*当没有在线时判断是否绑定MAC地址*/
    select bind_mac,MAC,UserName from userinfo where UserName=username;


    end if; /*是否在线结束*/
    end if;/*是否到期结束*/

    end //
    --
    -- 表的结构 `radcheck`
    --CREATE TABLE IF NOT EXISTS `radcheck` (
      `id` int(11) unsigned NOT NULL auto_increment,
      `UserName` varchar(64) NOT NULL default '',
      `Attribute` varchar(32) NOT NULL default '',
      `op` char(2) NOT NULL default '==',
      `Value` varchar(253) NOT NULL default '',
      PRIMARY KEY  (`id`),
      KEY `UserName` (`UserName`(32))
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=26 ;--
    -- 转存表中的数据 `radcheck`
    --INSERT INTO `radcheck` (`id`, `UserName`, `Attribute`, `op`, `Value`) VALUES
    (14, '111', 'User-Password', ':=', '111');-- ----------------------------------------------------------
    -- 表的结构 `radacct`
    --CREATE TABLE IF NOT EXISTS `radacct` (
      `RadAcctId` bigint(21) NOT NULL auto_increment,
      `AcctSessionId` varchar(32) NOT NULL default '',
      `AcctUniqueId` varchar(32) NOT NULL default '',
      `UserName` varchar(64) NOT NULL default '',
      `Realm` varchar(64) default '',
      `NASIPAddress` varchar(15) NOT NULL default '',
      `NASPortId` varchar(15) default NULL,
      `NASPortType` varchar(32) default NULL,
      `AcctStartTime` datetime NOT NULL default '0000-00-00 00:00:00',
      `AcctStopTime` datetime NOT NULL,
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;--
    -- 转存表中的数据 `radacct`
    --INSERT INTO `radacct` (`RadAcctId`, `AcctSessionId`, `AcctUniqueId`, `UserName`, `Realm`, `NASIPAddress`, `NASPortId`, `NASPortType`, `AcctStartTime`, `AcctStopTime`, `AcctSessionTime`, `AcctAuthentic`, `ConnectInfo_start`, `ConnectInfo_stop`, `AcctInputOctets`, `AcctOutputOctets`, `CalledStationId`, `CallingStationId`, `AcctTerminateCause`, `ServiceType`, `FramedProtocol`, `FramedIPAddress`, `AcctStartDelay`, `AcctStopDelay`, `XAscendSessionSvrKey`) VALUES
    (1, '', '', '111', '', '', NULL, NULL, '2009-12-16 17:25:52', '0000-00-00 00:00:00');用户表:--
    -- 表的结构 `userinfo`
    --CREATE TABLE IF NOT EXISTS `userinfo` (
      `id` int(10) NOT NULL auto_increment,
      `UserName` varchar(30) default NULL,
      `Name` varchar(200) default NULL,
      `Mail` varchar(200) default NULL,
      `Department` varchar(200) default NULL,
      `WorkPhone` varchar(200) default NULL,
      `HomePhone` varchar(200) default NULL,
      `Mobile` varchar(200) default NULL,
      `RegisteDate` date default NULL,
      `Manager` char(200) default NULL,
      `Installer` char(200) default NULL,
      `StartDate` date default NULL,
      `EndDate` date default NULL,
      `Address` char(200) default NULL,
      `IDNumber` char(200) default NULL,
      `StopDate` date default '0000-00-00',
      `MAC` varchar(50) default '',
      `bind_mac` int(10) unsigned default '0',
      `Status` int(2) unsigned NOT NULL default '0',
      `Notice` int(8) unsigned default '0',
      PRIMARY KEY  (`id`),
      KEY `UserName` (`UserName`),
      KEY `Departmet` (`Department`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=27 ;--
    -- 转存表中的数据 `userinfo`
    --INSERT INTO `userinfo` (`id`, `UserName`, `Name`, `Mail`, `Department`, `WorkPhone`, `HomePhone`, `Mobile`, `RegisteDate`, `Manager`, `Installer`, `StartDate`, `EndDate`, `Address`, `IDNumber`, `StopDate`, `MAC`, `bind_mac`, `Status`, `Notice`) VALUES
    (15, '111', '2', '2', NULL, NULL, '2', '2', '2009-11-27', '2', '2', '0000-00-00', '2010-12-24', '2', '2', '0000-00-00', '', 0, 1, 0);
      

  5.   

    delimiter //
    create procedure u(in v_username varchar(128),out returnNum int)  
    begin  select UserName,MAC,bind_mac from userinfo where UserName=v_username;
    /*现在我要要在这里得到 MAC值怎么得到呀,我通过查询语句查出结果,*/  问题:我在这里如果调用mac的值呢?
    end;
      

  6.   

    declare v_MAC varchar(100);
    select UserName,MAC into v_MAX,bind_mac from userinfo where UserName=v_username;
      

  7.   

    delimiter //
    create procedure u(in v_username varchar(128),out returnNum int)  
    begin 
    declare macNum int default 0;  
    declare macStr varchar(128) default '';  
    if exists(select * from radcheck where UserName=v_username and Attribute='baduser') then 
    set returnNum=0;
    else
    if exists(select * from radacct where UserName=v_username and AcctStopTime='0000-00-00 00:00:00') then 
    set returnNum=0;
    else
    set returnNum=1;
    end if;
    end if;
    end;
    //这个逻辑有什么样的问题呢,是 if- then- end if; 的原因吗?为什么在 if里面不能再 用 if来判断呢 
      

  8.   

    提供你的表的create table 语句和测试用数据,然后再描述一下你想实现的功能。建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
       
       1. 你的 create table xxx .. 语句
       2. 你的 insert into xxx ... 语句
       3. 结果是什么样,(并给以简单的算法描述)
       4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
       
       这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。   
      

  9.   

    说明:是想做一个存储过程,当在调用时传一个用户名进去,然后在存储过程时进行处理,返回结果为1或0, 
    存储过程要操作的:1、首先通才传入的用户名进行判断,此用户是否到期,如要到期,直接返回为0, 
    2、当用户没有到期,再往下判断此用户是否在线,如果在线,返回为0, 
    3,当用记没有在线时,接下判断用户是否绑定为(bind_mac,此字段为1为绑定,0 为不绑定,) 
    当 bind_mac=0时表示不绑定,返回为1, 
    当 bind_mac=1时表示绑定,在判断两个MAC 地址是否相迥,如果果相,返回为1,不同则返回为0 delimiter // 
    create procedure online_is(in username varchar(128),out returnNum int) 
    begin /*这是判断是否到期*/ 
    select count(*) into num from radcheck where UserName=username and Attribute='baduser' and Value=1; 
    if num>0 then 
    set returnNum=1; 
    else 
    /*当没有到期时查询是否在线*/ 
    select count(*) into num from radacct where UserName=username and AcctStopTime='0000-00-00 00:00:00'; 
    if num>0 then 
    set returnNum=0; /*表示在线*/ 
    else 
    /*当没有在线时判断是否绑定MAC地址*/ 
    select bind_mac,MAC,UserName from userinfo where UserName=username; 
    end if; /*是否在线结束*/ 
    end if;/*是否到期结束*/ end // 
    -- 
    -- 表的结构 `radcheck` 
    -- CREATE TABLE IF NOT EXISTS `radcheck` ( 
      `id` int(11) unsigned NOT NULL auto_increment, 
      `UserName` varchar(64) NOT NULL default '', 
      `Attribute` varchar(32) NOT NULL default '', 
      `op` char(2) NOT NULL default '==', 
      `Value` varchar(253) NOT NULL default '', 
      PRIMARY KEY  (`id`), 
      KEY `UserName` (`UserName`(32)) 
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=26 ; -- 
    -- 转存表中的数据 `radcheck` 
    -- INSERT INTO `radcheck` (`id`, `UserName`, `Attribute`, `op`, `Value`) VALUES 
    (14, '111', 'User-Password', ':=', '111'); -- -------------------------------------------------------- -- 
    -- 表的结构 `radacct` 
    -- CREATE TABLE IF NOT EXISTS `radacct` ( 
      `RadAcctId` bigint(21) NOT NULL auto_increment, 
      `AcctSessionId` varchar(32) NOT NULL default '', 
      `AcctUniqueId` varchar(32) NOT NULL default '', 
      `UserName` varchar(64) NOT NULL default '', 
      `Realm` varchar(64) default '', 
      `NASIPAddress` varchar(15) NOT NULL default '', 
      `NASPortId` varchar(15) default NULL, 
      `NASPortType` varchar(32) default NULL, 
      `AcctStartTime` datetime NOT NULL default '0000-00-00 00:00:00', 
      `AcctStopTime` datetime NOT NULL, 
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; -- 
    -- 转存表中的数据 `radacct` 
    -- INSERT INTO `radacct` (`RadAcctId`, `AcctSessionId`, `AcctUniqueId`, `UserName`, `Realm`, `NASIPAddress`, `NASPortId`, `NASPortType`, `AcctStartTime`, `AcctStopTime`, `AcctSessionTime`, `AcctAuthentic`, `ConnectInfo_start`, `ConnectInfo_stop`, `AcctInputOctets`, `AcctOutputOctets`, `CalledStationId`, `CallingStationId`, `AcctTerminateCause`, `ServiceType`, `FramedProtocol`, `FramedIPAddress`, `AcctStartDelay`, `AcctStopDelay`, `XAscendSessionSvrKey`) VALUES 
    (1, '', '', '111', '', '', NULL, NULL, '2009-12-16 17:25:52', '0000-00-00 00:00:00'); 
    用户表: -- 
    -- 表的结构 `userinfo` 
    -- CREATE TABLE IF NOT EXISTS `userinfo` ( 
      `id` int(10) NOT NULL auto_increment, 
      `UserName` varchar(30) default NULL, 
      `Name` varchar(200) default NULL, 
      `Mail` varchar(200) default NULL, 
      `Department` varchar(200) default NULL, 
      `WorkPhone` varchar(200) default NULL, 
      `HomePhone` varchar(200) default NULL, 
      `Mobile` varchar(200) default NULL, 
      `RegisteDate` date default NULL, 
      `Manager` char(200) default NULL, 
      `Installer` char(200) default NULL, 
      `StartDate` date default NULL, 
      `EndDate` date default NULL, 
      `Address` char(200) default NULL, 
      `IDNumber` char(200) default NULL, 
      `StopDate` date default '0000-00-00', 
      `MAC` varchar(50) default '', 
      `bind_mac` int(10) unsigned default '0', 
      `Status` int(2) unsigned NOT NULL default '0', 
      `Notice` int(8) unsigned default '0', 
      PRIMARY KEY  (`id`), 
      KEY `UserName` (`UserName`), 
      KEY `Departmet` (`Department`) 
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=27 ; -- 
    -- 转存表中的数据 `userinfo` 
    -- INSERT INTO `userinfo` (`id`, `UserName`, `Name`, `Mail`, `Department`, `WorkPhone`, `HomePhone`, `Mobile`, `RegisteDate`, `Manager`, `Installer`, `StartDate`, `EndDate`, `Address`, `IDNumber`, `StopDate`, `MAC`, `bind_mac`, `Status`, `Notice`) VALUES 
    (15, '111', '2', '2', NULL, NULL, '2', '2', '2009-11-27', '2', '2', '0000-00-00', '2010-12-24', '2', '2', '0000-00-00', '', 0, 1, 0); 
      

  10.   

     你提供的 create table 能用吗? 建议你先自己试一下,确认没问题后再贴出来,否则是浪费时间。另外说明一下你的测试用例。比如  online_is(12,@x), 结果@x=1 ..这样别人可以自己测试以确认是否符合你的要求
      

  11.   

    我的数据:MySQL 客户端版本: 5.0.51a说明:是想做一个存储过程,当在调用时传一个用户名进去,然后在存储过程时进行处理,返回结果为1或0,
    存储过程要操作的:1、首先通才传入的用户名进行判断,此用户是否到期,如要到期,直接返回为0,
    2、当用户没有到期,再往下判断此用户是否在线,如果在线,返回为0,
    3,当用记没有在线时,接下判断用户是否绑定为(bind_mac,此字段为1为绑定,0 为不绑定,)
    当 bind_mac=0时表示不绑定,返回为1,
    当 bind_mac=1时表示绑定,在判断两个MAC 地址是否相迥,如果果相,返回为1,不同则返回为0

    delimiter //
    create procedure online_is(in username varchar(128),out returnNum int)
    begin   /*这是判断是否到期*/
    select count(*) into num from radcheck where UserName=username and Attribute='baduser' and Value=1;
    if num>0 then
    set returnNum=1;
    else 
    /*当没有到期时查询是否在线*/
    select count(*) into num from radacct where UserName=username and AcctStopTime='0000-00-00 00:00:00';
    if num>0 then
    set returnNum=0; /*表示在线*/
    else
    /*当没有在线时判断是否绑定MAC地址*/
    select bind_mac,MAC,UserName from userinfo where UserName=username;


    end if; /*是否在线结束*/
    end if;/*是否到期结束*/

    end //********************
    想返回的结果就是,当我调用时:返回,1或0,
    当调用的时候如:call online_is(12345,@x);得到@x等于1或者为0
    --
    -- 表的结构 `radcheck`
    --CREATE TABLE IF NOT EXISTS `radcheck` (
      `id` int(11) unsigned NOT NULL auto_increment,
      `UserName` varchar(64) NOT NULL default '',
      `Attribute` varchar(32) NOT NULL default '',
      `op` char(2) NOT NULL default '==',
      `Value` varchar(253) NOT NULL default '',
      PRIMARY KEY  (`id`),
      KEY `UserName` (`UserName`(32))
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=26 ;--
    -- 转存表中的数据 `radcheck`
    --INSERT INTO `radcheck` (`id`, `UserName`, `Attribute`, `op`, `Value`) VALUES
    (14, '111', 'User-Password', ':=', '111');-- --------------------------------------------------------
    --
    -- 表的结构 `userinfo`
    --CREATE TABLE IF NOT EXISTS `userinfo` (
      `id` int(10) NOT NULL auto_increment,
      `UserName` varchar(30) default NULL,
      `Name` varchar(200) default NULL,
      `Mail` varchar(200) default NULL,
      `Department` varchar(200) default NULL,
      `WorkPhone` varchar(200) default NULL,
      `HomePhone` varchar(200) default NULL,
      `Mobile` varchar(200) default NULL,
      `RegisteDate` date default NULL,
      `Manager` char(200) default NULL,
      `Installer` char(200) default NULL,
      `StartDate` date default NULL,
      `EndDate` date default NULL,
      `Address` char(200) default NULL,
      `IDNumber` char(200) default NULL,
      `StopDate` date default '0000-00-00',
      `MAC` varchar(50) default '',
      `bind_mac` int(10) unsigned default '0',
      `Status` int(2) unsigned NOT NULL default '0',
      `Notice` int(8) unsigned default '0',
      PRIMARY KEY  (`id`),
      KEY `UserName` (`UserName`),
      KEY `Departmet` (`Department`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=16 ;--
    -- 转存表中的数据 `userinfo`
    --INSERT INTO `userinfo` (`id`, `UserName`, `Name`, `Mail`, `Department`, `WorkPhone`, `HomePhone`, `Mobile`, `RegisteDate`, `Manager`, `Installer`, `StartDate`, `EndDate`, `Address`, `IDNumber`, `StopDate`, `MAC`, `bind_mac`, `Status`, `Notice`) VALUES
    (15, '111', '2', '2', NULL, NULL, '2', '2', '2009-11-27', '2', '2', '0000-00-00', '2010-12-24', '2', '2', '0000-00-00', '', 0, 1, 0);
    --
    -- 表的结构 `radacct`
    --CREATE TABLE IF NOT EXISTS `radacct` (
      `RadAcctId` bigint(21) NOT NULL auto_increment,
      `AcctSessionId` varchar(32) NOT NULL default '',
      `AcctUniqueId` varchar(32) NOT NULL default '',
      `UserName` varchar(64) NOT NULL default '',
      `Realm` varchar(64) default '',
      `NASIPAddress` varchar(15) NOT NULL default '',
      `NASPortId` varchar(15) default NULL,
      `NASPortType` varchar(32) default NULL,
      `AcctStartTime` datetime NOT NULL default '0000-00-00 00:00:00',
      `AcctStopTime` datetime NOT NULL,
      `AcctSessionTime` int(12) default NULL,
      `AcctAuthentic` varchar(32) default NULL,
      `ConnectInfo_start` varchar(50) default NULL,
      `ConnectInfo_stop` varchar(50) default NULL,
      `AcctInputOctets` bigint(20) default NULL,
      `AcctOutputOctets` bigint(20) default NULL,
      `CalledStationId` varchar(50) NOT NULL default '',
      `CallingStationId` varchar(50) NOT NULL default '',
      `AcctTerminateCause` varchar(32) NOT NULL default '',
      `ServiceType` varchar(32) default NULL,
      `FramedProtocol` varchar(32) default NULL,
      `FramedIPAddress` varchar(15) NOT NULL default '',
      `AcctStartDelay` int(12) default NULL,
      `AcctStopDelay` int(12) default NULL,
      `XAscendSessionSvrKey` varchar(10) default NULL,
      PRIMARY KEY  (`RadAcctId`),
      KEY `UserName` (`UserName`),
      KEY `FramedIPAddress` (`FramedIPAddress`),
      KEY `AcctSessionId` (`AcctSessionId`),
      KEY `AcctUniqueId` (`AcctUniqueId`),
      KEY `AcctStartTime` (`AcctStartTime`),
      KEY `AcctStopTime` (`AcctStopTime`),
      KEY `NASIPAddress` (`NASIPAddress`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;--
    -- 转存表中的数据 `radacct`
    --INSERT INTO `radacct` (`RadAcctId`, `AcctSessionId`, `AcctUniqueId`, `UserName`, `Realm`, `NASIPAddress`, `NASPortId`, `NASPortType`, `AcctStartTime`, `AcctStopTime`, `AcctSessionTime`, `AcctAuthentic`, `ConnectInfo_start`, `ConnectInfo_stop`, `AcctInputOctets`, `AcctOutputOctets`, `CalledStationId`, `CallingStationId`, `AcctTerminateCause`, `ServiceType`, `FramedProtocol`, `FramedIPAddress`, `AcctStartDelay`, `AcctStopDelay`, `XAscendSessionSvrKey`) VALUES
    (1, '', '', '111', '', '', NULL, NULL, '2009-12-16 17:25:52', '0000-00-00 00:00:00', 3600, NULL, NULL, NULL, NULL, NULL, '', '', '', NULL, NULL, '', NULL, NULL, NULL);
      

  12.   

    这次的表建好了。请明确说明。call online_is(12345,@x); 的返回结果是什么?是0还是1?
      

  13.   

    call online_is(12345,@x); 这个要根据传进去的“用户名”进行判断,判断的过程需要在存储过程中完成说明:是想做一个存储过程,当在调用时传一个用户名进去,然后在存储过程时进行处理,返回结果为1或0, 
    存储过程要操作的:1、首先通才传入的用户名进行判断,此用户是否到期,如要到期,直接返回为0, 
    2、当用户没有到期,再往下判断此用户是否在线,如果在线,返回为0, 
    3,当用记没有在线时,接下判断用户是否绑定为(bind_mac,此字段为1为绑定,0 为不绑定,) 
    当 bind_mac=0时表示不绑定,返回为1, 
    当 bind_mac=1时表示绑定,在判断两个MAC 地址是否相迥,如果果相,返回为1,不同则返回为0 
      

  14.   

    call online_is(12345,@x);  @x=1 这样的结果是否正确?当存储过程写好后,别人如何测试? 给出你测试用例,及对应结果
    比如call online_is(12345,@x);   @x=1
    call online_is(54321,@x);   @x=0
      

  15.   

    我里面只有一个用户,为 “111”call online_is(111,@x);  
    select @a;
    这样结果返回结果总是返回0
    +-----------
    |@a|0+------------
      

  16.   

    如果这样,建议你多写一些数据,覆盖不同的情况,否则得到的存储过程未必准确。call online_is(111,@x);   @x=0
    call online_is(12345,@x);   @x=1
    call online_is(54321,@x);   @x=1以上的结果是否正确?
    (不要高估你的汉语表达能力或者我的汉语理解能力)
      

  17.   

    没那个意思,我测试出来返回的结果总是为 0delimiter //
    create procedure u(in v_username varchar(128),out returnNum int)
    begin 
    declare macNum int;  
    declare macStr varchar(128);  
    /*这里判断radcheck表中是否存在如果存在就返回0*/
    if exists(select * from radcheck where UserName=v_username and Attribute='baduser') then 
    set returnNum=0;
    else
             /*这里判断radacct 表中是否存在如果存在就返回0*/     
    if exists(select * from radacct where UserName=v_username and AcctStopTime='0000-00-00 00:00:00') then 
    set returnNum=0;
            else
                   /*这里是查询出 userinfo表中的bind_mac,MAC这两个字段,先判断 bind_ma是否等0,如果等于0直接返回0,如果不等0,这里就取出MAC中的值,
    select UserName,MAC,bind_mac into macStr from userinfo where UserName=v_username;
    if macStr=0 then
        set returnNum=1;
    else
          set returnNum=0;
            end if;
             end if;
    end if;
    end
    //
      

  18.   


    你期望的正确结果是什么?如果写出的存储过程测试结果如下,是否符合你的要求?!call online_is(111,@x);   @x=0
    call online_is(12345,@x);   @x=1
    call online_is(54321,@x);   @x=1
      

  19.   

    我有些无语了。最后一次努力吧。如果我按你的要求写了存储过程,然后自己测试的结果如下,你是否认为我写的正确?!call online_is(111,@x);   @x=0
    call online_is(12345,@x);   @x=1
    call online_is(54321,@x);   @x=1基于你提供的数据。
    mysql> select * from radacct;
    +-----------+---------------+--------------+----------+-------+--------------+--
    | RadAcctId | AcctSessionId | AcctUniqueId | UserName | Realm | NASIPAddress | N
    ASPortId | NASPortType | AcctStartTime       | AcctStopTime        | AcctSession
    Time | AcctAuthentic | ConnectInfo_start | ConnectInfo_stop | AcctInputOctets |
    AcctOutputOctets | CalledStationId | CallingStationId | AcctTerminateCause | Ser
    viceType | FramedProtocol | FramedIPAddress | AcctStartDelay | AcctStopDelay | X
    AscendSessionSvrKey |
    +-----------+---------------+--------------+----------+-------+--------------+--
    |         1 |               |              | 111      |       |              | N
    ULL      | NULL        | 2009-12-16 17:25:52 | 0000-00-00 00:00:00 |
    3600 | NULL          | NULL              | NULL             |            NULL |
                NULL |                 |                  |                    | NUL
    L        | NULL           |                 |           NULL |          NULL | N
    ULL                 |
    +-----------+---------------+--------------+----------+-------+--------------+--
    1 row in set (0.00 sec)mysql> select * from radcheck;
    +----+----------+---------------+----+-------+
    | id | UserName | Attribute     | op | Value |
    +----+----------+---------------+----+-------+
    | 14 | 111      | User-Password | := | 111   |
    +----+----------+---------------+----+-------+
    1 row in set (0.00 sec)mysql> select * from radcheck;
    +----+----------+---------------+----+-------+
    | id | UserName | Attribute     | op | Value |
    +----+----------+---------------+----+-------+
    | 14 | 111      | User-Password | := | 111   |
    +----+----------+---------------+----+-------+
    1 row in set (0.00 sec)
      

  20.   

    类似于,有人让我做个 f(x,y) = x+y 的过程。 那么如果我的程序结果是这样,那么是否正确?f(1,1)=2
    f(1,3)=7????
      

  21.   

    call online_is(111,@x);   @x=0
    call online_is(12345,@x);   @x=1
    call online_is(54321,@x);   @x=1这三个结果,基于你的数据,是否正确?
      

  22.   

    浪费了这么层,总算正面回答问题了。
    那下面的结果是否正确?
    call online_is(111,@x);   @x=1
    call online_is(12345,@x);   @x=1
    call online_is(54321,@x);   @x=1
      

  23.   

    我还没写呢! 不明白客户的需求情况写了也是白写,到时候客户只要说一句“啊,对不起,是我没说明清楚,我想要的功能其实是。”那什么时候(基于你已经提供的数据)
    call online_is(???,@x);   @x=0 
      

  24.   

    在调用要传,两个值,1、用户名,2,MAC地址,
    返回结果为1,或0.第一步:select * from radcheck where UserName=v_username and Attribute='baduser' 判断radcheck表中是否存在,存在时返回0,当不存在执行第二步第二步:select * from radacct where UserName=v_username and AcctStopTime='0000-00-00 00:00:00'判断radacct表中是否存在,存在时直返回0,当不存在执行第三步
    第三步:select UserName,MAC,bind_mac into macStr from userinfo where UserName=v_username;查询userinfo 表在的,MAC,bind_mac这两个字段
       1、对bind_mac这个字段进行判断,如果bind_mac为0时,返回时结果为1
       2,如果当bind_mac=1时执行第四步
    第四步:
       是在判断 bind_mac为1时,提出MAC值,和传入的参数比较,
        当查询出来的‘MAC“和用户调用传入的MAC地址相等时,结果返回为1,
       如果不相等返回为0
    我想这样应该理解了吧           
      

  25.   

    对不起我中文不好!!!那什么时候(基于你已经提供的数据)
    call online_is(???,@x);   @x=0 不停的重复,很累。
      

  26.   

    call online_is(???,@x);   @x=0 
    给一个具体的数字!
      

  27.   

    call online_is(111,@x);  
    @x=0 
      

  28.   

    这下面是这写的大概就是我想表达的意思,
    delimiter //
    create procedure u(in v_username varchar(128),in v_MAC varchar(128) ,out returnNum int)
    begin 
    declare macNum int;  
    declare macStr varchar(128);  
    if exists(select * from radcheck where UserName=v_username and Attribute='baduser') then 
    set returnNum=0;
    else
    if exists(select * from radacct where UserName=v_username and AcctStopTime='0000-00-00 00:00:00') then 
    set returnNum=0;
    else
    select UserName,MAC,bind_mac into macStr from userinfo where UserName=v_username;
    if macStr=0 then
    set returnNum=1;
    else
      if MAC=v_MAC then
       set returnNum=1;
      else
         set returnNum=0;
      end if;

    end if;
    end if;
    end if;
    end
    //在调用要传,两个值,1、用户名,2,MAC地址, 
    返回结果为1,或0. 第一步:select * from radcheck where UserName=v_username and Attribute='baduser' 判断radcheck表中是否存在,存在时返回0,当不存在执行第二步 第二步:select * from radacct where UserName=v_username and AcctStopTime='0000-00-00 00:00:00' 判断radacct表中是否存在,存在时直返回0,当不存在执行第三步 
    第三步:select UserName,MAC,bind_mac into macStr from userinfo where UserName=v_username; 查询userinfo 表在的,MAC,bind_mac这两个字段 
      1、对bind_mac这个字段进行判断,如果bind_mac为0时,返回时结果为1 
      2,如果当bind_mac=1时执行第四步 
    第四步: 
      是在判断 bind_mac为1时,提出MAC值,和传入的参数比较, 
        当查询出来的‘MAC“和用户调用传入的MAC地址相等时,结果返回为1, 
      如果不相等返回为0 
      

  29.   

    我只需要你的测试用例以验证。至少写完后,可以自己进行测试!
    call online_is(111,@x);  我需要知道 call online_is(111,@x);   的结果@x是什么?是0,是1?
      

  30.   


    INSERT INTO `radacct` (`RadAcctId`, `AcctSessionId`, `AcctUniqueId`, `UserName`, `Realm`, `NASIPAddress`, `NASPortId`, `NASPortType`, `AcctStartTime`, `AcctStopTime`, `AcctSessionTime`, `AcctAuthentic`, `ConnectInfo_start`, `ConnectInfo_stop`, `AcctInputOctets`, `AcctOutputOctets`, `CalledStationId`, `CallingStationId`, `AcctTerminateCause`, `ServiceType`, `FramedProtocol`, `FramedIPAddress`, `AcctStartDelay`, `AcctStopDelay`, `XAscendSessionSvrKey`) VALUES
    (1, '', '', '111', '', '', NULL, NULL, '2009-12-16 17:25:52', '0000-00-00 00:00:00', 3600, NULL, NULL, NULL, NULL, NULL, '', '', '', NULL, NULL, '', NULL, NULL, NULL);INSERT INTO `radcheck` (`id`, `UserName`, `Attribute`, `op`, `Value`) VALUES
    (14, '111', 'User-Password', ':=', '111'),
    (15, '222', 'User-Password', ':=', '222'),
    (16, '333', 'User-Password', ':=', '333'),
    (17, '222', 'baduser', '==', '1');INSERT INTO `userinfo` (`id`, `UserName`, `Name`, `Mail`, `Department`, `WorkPhone`, `HomePhone`, `Mobile`, `RegisteDate`, `Manager`, `Installer`, `StartDate`, `EndDate`, `Address`, `IDNumber`, `StopDate`, `MAC`, `bind_mac`, `Status`, `Notice`) VALUES
    (15, '111', '2', '2', NULL, NULL, '2', '2', '2009-11-27', '2', '2', '0000-00-00', '2010-12-24', '2', '2', '0000-00-00', '', 0, 1, 0),
    (16, '222', '222', '222', NULL, NULL, '222', '222', '2009-12-25', '222', '222', '2009-12-25', '2010-12-25', '222', '222', '0000-00-00', '', 0, 0, 0),
    (17, '333', '333', '333', NULL, NULL, '333', '333', '2009-12-25', '333', '333', '2009-12-25', '2010-12-25', '333', '333', '0000-00-00', '', 0, 0, 0);这是三组数据,111用户结果应该是返回为0;;
    222用户结果应该是返回为0;
    333用户结果应该是返回为0;
      

  31.   

    你是如何测试的? 你的create procedure u(in v_username varchar(128),in v_MAC varchar(128) ,out returnNum int) 显然是三个参数!call u(??? ??? ???) -> ?给出测试方案。
      

  32.   

    第一个参数是用户名,第二个参数是MAC地址。11:22:33;44:55:a6
    call online_is(111,11:22:33;44:55:a6,@a);
      

  33.   

    mysql> select * from userinfo;
    +----+----------+------+------+------------+-----------+-----------+--------+-------------+---------+-----------+------------+------------+---------+----------+------------+------+----------+--------+--------+
    | id | UserName | Name | Mail | Department | WorkPhone | HomePhone | Mobile | RegisteDate | Manager | Installer | StartDate  | EndDate    | Address | IDNumber | StopDate   | MAC  | bind_mac | Status | Notice |
    +----+----------+------+------+------------+-----------+-----------+--------+-------------+---------+-----------+------------+------------+---------+----------+------------+------+----------+--------+--------+
    | 15 | 111      | 2    | 2    | NULL       | NULL      | 2         | 2      | 2009-11-27  | 2       | 2         | 0000-00-00 | 2010-12-24 | 2       | 2        | 0000-00-00 |      |        0 |      1 |      0 |
    | 16 | 222      | 222  | 222  | NULL       | NULL      | 222       | 222    | 2009-12-25  | 222     | 222       | 2009-12-25 | 2010-12-25 | 222     | 222      | 0000-00-00 |      |        0 |      0 |      0 |
    | 17 | 333      | 333  | 333  | NULL       | NULL      | 333       | 333    | 2009-12-25  | 333     | 333       | 2009-12-25 | 2010-12-25 | 333     | 333      | 0000-00-00 |      |        0 |      0 |      0 |
    +----+----------+------+------+------------+-----------+-----------+--------+-------------+---------+-----------+------------+------------+---------+----------+------------+------+----------+--------+--------+
    3 rows in set (0.00 sec)
    你给的数据中MAC 者为空啊!!!楼主能认真点吗? 我觉得很累了。 再这么下去永远也不可能有结果。这样,我设置一个楼层限,一到 50 层我就放弃。
      

  34.   

    我明白呀,因为在那里判断得首先,是bind_mac这个值,
      如果bind_mac=0 时返回 1
      如果bind_mac=1 时,就判断userinfo表中的  MAC值  和用户调用传入参数比较,   如果比较相同就返回1,如果不相同就返回为0所以没有必要考虑userinfo中的MAC有没有数据,只是让他跟传入的数据进行比较就行了
      

  35.   

    测试通过,达到你的要求。结贴吧。千万不要说(哦,对不起,我没说清楚,不是这样的)delimiter //
    create procedure online_is(in v_username varchar(128),
    in v_MAC varchar(128) ,
    out returnNum int)
    begin 
    declare macNum int;  
    declare macStr varchar(128);  
    declare iCnt int default 0;
    declare tf_bind_mac int;
    declare tf_MAC varchar(50);

    select count(*)into iCnt from radcheck
    where UserName=v_username and Attribute='baduser';
    if iCnt>0 then
    set returnNum=0;
    else
    select count(*)into iCnt from radacct 
    where UserName=v_username 
    and AcctStopTime='0000-00-00 00:00:00';

    if iCnt>0 then
    set returnNum=0;
    else
    select MAC,bind_mac into tf_MAC,tf_bind_mac 
    from userinfo 
    where UserName=v_username;

    if tf_bind_mac=0 then
    set returnNum=1;
    else
    if tf_MAC=v_MAC then
    set returnNum=1;
    else
    set returnNum=0;
    end if;
    end if;

    end if;
    end if;
    end
    //
    mysql> call online_is(111,'11:22:33;44:55:a6',@a);
    Query OK, 0 rows affected (0.00 sec)mysql> select @a;
    +------+
    | @a   |
    +------+
    |    0 |
    +------+
    1 row in set (0.00 sec)mysql> call online_is(222,'11:22:33;44:55:a6',@a);
    Query OK, 0 rows affected (0.00 sec)mysql> select @a;
    +------+
    | @a   |
    +------+
    |    0 |
    +------+
    1 row in set (0.00 sec)mysql> call online_is(333,'11:22:33;44:55:a6',@a);
    Query OK, 0 rows affected (0.00 sec)mysql> select @a;
    +------+
    | @a   |
    +------+
    |    1 |
    +------+
    1 row in set (0.00 sec)mysql>