c 执行oracle游标

2023年 8月 4日 71.3k 0

执行Oracle游标是C语言开发人员操作Oracle数据库的重要技能之一。

游标是Oracle数据库中用来处理和获取数据的重要工具。在C程序中,当需要获取Oracle数据库中的数据时,使用游标可以指定获取某个表中的某些数据,或者获取数据库中多个表中的相关数据。使用游标可以避免一次性获取大量的数据,从而提高程序的性能。

下面是使用C语言执行Oracle游标的示例代码:

#include#include#include#includeint main() {
OCIEnv *env;
OCISrvCtx *srv;
OCIError *err;
OCISession *ses;
OCISvcCtx *svc;
OCIStmt *stmt;
OCIStmt *stmt1;
OCIDefine *def;
OCIBind *bind;
OCIParam *param;
sword status;
char user[50];
char pass[50];
char dbname[50];
char query[256];
char temp[50];
int id;
int count;
char name[50];
double price;
//初始化OCI环境、服务上下文、错误句柄等
OCIEnvCreate(&env, OCI_THREADED|OCI_OBJECT, NULL, NULL, NULL, NULL, 0, NULL);
OCIHandleAlloc(env, (void**)&srv, OCI_HTYPE_SERVER, 0, NULL);
OCIHandleAlloc(env, (void**)&err, OCI_HTYPE_ERROR, 0, NULL);
OCIHandleAlloc(env, (void**)&ses, OCI_HTYPE_SESSION, 0, NULL);
OCIHandleAlloc(env, (void**)&svc, OCI_HTYPE_SVCCTX, 0, NULL);
OCIHandleAlloc(env, (void**)&stmt, OCI_HTYPE_STMT, 0, NULL);
OCIHandleAlloc(env, (void**)&stmt1, OCI_HTYPE_STMT, 0, NULL);
//指定数据库用户名、密码、连接字符串
strcpy(user, "scott");
strcpy(pass, "tiger");
strcpy(dbname, "ORCL");
//连接数据库
OCILogon2(env, err, &svc, user, strlen(user), pass, strlen(pass), dbname, strlen(dbname), OCI_DEFAULT);
//创建游标
sprintf(query, "BEGIN OPEN :1 FOR SELECT * FROM PRODUCTS; END;");
OCIStmtPrepare(stmt1, err, query, strlen(query), OCI_NTV_SYNTAX, OCI_DEFAULT);
OCIStmtExecute(svc, stmt1, err, 1, 0, NULL, NULL, OCI_STMT_SCROLLABLE_READONLY);
OCIParamGet(stmt1, OCI_HTYPE_STMT, err, (void**)&param, 1);
//设置游标
OCIAttrGet(param, OCI_DTYPE_PARAM, (void**)&stmt, 0, OCI_ATTR_CURSOR, err);
sprintf(query, "FETCH :1 INTO :2, :3, :4;");
OCIStmtPrepare(stmt, err, query, strlen(query), OCI_NTV_SYNTAX, OCI_DEFAULT);
//绑定游标参数
OCIBindByName(stmt, &bind, err, (OraText *) ":1", strlen(":1"), (void *) &id, sizeof(int), SQLT_INT, NULL, NULL, NULL, 0, NULL, OCI_DEFAULT);
OCIAttrSet(bind, OCI_HTYPE_BIND, (void*)&def, 0, OCI_ATTR_DEFINE, err);
OCIAttrSet(def, OCI_DTYPE_PARAM, (void*)&count, sizeof(count), OCI_ATTR_DATA_SIZE, err);
//绑定结果集参数
OCIBindByName(stmt, &bind, err, (OraText *) ":2", strlen(":2"), (void *)name, sizeof(name), SQLT_STR, NULL, NULL, NULL, 0, NULL, OCI_DEFAULT);
OCIAttrSet(bind, OCI_HTYPE_BIND, (void*)&def, 0, OCI_ATTR_DEFINE, err);
OCIAttrSet(def, OCI_DTYPE_PARAM, (void*)&count, sizeof(count), OCI_ATTR_DATA_SIZE, err);
OCIBindByName(stmt, &bind, err, (OraText *) ":3", strlen(":3"), (void *) &price, sizeof(double), SQLT_FLT, NULL, NULL, NULL, 0, NULL, OCI_DEFAULT);
OCIAttrSet(bind, OCI_HTYPE_BIND, (void*)&def, 0, OCI_ATTR_DEFINE, err);
OCIAttrSet(def, OCI_DTYPE_PARAM, (void*)&count, sizeof(count), OCI_ATTR_DATA_SIZE, err);
//执行游标
OCIStmtExecute(svc, stmt, err, 0, 0, NULL, NULL, OCI_FETCH_NEXT);
while (status != OCI_NO_DATA) {
printf("Product ID: %d, Product Name: %s, Product Price: %0.2f\n", id, name, price);
status = OCIStmtFetch2(stmt, err, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT);
}
//关闭游标和数据库连接
OCIStmtClose(stmt, err);
OCIStmtClose(stmt1, err);
OCILogoff(svc, err);
OCIHandleFree(srv, OCI_HTYPE_SERVER);
OCIHandleFree(err, OCI_HTYPE_ERROR);
OCIHandleFree(ses, OCI_HTYPE_SESSION);
OCIHandleFree(svc, OCI_HTYPE_SVCCTX);
OCIHandleFree(stmt, OCI_HTYPE_STMT);
OCIHandleFree(stmt1, OCI_HTYPE_STMT);
return 0;
}

以上代码实现了对Oracle数据库中表 PRODUCTS 的查询,并且使用游标将查询结果集返回到C程序中。

代码执行流程为:初始化OCI环境、服务上下文、错误句柄等,指定数据库用户名、密码、连接字符串,连接数据库,创建游标,设置游标,绑定游标参数与结果集参数,执行游标并输出结果集,关闭游标和数据库连接。

以上是使用C语言执行Oracle游标的方法,希望对需要进行此类开发的开发人员提供帮助。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论