OCI_INVALID_HANDLE - Неверный контекст службы, дескриптор соединения или оператора - PullRequest
0 голосов
/ 28 февраля 2012

Я делаю несколько звонков из C через OCI в базу данных Oracle.

Я получаю эту ошибку:

OCI_INVALID_HANDLE - Неверный контекст службы, дескриптор соединения или оператора

Я унаследовал этот код:

initOracle(..) { .. //return successful or 0 }

int executeGetQuery(char * query, char * queryResultData) {
    char stmt[255];

    OCIError *errhp;
    OCIDefine *defnp = (OCIDefine *) 0;
    OCIStmt *stmthp;
    OCISvcCtx *svchp; //server context handle (almost like DBPROCESS)
    sb2 is_null;

    memset((char *)stmt, 0, 255);
    //TODO replace with query
    sprintf((char *)stmt, "SELECT min(ID) as MINID FROM BNS_SAA_CONFIRMATIONS where SentToWssStatus<>'T'");

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

    /* define output params */
    if(checkerr(errhp, OCIDefineByPos(stmthp, &defnp, errhp, 1, (dvoid *) queryResultData,
            (sword) strlen(queryResultData), SQLT_STR, (dvoid *) &is_null, (ub2 *)0,
            (ub2 *)0, OCI_DEFAULT)) == OCI_ERROR)//maybe replace SQLT_STR w SQLT_CHR OMFWTD
        return -1;

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

Я думаю, что ошибка появляется на этих функциях: OCIStmtExecute(..) или OCIDefineByPos(..) или OCIStmtPrepare(..)

Вопрос: Как мне избавиться от этой ошибки и начать выполнять запрос?

Ошибка документации: http://docs.oracle.com/cd/B28359_01/appdev.111/b28395/oci02bas.htm

1 Ответ

1 голос
/ 28 февраля 2012

Хорошо ... Я вижу, что дескрипторы OCI, которые определены локально, не распределяются и / или не инициализируются правильно. Если эти шаги выполняются в другом унаследованном коде, вам необходимо убедиться, что у вас есть способ получить указатели на эти дескрипторы. Если нет, то документы Oracle, на которые вы ссылаетесь в разделе обработки ошибок, содержат как отличное введение в программирование OCI, так и углубленные демонстрационные программы (вам, возможно, придется создать учетную запись разработчика Oracle и загрузить клиент OCI, чтобы получить их, если они не доступны для вас). Удачи, OCI - это огромный API, но собственная документация Oracle хороша, как только вы научитесь ориентироваться в ней, кроме вступления, которое я нашел в разделе Реляционные функции OCI (по крайней мере, это эквивалентно в 10g) быть бесценным.

...