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文档就明白了,
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
- OCI调用存储过程
- OCI调用存储过程
- OCI 调用Oracle 存储过程实现
- Oracle存储过程中某些分支漏了commit造成调用OCI接口OCIStmtExecute不返回
- 存储过程调用存储过程
- Ibatis调用存储过程调用存储过程
- Java调用存储过程
- 存储过程调用
- asp调用存储过程!
- Asp调用存储过程
- Java 调用存储过程
- Java 调用存储过程
- asp调用存储过程
- JAVA调用存储过程
- cognos调用存储过程
- asp调用存储过程
- 存储过程调用com
- asp调用存储过程
- 高性能电子商务网站架构设计实践
- 【IOS界面布局】横竖屏切换和控件自适应(推荐)
- OpenGL ES着色器语言之着色概览(官方文档第二章)
- OpenGl 资料
- 千万级并发实现的秘密:内核不是解决方案,而是问题所在!
- OCI调用存储过程
- FindBugs 错误信息汇总
- 有关The Last Promise的汉化②改写程序
- Ceph操作——监视OSD和PG
- 【PAT Advanced Level】1021. Deepest Root (25)
- sql 语句记录
- 利用GoAhead构建嵌入式web应用
- Jquery的高级应用总结
- OpenGL ES着色器语言之语言基础(官方文档第三章)