c++ - 使用 OCCI c++ 在 Oracle 数据库中批量写入
问题描述
我是 occi 的 Oracle 数据库新手。
我想知道如何在我的 C++ 代码中使用 occi 一次插入多行?
int createStatement(Connection* i_pDBConn)
{
int retVal = SUCCESS;
try
{
m_pDBStmt = i_pDBConn->createStatement("INSERT INTO RATED_EVENT_EPM VALUES (:1, :2, :3, :4, :5)");
}
catch(SQLException& ex)
{
cout<<__FILE__<<":"<<__LINE__<<" "<<ex.getMessage()<<endl;
retVal = FAILURE;
return retVal;
}
m_pDBStmt->setMaxIterations(1000);
m_pDBStmt->setMaxParamSize(1, 10);
return retVal;
}
int insertRatedEventDetailInDB(Connection* i_pDBConn, string i_string)
{
int retVal = SUCCESS;
try
{
m_pDBStmt->setString(1, i_string);
if((0 != m_pDBStmt->getCurrentIteration()) && 0 == (m_pDBStmt->getCurrentIteration()%1000))
{
m_pDBStmt->executeUpdate();
i_pDBConn->commit();
}
else
{
m_pDBStmt->addIteration();
}
}
catch(SQLException& ex)
{
cout<<__FILE__<<":"<<__LINE__<<" "<<ex.getMessage()<<endl;
retVal = FAILURE;
}
return retVal;
}
所以在创建语句单次之后,然后多次调用“insertRatedEventDetailInDB”函数来多次插入行,并且需要在每 1000 次之后执行。
解决方案
看起来您正在寻找 executeArrayUpdate():
如果所有数据都由 setDataBuffer() 方法或输出流提供(即,除了 setDataBuffer() 或 getStream() 之外没有调用 setxxx() 方法),则有一种简化的迭代执行方式。
在这种情况下,您不应调用 setMaxIterations() 和 setMaxParamSize()。相反,使用适当大小的数组为每个参数调用 setDataBuffer() 或 getStream() 方法,以便为每次迭代提供数据,然后调用 executeArrayUpdate(int arrayLength) 方法。arrayLength 参数指定每个缓冲区中提供的元素数。本质上,这与将迭代次数设置为 arrayLength 并执行语句相同。
有关更多详细信息,请参阅 Oracle 的文档 - https://docs.oracle.com/cd/E24693_01/appdev.11203/e10764/performance.htm