2012-08-24 113 views
0

我有一个表结构如下与约束

CREATE TABLE `eatables` (
    `Sno` int(11) NOT NULL auto_increment, 
    `Name` varchar(255) collate latin1_general_ci default NULL, 
    PRIMARY KEY (`Sno`) 
); 

表Mysql的预处理语句包含的行如下

insert into `eatables`(`Sno`,`Name`) values (1,'Apples'); 
insert into `eatables`(`Sno`,`Name`) values (2,'Oranges'); 
insert into `eatables`(`Sno`,`Name`) values (3,'Papaya'); 
insert into `eatables`(`Sno`,`Name`) values (4,'Jackfruit'); 
insert into `eatables`(`Sno`,`Name`) values (5,'Pineapple'); 
insert into `eatables`(`Sno`,`Name`) values (6,'Mango'); 

我创建了一个程序,即可根据计数的名称作为约束

DROP PROCEDURE IF EXISTS proc_fruit_count; 
CREATE PROCEDURE mp_user_preference(pFruitName VARCHAR(255)) 
BEGIN 
    SELECT @lngCount = COUNT(Sno) 
     FROM eatables 
     WHERE Name = pFruitName; 

    SELECT @lngCount; 
END 

但我的程序每次执行它都返回Null。

回答

0

你必须修改你的存储过程!您还需要IN关键字使用:

CREATE PROCEDURE mp_user_preference(IN pFruitName VARCHAR(255)) 
BEGIN 
    SELECT @lngCount = COUNT(Sno) 
     FROM eatables 
     WHERE Name = pFruitName; 

    SELECT @lngCount; 
END 

http://www.mysqltutorial.org/stored-procedures-parameters.aspx

编辑:如果你想返回lngCount您可以修改存储过程如下:

CREATE PROCEDURE mp_user_preference(IN pFruitName VARCHAR(255), OUT toReturn INT) 
BEGIN 
     SELECT @lngCount = COUNT(Sno) 
     FROM eatables 
     WHERE Name = pFruitName 
     INTO toReturn; 

END 
0

你不需要一个存储过程在这里。您可以通过准备好的声明方便地解决此问题。

prepare stmt from 'select count(*) from eatables where name = ?'; 
set @whatever = 'Mango'; 
execute stmt using @whatever; /* @whatever replaces the ? in the query above */ 
/* and if you don't need the prepared statement any more you do... */ 
deallocate prepare stmt; 

阅读更多关于准备陈述here