C语言操作Oracle数据库返回结果集技巧(c oracle结果集)
在开发中,有时需要使用C语言来操作Oracle数据库并返回结果集。本文将介绍一些操作Oracle数据库的技巧,并给出相应的代码示例。
1. 连接Oracle数据库
我们需要建立一个连接到Oracle数据库的会话。在C语言中,我们可以使用Oracle提供的OCI(Oracle Call Interface)库来进行连接。
OCI库提供了一些函数来方便地操作Oracle数据库。比如,我们可以使用OCILogon函数来建立一个数据库连接。
以下是建立连接的示例代码:
#include
#include
#include
int mn(int argc, char **argv) { OCIEnv *env;
OCIError *err; OCISvcCtx *svc;
OCIStmt *stmt; OCIHandle *handle;
char *username = "your_username"; char *password = "your_password";
char *dsn = "your_dsn";
printf("Connecting to Oracle database...\n");
if (OCIEnvCreate(&env, OCI_THREADED|OCI_OBJECT, NULL, NULL, NULL, NULL, 0, NULL) != OCI_SUCCESS) { printf("Fled to create environment handle.\n");
return 1; }
OCIHandleAlloc(env, (void**)&err, OCI_HTYPE_ERROR, 0, NULL); OCIHandleAlloc(env, (void**)&svc, OCI_HTYPE_SVCCTX, 0, NULL);
OCIHandleAlloc(env, (void**)&stmt, OCI_HTYPE_STMT, 0, NULL);
if (OCILogon(env, err, &svc, username, strlen(username), password, strlen(password), dsn, strlen(dsn)) != OCI_SUCCESS) { printf("Fled to connect to database.\n");
return 1; }
printf("Connected to Oracle database successfully.\n");
return 0;}
在以上代码中,我们首先创建了一个OCI环境句柄,然后分别分配了错误句柄、服务句柄和语句句柄。接着调用OCILogon函数连接到数据库,连接成功后打印一条连接成功的消息。
2. 查询数据
在连接到Oracle数据库后,我们可以使用OCIStmtPrepare函数准备一个SQL语句,并使用OCIStmtExecute函数执行这个SQL语句并获取结果集。
以下是一个查询数据的示例代码:
#include
#include
#include
int mn(int argc, char **argv) { OCIEnv *env;
OCIError *err; OCISvcCtx *svc;
OCIStmt *stmt; OCIHandle *handle;
char *username = "your_username"; char *password = "your_password";
char *dsn = "your_dsn";
printf("Connecting to Oracle database...\n");
if (OCIEnvCreate(&env, OCI_THREADED|OCI_OBJECT, NULL, NULL, NULL, NULL, 0, NULL) != OCI_SUCCESS) { printf("Fled to create environment handle.\n");
return 1; }
OCIHandleAlloc(env, (void**)&err, OCI_HTYPE_ERROR, 0, NULL); OCIHandleAlloc(env, (void**)&svc, OCI_HTYPE_SVCCTX, 0, NULL);
OCIHandleAlloc(env, (void**)&stmt, OCI_HTYPE_STMT, 0, NULL);
if (OCILogon(env, err, &svc, username, strlen(username), password, strlen(password), dsn, strlen(dsn)) != OCI_SUCCESS) { printf("Fled to connect to database.\n");
return 1; }
printf("Connected to Oracle database successfully.\n");
char *sql = "select * from your_table"; ub4 sql_len = strlen(sql);
if (OCIStmtPrepare(stmt, err, (unsigned char*)sql, sql_len, OCI_NTV_SYNTAX, OCI_DEFAULT) != OCI_SUCCESS) { printf("Fled to prepare SQL statement: %s\n", sql);
return 1; }
if (OCIStmtExecute(svc, stmt, err, 0, 0, NULL, NULL, OCI_DEFAULT) != OCI_SUCCESS) { printf("Fled to execute SQL statement: %s\n", sql);
return 1; }
OCIParam *param; ub2 cols;
ub2 type; ub4 size;
if (OCIStmtFetch2(stmt, err, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT) != OCI_SUCCESS) { printf("No data found.\n");
return 1; }
if (OCIAttrGet(stmt, OCI_HTYPE_STMT, &cols, NULL, OCI_ATTR_PARAM_COUNT, err) != OCI_SUCCESS) { printf("Fled to get columns count.\n");
return 1; }
printf("Query result:\n");
for (int i = 1; i if (OCIParamGet(stmt, OCI_HTYPE_STMT, err, (void**)¶m, i) != OCI_SUCCESS) {
printf("Fled to get column parameter.\n"); return 1;
}
if (OCIAttrGet(param, OCI_DTYPE_PARAM, &type, NULL, OCI_ATTR_DATA_TYPE, err) != OCI_SUCCESS) { printf("Fled to get column data type.\n");
return 1; }
if (OCIAttrGet(param, OCI_DTYPE_PARAM, &size, NULL, OCI_ATTR_DATA_SIZE, err) != OCI_SUCCESS) { printf("Fled to get column data size.\n");
return 1; }
char *name; ub4 name_len;
if (OCIAttrGet(param, OCI_DTYPE_PARAM, &name, &name_len, OCI_ATTR_NAME, err) != OCI_SUCCESS) { printf("Fled to get column name.\n");
return 1; }
printf("%-*.*s", size, size, name); }
printf("\n");
for (int i = 1; i printf("-----------------");
}
printf("\n");
do { for (int i = 1; i
void *value; ub4 length;
OCIParamGet(stmt, OCI_HTYPE_STMT, err, (void**)¶m, i);
if (OCIAttrGet(param, OCI_DTYPE_PARAM, &type, NULL, OCI_ATTR_DATA_TYPE, err) != OCI_SUCCESS) { printf("Fled to get column data type.\n");
return 1; }
if (OCIAttrGet(param, OCI_DTYPE_PARAM, &size, NULL, OCI_ATTR_DATA_SIZE, err) != OCI_SUCCESS) { printf("Fled to get column data size.\n");
return 1; }
value = calloc(1, size + 1);
if (OCIStmtGetPieceInfo(stmt, err, value, &length, OCI_HTYPE_STMT, i, OCI_ONE_PIECE, NULL) != OCI_SUCCESS) { printf("Fled to get piece info.\n");
return 1; }
if (OCIStmtFetch2(stmt, err, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT) != OCI_SUCCESS) { break;
}
printf("%-*.*s", size, size, (char*)value);
free(value); }
printf("\n"); } while (OCIStmtFetch2(stmt, err, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT) == OCI_SUCCESS);
OCIHandleFree(handle, OCI_HTYPE_STMT);
OCILogoff(svc, env); OCIHandleFree(handle, OCI_HTYPE_SVCCTX);
OCIHandleFree(handle, OCI_HTYPE_ERROR); OCIHandleFree(handle, OCI_HTYPE_ENV);
return 0;}
在以上代码中,我们首先准备了一个SQL语句来查询数据库中的数据。接着使用OCIStmtPrepare函数准备语句,使用OCIStmtExecute函数执行语句并获取结果集。
在获取结果集后,我们使用OCIStmtFetch2函数遍历结果集并获取其中的数据。在获取数据时,我们还需要先使用OCIParamGet函数获取参数句柄,再使用OCIAttrGet函数获取对应的属性,如数据类型、数据大小和列名等。
在获取每个列的数据时,我们使用了OCIStmtGetPieceInfo函数和OCIStmtFetch2函数来获取结果集中的每一行数据。最后再释放相关资源。
3. 总结
本文介绍了如何在C语言中操作Oracle数据库并返回结果集。我们首先使用OCI库建立连接,然后使用OCIStmtPrepare函数准备SQL语句,使用OCIStmtExecute函数执行语句并获取结果集。在获取结果集后,我们使用OCIStmtFetch2函数遍历结果集并获取其中的数据。最后释放相关资源。
在实际开发中,我们需要注意OCI库的使用方式和相关错误处理。同时还需要根据实际需求进行相应的参数设置和优化。