说明:是想做一个存储过程,当在调用时传一个用户名进去,然后在存储过程时进行处理,返回结果为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,
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 //
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 //
参考一下这个贴子的提问方式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)
这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
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 ;
存储过程要操作的: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);
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;
select UserName,MAC into v_MAX,bind_mac from userinfo where UserName=v_username;
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来判断呢
参考一下这个贴子的提问方式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)
这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
存储过程要操作的: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);
存储过程要操作的: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);
存储过程要操作的:1、首先通才传入的用户名进行判断,此用户是否到期,如要到期,直接返回为0,
2、当用户没有到期,再往下判断此用户是否在线,如果在线,返回为0,
3,当用记没有在线时,接下判断用户是否绑定为(bind_mac,此字段为1为绑定,0 为不绑定,)
当 bind_mac=0时表示不绑定,返回为1,
当 bind_mac=1时表示绑定,在判断两个MAC 地址是否相迥,如果果相,返回为1,不同则返回为0
比如call online_is(12345,@x); @x=1
call online_is(54321,@x); @x=0
select @a;
这样结果返回结果总是返回0
+-----------
|@a|0+------------
call online_is(12345,@x); @x=1
call online_is(54321,@x); @x=1以上的结果是否正确?
(不要高估你的汉语表达能力或者我的汉语理解能力)
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
//
你期望的正确结果是什么?如果写出的存储过程测试结果如下,是否符合你的要求?!call online_is(111,@x); @x=0
call online_is(12345,@x); @x=1
call online_is(54321,@x); @x=1
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)
f(1,3)=7????
call online_is(12345,@x); @x=1
call online_is(54321,@x); @x=1这三个结果,基于你的数据,是否正确?
那下面的结果是否正确?
call online_is(111,@x); @x=1
call online_is(12345,@x); @x=1
call online_is(54321,@x); @x=1
call online_is(???,@x); @x=0
返回结果为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
我想这样应该理解了吧
call online_is(???,@x); @x=0 不停的重复,很累。
给一个具体的数字!
@x=0
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
call online_is(111,@x); 我需要知道 call online_is(111,@x); 的结果@x是什么?是0,是1?
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;
call online_is(111,11:22:33;44:55:a6,@a);
+----+----------+------+------+------------+-----------+-----------+--------+-------------+---------+-----------+------------+------------+---------+----------+------------+------+----------+--------+--------+
| 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 层我就放弃。
如果bind_mac=0 时返回 1
如果bind_mac=1 时,就判断userinfo表中的 MAC值 和用户调用传入参数比较, 如果比较相同就返回1,如果不相同就返回为0所以没有必要考虑userinfo中的MAC有没有数据,只是让他跟传入的数据进行比较就行了
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>