私は次のシナリオで実行していますが、私が見ている動作の正確な説明が見つからないため、かなりの頭痛の種になります。私は次のように宣言しています:
struct test_struct
{
long testv1;
char testv2[51];
long testv3;
};
およびOracle10gの対応するテーブル:
CREATE TABLE test_table
(
testv1 NUMBER(10, 0),
testv2 VARCHAR(50),
testv3 NUMBER(4, 0)
);
このテーブルのデータにアクセスするには、次の関数があります。
bool getTestData(long test_var1, struct test_struct *outStruct)
ここで、説明する必要があるが説明できない違いがわかります。関数の本体が次のようになっている場合:
EXEC SQL BEGIN DECLARE SECTION;
long testvar1_param = test_var1;
struct test_struct *resStruct = outStruct;
EXEC SQL END DECLARE SECTION;
EXEC SQL SELECT testv1, testv2, testv3
INTO :resStruct
FROM test_table
WHERE testv1 = :testvar1_param;
関数の本体が次のようになっていると、パフォーマンスが低下します。
EXEC SQL BEGIN DECLARE SECTION;
long testvar1_param = test_var1;
long *testv1_res = &(outStruct->testv1);
char *testv2_res = outStruct->testv2;
long *testv3_res = &(outStruct->testv3);
EXEC SQL END DECLARE SECTION;
EXEC SQL SELECT testv1, testv2, testv3
INTO :testv1_res, :testv2_res, :testv3_res
FROM test_table
WHERE testv1 = :testvar1_param;
2番目のパフォーマンスは、大幅に異なります。
誰かがこの振る舞いを説明できるものを知っていますか?