Попробуйте получить данные больших двоичных объектов из Oracle с помощью процедур OCI, но получите ошибку: ORA-01008: не все переменные связаны - PullRequest
1 голос
/ 24 февраля 2020

Я пытаюсь получить данные BLOB-объектов из Oracle с помощью процедур OCI. Я использую следующий код, но оператор Exute выдает ошибку: ORA-01008: не все переменные связаны Что я не так? Кто-нибудь может мне помочь? Спасибо, Киз Брааксма

void get_blob_data()
{
// The query
// The results of this methode 
// if errstring is empty, the blob data can be found in the 4th parameter.
// otherwise the error is given in errstring
CString csQuery;
csQuery.Format("BEGIN get_blob('%s','%ld',:ERRSTRING,:BLOB); END;", "20", 200);

//init
OCIHandleAlloc((dvoid *)m_OCIEnvironment , (dvoid **)(&m_OCIStatement),
    (ub4)OCI_HTYPE_STMT, (size_t)0, (dvoid **)0);

//Prepare statement voor query
OCIStmtPrepare(m_OCIStatement, m_OCIError, (text *)(csQuery),
    (ub4)(strlen(csQuery)), (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT);

// output variables
char *pszResult = (char*)malloc(256);
memset(pszResult, 0, sizeof(pszResult));
Blob *blob = new Blob();

m_pIndicator1 = malloc(sizeof(OCIInd));
m_pDefine1 = NULL;

OCIDefineByPos(m_OCIStatement, &m_pDefine1, m_OCIError, (ub4)1,
    (dvoid*)*pszResult,
    (sb4)256, SQLT_STR,
    (dvoid*)m_pIndicator1,
    (ub2*)0, (ub2*)0, (ub4)OCI_DEFAULT);

m_pIndicator2 = malloc(sizeof(OCIInd));
m_pDefine2 = NULL;
OCIDescriptorAlloc(m_OCIEnvironment, &blob, (ub4)OCI_DTYPE_LOB, (size_t)0, (dvoid **)0);

OCIDefineByPos(m_OCIStatement, &m_pDefine2,
    m_OCIError, (ub4)2,
    (dvoid*)blob,
    (sb4)-1, SQLT_BLOB,
    (dvoid*)m_pIndicator2,
    (ub2*)0, (ub2*)0, (ub4)OCI_DEFAULT));


iStatus = OCIStmtExecute(m_OCISrvCtx, m_OCIStatement, m_OCIError, (ub4)1, (ub4)0, 
    (OCISnapshot *)NULL, (OCISnapshot *)NULL, 
    (ub4)OCI_DEFAULT);

// results:
// iStatus = -1;
// Errorstring: ORA-01008: not all variables bound
}

Ответы [ 2 ]

0 голосов
/ 17 марта 2020

Best Oracle -пользователей,

По-прежнему возникают проблемы с получением BLOB-объекта из Oracle. Я использую это так меньше. Большую часть времени я копирую некоторый код, и новый запрос работает нормально.

Я попросил коллегу изменить функцию. Новый запрос:


select ngm_transactie_pck.get_checkout_blob ('20 ',' 200 ') из двойного

результатом этой функции является BLOB-объект. Я запрограммировал:

stati c OCILobLocator * blob = NULL; после OCIHandleAllo c () и OCIStmtPrepare (), как в предыдущем примере, у меня есть:

OCIDescriptorAllo c (m_OCIEnvironment, & blob, (ub4) OCI_DTYPE_LOB, (size_t) 0, (size) **) ;

CIDefineByPos (m_OCIStatement, & m_pDefine2, m_OCIError, (ub4) 1, (dvoid *) & blob, (sb4) -1, OCI_DTYPE_LOB, (dvoid *) m_pIndicator2, (ub *) * (ub *) 0, (ub4) OCI_DEFAULT));

Вызов OciDefineByPos () дает сбой / переполнение стека. Что я не прав? Привет, Кис

0 голосов
/ 25 февраля 2020

У вас нет вызовов OCIBindByName (). OCIDefineByPos () используется при выполнении SQL запросов, а вы нет.

Странно, что вы используете смесь переменных% s и bind в вызове PL / SQL. Я думаю, что вы хотите использовать переменные связывания для всех параметров.

Один удобный совет - посмотреть, как ODPI- C использует OCI. Для больших объектов вы можете получить либо локаторы, либо данные напрямую. Последний намного быстрее, но ограничен 1G. Возможно, проще всего установить Python и cx_ Oracle и запустить несколько примеров, например ReturnLobsAsStrings.py . Вы можете отслеживать вызовы OCI в dpiOci. c.

Есть несколько примеров программ OCI (к сожалению, они не так доступны - ваш администратор БД может их установить), ищите cdemolb. c и cdemolbs. c

...