若干数十个列的大表的判断重复。批量操作,一般不精通OCI的够呛吧!
多线程的哦,可能好多线程进入,同时干不同的表,可不能在编译期静态展开绑定语句哦!
int emass_cch_verification::batchRepeatVerfi(DAU *txn_dau,char *records_malloc,int recordsize,char *stmt,int repeatRecord[],int &realSzie)
{
int ret;
OAD oad;//Oracle Array Describe
char *p;
char col_name[83],*p1;
//按主键判断判重表的记录
T_PkgType *tp=pkg_getType("ROWID",txn_dau->srm.tp);//取模板项
if( !tp )
{
EMASS_ERR("表 %s 的模板缺少 ROWID 列!",txn_dau->srm.tabname);
return -1;
}
if(recordsize==1)
{
//单条记录优化处理
ret=singleInsert(txn_dau,records_malloc,0,recordsize,stmt,repeatRecord,realSzie);
return ret<0?ret:recordsize-ret;
}
//now=now_usec();
OAD_init(&oad,txn_dau,records_malloc,recordsize);//OAD初始化
//做假update,通过update可以批量条件处理来查重
p=DAU_mk_update(txn_dau,stmt);
p1=(char *)txn_dau->srm.tp[0].name;
strtcpy(col_name,&p1,' ');
p+=sprintf(p,"SET %s=%s ",col_name,col_name); //假修改
p=mk_where(txn_dau->srm.pks,p);//按主键设置where条件
DAU_mk_returning(txn_dau,(char *)"ROWID",p);//生成returning子句 ,返回ROWID,重复记录时ROWID不为空
ret=OAD_mk_update(&oad,stmt); //生成语句,prepare,准备绑定区
if (ret==0)
{
ret=OAD_exec(&oad,0,recordsize);//执行批量
//EMASS_DEBUG("recordsize=%d repeatnumber=%d dealtime=%d",recordsize,ret,INTERVAL(now));//完全重复和完全不重复是最多的情况,部分重复是比较少的
【 在 ylh1969 的大作中提到: 】
: //将数组存储到DAU中
: for(j=0;j<recordsize;j++)
: {
: ...................
--
修改:ylh1969 FROM 221.221.54.*
FROM 221.221.54.*