0

正直言って、私はかなり愚かな気分です。しかし、これは単にが動作していないです。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'が返されます。

+0

「show create table 'Table'」と「select * from' Table'」の出力を表示できますか? – Martin

+0

あなたが 'spelet '(' bleep '、@Bloop)'を呼び出した直後に 'show warnings;'を試してみてください。タイプ変換の問題のようです – ajreal

+0

最新の編集から 'create table'をテストしました。 。あなたは正しいデータベースでこれをテストしていますか? –

答えて

0

私はテスト環境を変えることを学ぶ必要があります。

は、私はまだ問題が何であったか正確ないと確信しているが、phpMyAdminには、独自の型変換のいくつかの種類を実行していた、と私はその特定のクライアントを介してすべての私のテストを実行していたように見えます。

私自身の簡単なPHPスクリプトを一緒にスローし、手動でsprocを呼び出して(さらにテストして、ストアドファンクションを呼び出しても)、望ましい結果が得られました。

したがって、レッスンでは、クライアントを信頼することはありません。それを少し変えることを忘れないでください。

1

保存されたprocが動作しています。私は整数値1の代わりに文字 '1'のascii値を返すと思います。

+0

それはかなり実行可能なようです。しかし、それが返されるはずのIDは「2」なので、なぜ「1」を返しているのか分かりません。列がint(11)でsprocの戻り値がint(11)の場合、なぜASCII値を返すのでしょうか?そこに何か他のものがあるかどうか知っていますか? – JMTyler