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**)&param, 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**)&param, 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库的使用方式和相关错误处理。同时还需要根据实际需求进行相应的参数设置和优化。


数据运维技术 » C语言操作Oracle数据库返回结果集技巧(c oracle结果集)