尝试通过OCI例程从Oracle获取Blob数据,但会收到错误:ORA-01008:并非所有变量都已绑定

问题描述 投票:1回答:1

我尝试通过OCI例程从Oracle获取Blob数据。我使用下一个代码,但是exeute语句给出了错误:ORA-01008:并非所有变量都已绑定我怎么了有谁能够帮助我?谢谢,Kees Braaksma

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
}
c++ oracle blob oci
1个回答
0
投票

您没有任何OCIBindByName()调用。 OCIDefineByPos()是在运行SQL查询时使用的(不是)。

奇怪的是,在PL / SQL调用中混合使用%s和绑定变量。我认为您想对所有参数使用绑定变量。

一个方便的提示是查看ODPI-C如何使用OCI。对于LOB,您可以直接获取定位符或数据。后者要快得多,但仅限于1G。可以说安装Python和cx_Oracle并运行一些示例是最简单的。 ReturnLobsAsStrings.py。您可以在dpiOci.c中跟踪OCI调用。

[有一些示例OCI程序(非常难以访问-您的DBA可能能够安装它们,请注意cdemolb.c和cdemolbs.c]

© www.soinside.com 2019 - 2024. All rights reserved.