0

OCIを使用してC++アプリケーションを開発しています。DBからOCINumberにデータをフェッチする必要があります。OCINumbersで関数OCIDefineByPos()を使用する方法について混乱しています。誰かがこれで私を助けることができますか?

以下に示すのは、OCIDefineByPos関数を呼び出すコードの一部です。pStmtはOCIStmt*であり、p_ErrorはOCIError*です。以下の関数ポインタが使用されます。

1. pf_OCINumberFromReal = function pointer to OCINumberFromReal
2. pf_OCINumberToReal  = function pointer to OCINumberToReal
3. pf_DefineByPos = function pointer to OCIDefineByPos.

OCINumber ocinTest;
long double dnum = 0.0;

(*pf_OCINumberFromReal)(p_Error, &dnum, sizeof(dnum), &ocinTest);
int iLength1 = sizeof(ocinTest);


OCIDefine* pDfn = NULL;
iRet = (*pf_DefineByPos)(pStmt, &pDfn, p_Error, 1, (dvoid *) &ocinTest,
    (sword) iLength1, SQLT_NUM, (dvoid *) 0, (ub2 *)0,
        (ub2 *)0, OCI_DEFAULT);
if (iRet == OCI_SUCCESS)
{
    (*pf_OCINumberToReal)(p_Error, &ocinTest, sizeof(dnum), &dnum);
    std::cout <<std::fixed << std::setprecision (10) << dnum << std::endl;
}

iRet = OCI_SUCCESSですが、データベース内の値を正しくフェッチしませんでした(pStmtを使用して定義されたSQLクエリの値)。呼び出し後もdnumは0.0です。このpf_DefineByPosは、int、doubleなどの他のデータ型で正常に機能しています。

だから誰かが私がこれに関する問題を見つけるのを手伝ってくれる?

4

2 に答える 2

0

コードが完全にコンテキストから外されていない場合は、いくつかの重要な部分が欠落しています。

一般的なOCIプログラムには、次の手順が含まれます。

  1. SQLステートメントを準備します(OCIStmtPrepare)

  2. 結果の列または出力パラメーターを、結果の値を受け取る変数にバインドします(OCIDefineByPos)

  3. ステートメントを実行します(OCIStmtExecute)

  4. 結果で何かをする

ステップ3をスキップして、ステップ2の直後に何らかの結果を期待しているように見えますが、ステップ2はデータをフェッチしません。クエリ結果と変数の間に関連付けを作成するだけです。

于 2012-08-29T12:19:23.347 に答える
0

DefineByPosforではなくOCINumberwith typeが必要です。SQLT_VNUSQLT_NUM

于 2013-12-30T23:08:41.373 に答える