c程序通过什么连接oracle一般C语言连接oracle数据库通过使用oracle提供的OCI接口和PROC编程接口两种方式 。
OCI方式纯粹是一些函数接口 。
PROC是oracle提供的一种C与ORACLE
SQL的混合编程 。程序(以.pc为后缀)编好之后,使用oracle提供的proc预编译程序,将pc文件编译成c文件(这一过程,相当于将SQL转换为OCI的接口),然后再使用c语言编译器生成可以执行文件 。
OCI方式不容易入门,它拥有大量的接口函数,要很快熟悉它 , 非常难 。但OCI方式的编程效率很高 。
porc方式简单易用 。可用于对性能要求不太高的项目 。
OCI使用的例子,要求完整代码 , 重点是OCIBindbypos的使用,ocibindbyname 。其实就是批量输入输出问题 。纯c语言oci函数你只要取多行是不纯c语言oci函数?
我给你一段代码参考
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_column1)
{
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++;
}
这个就是循环取数据
只是我这里用了链表 和把多个字段合成一个字段存入到了链表 取出来用纯c语言oci函数的时候再把多个字段分离
这个fetch 函数纯c语言oci函数的参数 OCI_FETCH_NEXT, 表示一次 取一条数据 不管你有多少列 一次取一条记录具体列数通过它返回的结构体力的num_column取得/
另外你所说的批量插入是啥意思 我后台程序 每30秒插入一次数据一次插入4096条 , 貌似没有什么批量的概念 。我不懂你的意思 我给你我插入数据的代码demo
int oci_excu(OCI_ENV *env,text *sql,int flag)
{
/******** OCIStmtPrepare() 解析SQL语句 **********/
if(OCIStmtPrepare(env-stmthp, env-errhp, sql, (ub4)strlen((char *)sql), OCI_NTV_SYNTAX, OCI_DEFAULT))
return 0;
/******** OCIStmtExecute() 执行SQL语句 **********/
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;
/******** OCITransCommit() 进行事务的提交,不提交回滚 **********/
if(flag)
{
if(OCITransCommit(env-svchp,env-errhp,(ub4)0))
return 0;
}
return 1;
}
if (distance0.0001)
{
sprintf(tName,"GPS_%d_Y",tf[k]); // 数据库表名
InsertHash(temp, pHash, MAX_REC2); // 插入
if(interval == 0 || interval420)
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 这个函数的介绍随便百度下好像都解释的很清楚了 你不明白的地方是哪里??
C语言,OCI多线程建立session的问题,需要一个多线程连接的示例代码 。。
推荐阅读
- 多功能电视怎么设置摄像头,电视摄像机怎么用
- jquery滑动对比,jquery滑动事件
- 类似与jquery,类似与凤行的仙侠文
- 小时候网页格斗小游戏大全,小时候玩的格斗电子游戏
- vb.net键盘扫码 vbs键盘代码
- oracle表关联自己更新,oracle多表关联
- redis查看列表数据,redis 查看list内容
- 1688直播伴侣,1688直播伴侣性能指标显示脱机状态怎么办
- go语言切片扩容技巧 go 切片添加切片