0

ストアド プロシージャを使用して 2 つの文字列をデータベースに挿入する次の C コードがあります。

char query[1024];

memset(query, 0, sizeof(query));
sprintf(query, "BEGIN bns_saa_message_insert (:1, :2); END;");


/* prepare statement */
if( checkerr(errhp, OCIStmtPrepare(stmthp, errhp, (text *) query,
        (ub4) strlen((char *) query),
        (ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT)) == OCI_ERROR)
    return -1;


/* bind input params */
if( checkerr(errhp, OCIBindByPos(stmthp, &bndhp, errhp, (ub4) 1, (dvoid *) hostNumber,
        (sword) sizeof(hostNumber) - 1, SQLT_CHR, (dvoid *) 0,
        (ub2 *) 0, (ub2) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT)) == OCI_ERROR)
    return -1;

if( checkerr(errhp, OCIBindByPos(stmthp, &bndhp, errhp, (ub4) 1, (dvoid *) saaMessage,
        (sword) sizeof(saaMessage) - 1, SQLT_CHR, (dvoid *) 0,
        (ub2 *) 0, (ub2) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT)) == OCI_ERROR)
    return -1;
//end of param binding

printf("クエリ: %s",クエリ); //これは、上記のバインドを行ったときに param1 と param2 が置き換えられていないことを示しています

/* execute the statement */
status = OCIStmtExecute(svchp, stmthp, errhp, (ub4) 1, (ub4) 0,
        (CONST OCISnapshot *) NULL, (OCISnapshot *) NULL, OCI_DEFAULT);

私が得るエラーは次のとおりです。

ORA-01008: 一部の変数がバインドされていません

上記のコードで概説されている printf は、次の出力を出力します。

クエリ: BEGIN bns_saa_message_insert (:1, :2); 終わり;

質問
このエラーを修正するにはどうすればよいですか?

編集
同様の質問がC#またはJavaでここで回答されているのを見ましたが、C
「ORA-01008:すべての変数がバインドされていません」エラー
ORA-01008:すべての変数がバインドされていません。彼らは縛られています

4

1 に答える 1

4

ちょっとしたミスのようです。2 番目の呼び出しでは、4 番目のパラメーターの代わりにOCIBindByPos使用する必要があります。21

if( checkerr(errhp, OCIBindByPos(stmthp, &bndhp, errhp, (ub4) 2, (dvoid *) saaMessage,
于 2012-02-08T18:38:08.163 に答える