1

簡単です-このlibを使用して、複数の結果を返すストアドプロシージャまたは関数を呼び出す方法はありますか?については知っていますがITRoutingManager、1つの値しか返されないようです。

詳細には、これが私が意味することです:

CREATE FUNCTION test_out1( pin INT )
    RETURNING INT;

    DEFINE param INT;
    LET param = 321;

    RETURN param;

END FUNCTION;

を返します。と 321で値を取得できます。だからこれは大丈夫です。しかし、以下はそうではありません:ITValueITConversions

CREATE FUNCTION test_out2( pin INT )
    RETURNING INT, INT;

    DEFINE param INT;
    LET param = 321;

    DEFINE param2 INT;
    LET param2 = 123;

    RETURN param, param2;

END FUNCTION;

私がそうするときroutine.GetRoutine( "function test_out2( int )" )、それはうまくバインドされているので、それで問題ありません。しかし、これを参照してください:

std::cout << "Result type: " << routine.ResultType()->Name() IsRow() ? "row, " : ", " )
        << (routine.ResultType()->IsCollection() ? "collection, " : ", " )
        << routine.ResultType()->Quality() << "\n\n";

印刷します。整数integer, , , null注意してください。たとえば、行ではなく整数であるのはなぜですか。そして、関数によって返される2つの値を取得する方法は?もう1つの興味深い事実-戻り値は0int (クラスを使用してに変換した場合ITConversions)であり、123でも321でもありません。

方法がなければなりません。これは、Informix開発者によってInformixサーバー用に作成された特別なライブラリであり、これが不可能な場合は奇妙なことになります。

関数についても同じですが、同じだと思います。


注:informixのプロシージャ/関数(Informix:出力パラメータを使用したプロシージャ?)の場合、一般的なケースではoutパラメータなどはありません。

4

1 に答える 1

1

お気づきのように、Informixには実際には「OUT」パラメーターがありません。値を返します。

通常のESQL/Cでは、出力値のリストを入力値のリストと対称的に扱います。したがって、私はこのコードでも同じことをすることを期待しています。関数に2つの引数を渡すために使用する手法が何であれ、複数の戻り値を取得する方法である可能性がありますが、決して保証されるわけではありません。

疑わしい場合は、複数の行を返すSELECTステートメントを処理するのと同じように処理してください。つまり、次の類似物を実行します。

 PREPARE s FROM "EXECUTE PROCEDURE test_out2(?)";
 DECLARE c CURSOR FOR s;
 OPEN c USING :input_value;
 while (sqlca.sqlcode == 0)
 {
     FETCH c INTO :out_value1, :out_value2;
     if (sqlca.sqlcode != 0)
         break;
     ...use values...
 }
 CLOSE c;
 FREE c;
 FREE s;

OIC++ではなくODBCを使用することをお勧めします。OIC ++インターフェイスは別のライブラリDMIの上に構築されており、DMIはDBMSにアクセスする別のライブラリの上に構築されています-それがESQL / CベースかODBCベースか、それともそれらが構築されているコアライブラリの1つかを忘れています。unixODBCをドライバーマネージャーおよび適切なODBCドライバーとして使用することは、OIC++を使用するよりも私にとって理にかなっています。


それがOIC++でどのように見えるかはわかりません。私はそれを使ったことがありませんが、それのいくつかの大雑把なメンテナンスをしただけです。

全体として、新しい作業にはOIC++を使用しないことをお勧めします。Informixは、新しい使用を奨励するのではなく、下位互換性のために引き続き配布します。

于 2011-03-31T15:27:41.417 に答える