OCCI三种更新数据方式比较

方法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
375833450250353101
698887122072005
345383421334746

方法2:必须知道迭代数量,最后一次executeUpdate,不能addIteration。

清理

if(stmt)
{
	conn->terminateStatement(stmt);
}

if(conn)
{
	env->terminateConnection(conn);
}

if(env)
{
	Environment::terminateEnvironment(env);
}

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值