方法1:最基本的使用executeUpdate,多条记录后提交事务。示意代码如下:
Environment *env = Environment::createEnvironment("ZHS16GBK", "UTF8");
Connection *conn = env->createConnection("scott", "tiger", "127.0.0.1/orclxxx");
Statement *stmt = conn->createStatement("INSERT INTO TEST VALUES(:1,:2,:3)");
for(int i = 0; i < OCCI_MAX_ARRAY_SIZE; ++i)
{
stmt->setString(1U, vi[i]);
stmt->setString(2U, vmi[i]);
stmt->setDate(3U, date[i]);
stmt->executeUpdate();
}
conn->commit();
方法2:使用setMaxIterations批量更新多条记录。示意代码如下:
stmt->setSQL("INSERT INTO TEST VALUES(:1,:2,:3)");
stmt->setMaxIterations(OCCI_MAX_ARRAY_SIZE);
stmt->setMaxParamSize(1U, 64U);
stmt->setMaxParamSize(2U, 20U);
for(int i = 0; i < OCCI_MAX_ARRAY_SIZE; ++i)
{
stmt->setString(1U, vi[i]);
stmt->setString(2U, vmi[i]);
stmt->setDate(3U, date[i]);
if(i != OCCI_MAX_ARRAY_SIZE - 1)
{
stmt->addIteration();
}
}
stmt->executeUpdate();
conn->commit();
注意:按照上面的顺序执行,否则可能出错。
方法3:使用SetDataBuffer,示例代码如下:
stmt->setSQL("INSERT INTO TEST VALUES(:1,:2,:3)");
ub2 ub2vi[OCCI_MAX_ARRAY_SIZE];
char vi[OCCI_MAX_ARRAY_SIZE][64];
Date date[OCCI_MAX_ARRAY_SIZE];
int sno[OCCI_MAX_ARRAY_SIZE];
//先给数组赋值
for(int i = 0; i < OCCI_MAX_ARRAY_SIZE; ++i)
{
strcpy_s(vi[i], "xxxx");
date[i].fromText("2017-01-01", "YYYY-MM-DD", "", env);
sno[i] = i+1;
ub2vi[i] = strlen(vi[i]) + 1; //长度包含字符串结束符
}
//这个必须传入,因为每实际每个字符串可能不同
stmt->setDataBuffer(1U, &vi, OCCI_SQLT_STR, sizeof(vi[0]), ub2vi);
//单个长度不变因此不用传入参数
stmt->setDataBuffer(2U, &date, OCCI_SQLT_DAT, 7, NULL);
stmt->setDataBuffer(3U, &sno, OCCIINT, sizeof(int), NULL);
stmt->executeArrayUpdate(OCCI_MAX_ARRAY_SIZE);
conn->commit();
说明OCI_MAX_ARRAY_SIZE宏定义512。
性能比较结果(单位:微妙):
方法1 | 方法2 | 方法3 |
375833 | 450250 | 353101 |
69888 | 71220 | 72005 |
34538 | 34213 | 34746 |
方法2:必须知道迭代数量,最后一次executeUpdate,不能addIteration。
清理
if(stmt)
{
conn->terminateStatement(stmt);
}
if(conn)
{
env->terminateConnection(conn);
}
if(env)
{
Environment::terminateEnvironment(env);
}