0

正直なところ、今はかなりバカな気分です。しかし、これは単に機能していません

シナリオ
出力パラメーターを含むストアドプロシージャがあります。そのパラメータに値を選択しようとしています。これは単純に思えますが、それでも誤った結果が得られます。私は多くのオンラインソースをチェックしました、そして私はそれをきちんとやろうとしていると確信しています。


コード

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

4

2 に答える 2

1

ストアドプロシージャは機能しています。整数値1ではなく文字「1」のASCII値を返していると思います。

于 2010-11-27T13:06:01.793 に答える
0

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

問題が正確に何であるかはまだわかりませんが、phpMyAdminが独自の型変換を実行していたようで、その特定のクライアントを介してすべてのテストを実行していました。

私自身の簡単なPHPスクリプトを一緒にスローし、手動でsprocを呼び出す(さらにテストでは、ストアド関数も呼び出す)と、目的の結果が得られました。

それで、学んだ教訓:クライアントを決して信用しないでください。少し切り替えることを忘れないでください。

于 2010-11-28T02:27:27.577 に答える