正直言って、私はかなり愚かな気分です。しかし、これは単にが動作していないです。MySQL-格納されたProcs-出力パラメータを使用しようとすると奇妙な
シナリオ
出力パラメータを含むストアドプロシージャがあります。私はそのパラメータに値をSELECTしようとしています。これは単純なようですが、それでも私は間違った結果を与え続けています。私は多くのオンラインソースをチェックしましたが、私はそれを正しくやろうとしています。
コード
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'の結果を返します) 「@Bloop変数をSET @Bloop = 0
を使ってsproc呼び出しで使用する前に宣言してください。
なぜこれが起こっているのかについての洞察があり、適切な価値を返すためにできることがあれば、私は多くの義務があります。また、格納されたファンクションを使用して戻り値を使用して同じ結果を得る方法を私に示すことができれば、さらにもありがたく思っています!私の望むアプローチはストアドファンクションを使用していますが、同様の問題があって、あきらめてストアドプロシージャを使用してみましたが、似たような結果が出ていました。
あなたが提供できるものは何でも役に立ちます!
編集:
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)の整数値)。 '2'を返す代わりに、spGetId()でTableの行数を返すように変更すると、 '32'が返されます。
「show create table 'Table'」と「select * from' Table'」の出力を表示できますか? – Martin
あなたが 'spelet '(' bleep '、@Bloop)'を呼び出した直後に 'show warnings;'を試してみてください。タイプ変換の問題のようです – ajreal
最新の編集から 'create table'をテストしました。 。あなたは正しいデータベースでこれをテストしていますか? –