中易网

OCI使用的例子,要求完整代码,重点是OCIBindbypos的使用,ocibindbyname。其实就是批量输入输出问题。

答案:2  悬赏:60  
解决时间 2021-01-16 23:27
  • 提问者网友:难遇难求
  • 2021-01-16 01:21
OCI使用的例子,要求完整代码,重点是OCIBindbypos的使用,ocibindbyname。其实就是批量输入输出问题。
最佳答案
  • 二级知识专家网友:佘樂
  • 2021-01-16 02:03
你只要取多行是不?
我给你一段代码参考

while (OCIStmtFetch(env->stmthp, env->errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT) != OCI_NO_DATA)
{
count = data->num_column;
DataLink = (CHECK_DATA *) malloc(sizeof(CHECK_DATA));
len = 0;
if(data->num_column > 1)
{
while (count--)
{
sprintf(&((DataLink->buf)[len]), "%s%c", data->buf[count],'$');
len += strlen(data->buf[count])+1;
}
}
else
sprintf(DataLink->buf, "%s", data->buf[0]);
DataLink->next = NULL;
DataLink->next = head->next;
head->next = DataLink;
data->num_row++;
}

这个就是循环取数据
只是我这里用了链表 和把多个字段合成一个字段存入到了链表 取出来用的时候再把多个字段分离
这个fetch 函数的参数 OCI_FETCH_NEXT, 表示一次 取一条数据 不管你有多少列 一次取一条记录 具体列数通过它返回的结构体力的num_column取得/

另外你所说的批量插入是啥意思 我后台程序 每30秒插入一次数据一次插入4096条,貌似没有什么批量的概念。我不懂你的意思 我给你我插入数据的代码demo

int oci_excu(OCI_ENV *env,text *sql,int flag)
{

if(OCIStmtPrepare(env->stmthp, env->errhp, sql, (ub4)strlen((char *)sql), OCI_NTV_SYNTAX, OCI_DEFAULT))
return 0;

if(OCIStmtExecute(env->svchp, env->stmthp, env->errhp, (ub4) 1, (ub4) 0,(CONST OCISnapshot *) NULL,(OCISnapshot *) NULL, OCI_DEFAULT | OCI_COMMIT_ON_SUCCESS))
return 0;

if(flag)
{

if(OCITransCommit(env->svchp,env->errhp,(ub4)0))
return 0;
}
return 1;
}

if (distance > 0.0001)
{
sprintf(tName,"GPS_%d_Y",tf[k]); // 数据库表名
InsertHash(temp, pHash, MAX_REC<<2); // 插入
if(interval == 0 || interval > 420)
node = 1;
else
node = 0;
sprintf(sql,"insert into %s (id,tm_id,lon,lat, speed,utc_time,udate,mileage,DIRECTION,DISTANCE,INTERVAL,node,term_stat,RESERVE,reserve1) values (seq_gps.nextVal,'%s','%f','%f','%f','%d','%d','%f','%d','%f','%d','%d','%d','%s','%s')",
tName,GpsRec[i].tid,GpsRec[i].lon,GpsRec[i].lat,GpsRec[i].speed,GpsRec[i].utime,GpsRec[i].udate,GpsRec[i].mileage,GpsRec[i].dir,distance,interval,node,GpsRec[i].stat,GpsRec[i].alltime,dirc[GpsRec[i].dir]);
// printf("%s\n",sql);
sem_wait(&sem_or); // 挂起信号
oci_excu(oracle_env,(text *)sql,0); // 插入数据
sem_post(&sem_or); // 信号解锁
memset(tName,0x00,10);
}

循环插入数据即可 你所指批量莫非就是这个意思? 另外OCIDefineByPos 这个函数的介绍随便百度下好像都解释的很清楚了 你不明白的地方是哪里??追问你只要取多行是不?
我给你一段代码参考

while (OCIStmtFetch(env->stmthp, env->errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT) != OCI_NO_DATA)
你这个还是一次一行啊。把1该为100就是一次取100行了的说。我每次取100行,遇到列值为空,可能是指示器没设置好,程序挂了。不过你后面说的那个30秒插入一次数据一次插入4096条就是我要的技术!!我现在做的这个项目插入数据量大,查询我估计while循环一次一条也能满足要求!
全部回答
  • 1楼网友:有你哪都是故乡
  • 2021-01-16 02:40
NO追问你只要取多行是不?
我给你一段代码参考
while (OCIStmtFetch(env->stmthp, env->errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT) != OCI_NO_DATA)
你这个还是一次一行啊。把1该为100就是一次取100行了的说。我每次取100行,遇到列值为空,可能是指示器没设置好,程序挂了。不过你后面说的那个30秒插入一次数据一次插入4096条就是我要的技术!!我现在做的这个项目插入数据量大,查询我估计while循环一次一条也能满足要求!
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息