OCI调用存储过程

来源:互联网 发布:linux服务器常用命令 编辑:程序博客网 时间:2024/06/05 14:29

OCI调用存储过程:


std::string sql_proc = "BEGIN com_bos.getmembers(:out_result); END;";

  OCIStmt* pStmt = NULL;
OCIStmt* pCur = NULL;
sb2* pIndicator0 = 0;
sb2* pIndicator1 = 0;
sb2* pIndicator2 = 0;
sb2* pIndicator3 = 0;
sb2* pIndicator4 = 0;
sb2* pIndicator5 = 0;
sb2 pIndicator6 = -1; //这是一个指示器变量,就是这个表的这一列可以为NULL值,为了保证调用不返回错,这个地方赋值-1;
OCIBind* pBind = NULL;


OCIDefine* pOciDefine1 = NULL;
OCIDefine* pOciDefine2 = NULL;
OCIDefine* pOciDefine3 = NULL;
OCIDefine* pOciDefine4 = NULL;
OCIDefine* pOciDefine5 = NULL;
OCIDefine* pOciDefine6 = NULL;
std::string strMemberNo;
std::string strCompany;
std::string strName;
std::string strAddress;
std::string strPhone;
std::string strWebsite;


strMemberNo.resize(10);
strCompany.resize(200);
    strName.resize(100);
strAddress.resize(1000);
strPhone.resize(100);
strWebsite.resize(1000);


do 
{
if ( CheckError(OCIHandleAlloc(m_pEnvHandle,(dvoid**)&pStmt,OCI_HTYPE_STMT,0,NULL)))
{
break;
}


if ( CheckError(OCIStmtPrepare(pStmt,m_pErrHandle,(const OraText *)sql_proc.c_str(),sql_proc.length(),OCI_NTV_SYNTAX,OCI_DEFAULT)) )
{
break;
}


if ( CheckError(OCIHandleAlloc(m_pEnvHandle, (void **)(&pCur), OCI_HTYPE_STMT, 0, NULL)) )
{
break;
}


if ( CheckError(OCIBindByPos(pStmt,&pBind, m_pErrHandle, 1, &pCur, 0,SQLT_RSET,
pIndicator0, 0,NULL, 0,0,OCI_DEFAULT)) )
{
break;
}


if( CheckError( OCIStmtExecute(m_pSvcHandle, pStmt, m_pErrHandle, 1, 0, NULL, NULL,
OCI_COMMIT_ON_SUCCESS) ) )
{
break;
}

//****************************************************************************
if ( CheckError(OCIDefineByPos(pCur,&pOciDefine1,m_pErrHandle,1,(void*)strMemberNo.data(),10,
SQLT_STR,pIndicator1, 0, 0,OCI_DEFAULT)) )
{
break;
}


if ( CheckError( OCIDefineByPos(pCur,&pOciDefine2, m_pErrHandle,2,(void*)strCompany.data(),200,
SQLT_STR,pIndicator2, 0, 0,OCI_DEFAULT)) )
{
break;
}


if ( CheckError(OCIDefineByPos(pCur,&pOciDefine3,m_pErrHandle,3,(void*)strName.data(),100,
SQLT_STR,pIndicator3, 0, 0,OCI_DEFAULT)) )
{
break;
}


if ( CheckError( OCIDefineByPos(pCur,&pOciDefine4, m_pErrHandle,4,(void*)strAddress.data(),1000,
SQLT_STR,pIndicator4, 0, 0,OCI_DEFAULT)) )
{
break;
}


if ( CheckError(OCIDefineByPos(pCur,&pOciDefine5,m_pErrHandle,5,(void*)strPhone.data(),100,
SQLT_STR,pIndicator5, 0, 0,OCI_DEFAULT)) )
{
break;
}


if ( CheckError( OCIDefineByPos(pCur,&pOciDefine6, m_pErrHandle,6,(void*)strWebsite.data(),1000,
SQLT_STR,&pIndicator6, 0, 0,OCI_DEFAULT)) )
{
break;
}


//*************************************************************************************


int ret;
while ((ret = OCIStmtFetch(pCur,m_pErrHandle, 1,OCI_FETCH_NEXT,OCI_DEFAULT)) == 0)
{
printf("fetched MemberNo: %s,Company: %s,Name: %s,address: %s,phone: %s,website: %s\n",strMemberNo.c_str(),strCompany.c_str(),
strName.c_str(),strAddress.c_str(),strPhone.c_str(),strWebsite.c_str());
}
printf("ret = %d\n",ret);


} while ( false );


下面讲一下OCI指示器变量,就是函数OCIDefineByPos的第8个参数:

现在要实现这样的功能!

create table tab1(a int, b varchar(10));

insert into tab1 values(1, ''abc'');

insert into tab1 values(2, ''abcd'');

insert into tab1 values(3, null);

insert into tab1 values(4, ''abcx'');

采用OCI一次bind来实现,由于其中有字段值为null,上次绕开了这个问题来实现的,现在没办法绕了就得解决。 今天学习了一下! (看来还是直面解决问题的好,今天不解决明天还是一样会来的)

sword OCIBindByPos ( OCIStmt      *stmtp,                      OCIBind      **bindpp,                     OCIError     *errhp,                     ub4          position,                     dvoid        *valuep,                     sb4          value_sz,                     ub2          dty,                     dvoid        *indp,                     ub2          *alenp,                     ub2          *rcodep,                     ub4          maxarr_len,                     ub4          *curelep,                      ub4          mode );
indp的合理使用就可以解决了,原来一致用NULL的。看看OCI文档就明白了,Input Indicator ValueAction Taken by Oracle-1Oracle assigns a NULL to the column, ignoring the value of the input variable.>=0Oracle assigns the value of the input variable to the column.

----------

下面是一篇不错的OCI文章! 引用了指示变量这一小部分!

指示器变量:

        由于在Oracle中,列值可以为NULL,但在C语言中没有NULL值,为了能使OCI程序表达NULL列值,OCI函数允许程序为所执行语句中的结合变量同时关联一个指示符变量或指示符变量数组,以说明所结合的占位符是否为 NULL或所读取的列值是否为NULL,以及所读取的列值是否被截取。

        除SQLT_NTY(SQL Named DataType)外,指示符变量或指示符变量数组的数据类型为sb2,其值说明:

        作为输入变量时:(如insert ,update语句中)

From: http://www.chinaunix.net/jh/19/530742.html


原创粉丝点击