OCI を介して Oracle ストアド プロシージャを呼び出し、C++ で out ref カーソルを使用して結果を返す に続いて、NUMBER 列を抽出し、結果を double または long (切り捨て) に格納したいと考えています。
要約すると、sys ref_cursor を使用して OCI 経由でオラクル ストアド プロシージャを呼び出し、結果を反復処理しています。char[] を使用して VARCHAR2 列を簡単に抽出できますが、NUMBER 列は機能しません (整数コンポーネントのみが必要です)。
テーブルは次のように定義されます。
CREATE TABLE FXT_CON_RULES
(
SET_NAM VARCHAR2(12),
CC_TYPE VARCHAR2(8),
AMT_FLOOR NUMBER,
METHOD_FLG" CHAR(1),
BASIS_POINTS" NUMBER(10,1)
)
ストアド プロシージャは次のとおりです。
CREATE OR REPLACE PROCEDURE FXT_TEST_CALL(CRESULTS OUT SYS_REFCURSOR) IS
sTESTQUERY VARCHAR2(4000);
BEGIN
sTESTQUERY := '
SELECT
set_nam,
cc_type,
amt_floor,
method_flg,
basis_points
from
fxt_con_rules c';
OPEN CRESULTS FOR sTESTQUERY;
END FXT_TEST_CALL;
long (long long) と double の両方の変数を使用して SQLT_NUM、SQLT_INT、SQLT_VNU を使用しようとしましたが、それでも 0 以外の整数値を取得できませんでした。コードスニペット:
char set_nam[40];
double amt_floord = 0;
int answer = OCIStmtExecute(g_pOciServiceContext, pOciStatement, pOciError, 1, 0, NULL, NULL, OCI_COMMIT_ON_SUCCESS);
answer = OCIDefineByPos(cursor,&pOciDefine, pOciError,1,set_nam,40, SQLT_STR, 0, 0, 0,OCI_DEFAULT);
answer = OCIDefineByPos(cursor,&pOciDefine2, pOciError,3,&amt_floord,sizeof(amt_floord), SQLT_NUM, 0, 0, 0,OCI_DEFAULT);
int blah = 0;
while ((answer = OCIStmtFetch(cursor,pOciError, 1,OCI_FETCH_NEXT,OCI_DEFAULT)) == 0)
{
// longTest is always zero while set_name is populated correctly
long long longTest = static_cast<long long>(amt_floord);
blah++;
}
正しい方向へのポインタは大歓迎です(単純なものを見逃していたらごめんなさい!)。ありがとう