正直なところ、今はかなりバカな気分です。しかし、これは単に機能していません。
シナリオ
出力パラメーターを含むストアドプロシージャがあります。そのパラメータに値を選択しようとしています。これは単純に思えますが、それでも誤った結果が得られます。私は多くのオンラインソースをチェックしました、そして私はそれをきちんとやろうとしていると確信しています。
コード
DELIMITER //
CREATE PROCEDURE `spGetId`(
IN ParamA VARCHAR(32),
OUT OutputId INT
)
BEGIN
SELECT `id` INTO OutputId
FROM `Table`
WHERE `column_a` = ParamA;
END//
CALL spGetId('foobar', @Bloop)//
SELECT @Bloop//
結果
このテーブルには2つの行があり、それらのIDは「1」と「2」です。SELECTステートメントが何かに一致するかどうかに関係なく、返される結果は「31」です。WHERE句を完全に削除し、SELECTでパラメータにCOUNT(1)を返すなど、さまざまなバリエーションを試しました(2行しかないにもかかわらず、「32」の結果が得られます)。 "。を使用してsproc呼び出しで使用する前の@Bloop変数SET @Bloop = 0
。
なぜこれが起こっているのか、そしてそれを適切な値に戻すために私ができることについて何か洞察があれば、私は多くの義務を負います。また、代わりにストアド関数を使用して、戻り値を使用して同じ目的の結果を達成する方法を教えていただければ、さらに感謝します。私の望ましいアプローチはストアド関数を使用することですが、それと同様の問題があり、それからあきらめてストアドプロシージャを使用しようとしましたが、同様の結果が得られたことがわかりました。
あなたが提供できるものは何でも役に立ちます!
編集:
CREATE TABLE `Table` (
`id` int(11) NOT NULL auto_increment,
`column_a` varchar(32) character set utf8 NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
mysql> SELECT * FROM Table;
+------+----------+
| id | column_a |
+------+----------+
| 1 | asdf |
| 2 | foobar |
+------+----------+
引数を指定してspGetId()を呼び出すと、値「31」が返されます(引数が「foobar」の場合でも、整数値「2」(またはASCII 0x32)を返す必要があります)。spGetId()を変更して、テーブルの合計行数を返すようにすると、「2」を返す代わりに「32」を返します。