1

準備済みステートメントでバイナリー・パラメーターを使用してプロシージャーを呼び出そうとしています。しかし、それはすべての場合に失敗します。

私がウェブ上で見つけることができるすべての例は、決して入力値ではなく、出力バイナリ値に関連しています。

どのようにできるのか ?

前もって感謝します。

非常に簡単な手順:

CREATE PROCEDURE `testVarsGet2` (
    IN i_ulv BINARY(12),
  OUT o_cnt INT(11),
    OUT o_errno INT(11))
testVarsGet2:BEGIN
DECLARE t_ulv BINARY(12);

select `ulv` into t_ulv from `testVars`  where `ulv` =i_ulv;

IF  ROW_COUNT() = 0 THEN 
    SET o_errno = -1002;
    LEAVE testVarsGet2;
END IF;
select `cnt` into o_cnt from `testVars`  where `ulv` = i_ulv;

SET o_errno = 0;

LEAVE testVarsGet2;
END;

ulv が OK なら o_errno = 0 、そうでなければ o_errno =- 1002

コマンドライン :

mysql> call testVarsGet2 (0x7124A57EF08100010000DF3F,@cnt , @err); select  @cnt, @err;
Query OK, 1 row affected (0.00 sec)

+------+------+
| @cnt | @err |
+------+------+
|    1 |    0 |
+------+------+
1 row in set (0.00 sec)

また

mysql> call testVarsGet2 (unhex('7124A57EF08100010000DF3F'),@cnt , @err); select  @cnt, @err;
Query OK, 1 row affected (0.00 sec)

+------+------+
| @cnt | @err |
+------+------+
|    1 |    0 |
+------+------+
1 row in set (0.00 sec)

しかし、C/C++ プログラムでは、ステートメントを使用すると失敗します

 mysql_stmt_prepare(stmt, "call testVarsGet2 ( unhex(?), ? , ?)", strlen(..));

with 

const char * value = "7124A57EF08100010000DF3F"
len = 24;

    bind[0].buffer_type = MYSQL_TYPE_STRING;
    bind[0].buffer = (char *)value;
    bind[0].buffer_length = 32;
    bind[0].is_null= 0;
    bind[0].length= &len;

また

mysql_stmt_prepare(stmt, "call testVarsGet2 ( ?, ? , ?)", strlen(..));

value = "0x7124A57EF08100010000DF3F"

またはバイナリ値で

const char * value = "7124A57EF08100010000DF3F"
len = 12

unsigned char * value_bin = hex2bin (value );

    bind[0].buffer_type = MYSQL_TYPE_BLOB;
    bind[0].buffer = (char *)value_bin;
    bind[0].buffer_length = 12;
    bind[0].is_null= 0;
    bind[0].length= &len;

すべての場合で、o_errno = -1002 を取得します

バイナリ値を渡す方法????

前もって感謝します。

4

1 に答える 1

1

私のコメントを答えに変えます。

出力パラメーターのプレースホルダーとして引用符を使用しないでください。代わりに、コマンド ライン バージョンで行ったように、出力パラメーターごとにユーザー変数を指定します。次に、後続のSELECTステートメントを発行して、これらのユーザー変数の値を取得します。これらの結果値を C 変数にバインドできます。

入力パラメーターのみに到達したら、試みた方法でそれらを C 変数にバインドできるはずです。

于 2012-11-11T22:33:14.347 に答える