0

以下のようなテーブル構造があります

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

テーブルには以下の行が含まれています

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 を返します。

4

2 に答える 2

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;

プリペアド ステートメントの詳細については、こちらをご覧ください。

于 2012-08-24T13:04:50.850 に答える
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
于 2012-08-24T12:22:11.503 に答える