C语言与Oracle查询功能实现(c 和oracle查询)
C语言与Oracle查询功能实现
C语言作为一门广泛运用于系统开发的高级编程语言,常常与数据库管理系统相结合,提供强大的数据读写能力。而Oracle作为业界领先的关系型数据库管理系统之一,它的复杂性和高扩展性,使其成为了众多企业级应用的首选数据库。因此,本文将探讨如何利用C语言与Oracle相结合,实现便捷高效的数据查询功能。
一、Oracle数据库的连接
在使用C语言与Oracle进行交互之前,首先需要建立一个有效的数据库连接。下面是一个简单的连接过程:
“`c
#include
#define MAX_NAME_LEN 50
int mn()
{
OCIEnv *envhp;
OCIError *errhp;
OCIServer *srvhp;
OCISession *authp;
OCIStmt *stmthp;
OCIDefine *defhp;
OCIParam *parmh = NULL;
sword status;
char oradb[MAX_NAME_LEN] = “ORCL”;
char username[MAX_NAME_LEN] = “user”;
char password[MAX_NAME_LEN] = “password”;
/* 初始化环境句柄 */
status = OCIEnvCreate(&envhp, OCI_DEFAULT, NULL, NULL, NULL, NULL, 0, NULL);
if (status != OCI_SUCCESS)
{
printf(“ERROR: OCIEnvCreate fled\n”);
return 1;
}
/* 创建错误句柄 */
status = OCIHandleAlloc(envhp, (dvoid **)&errhp, OCI_HTYPE_ERROR, 0, NULL);
if (status != OCI_SUCCESS)
{
printf(“ERROR: OCIHandleAlloc (error) fled\n”);
return 1;
}
/* 创建服务器上下文句柄 */
status = OCIHandleAlloc(envhp, (dvoid **)&srvhp, OCI_HTYPE_SERVER, 0, NULL);
if (status != OCI_SUCCESS)
{
printf(“ERROR: OCIHandleAlloc (server) fled\n”);
return 1;
}
/* 指定数据库连接串 */
status = OCIServerAttach(srvhp, errhp, (const OraText *)oradb, strlen(oradb), OCI_DEFAULT);
if (status != OCI_SUCCESS)
{
printf(“ERROR: OCIServerAttach fled\n”);
return 1;
}
/* 创建用户认证句柄 */
status = OCIHandleAlloc(envhp, (dvoid **)&authp, OCI_HTYPE_SESSION, 0, NULL);
if (status != OCI_SUCCESS)
{
printf(“ERROR: OCIHandleAlloc (session) fled\n”);
return 1;
}
/* 设置用户名和密码 */
status = OCIAttrSet(authp, OCI_HTYPE_SESSION, (const void *)username, strlen(username), OCI_ATTR_USERNAME, errhp);
status = OCIAttrSet(authp, OCI_HTYPE_SESSION, (const void *)password, strlen(password), OCI_ATTR_PASSWORD, errhp);
/* 开始用户认证 */
status = OCISessionBegin(srvhp, errhp, authp, OCI_CRED_RDBMS, OCI_DEFAULT);
if (status != OCI_SUCCESS)
{
printf(“ERROR: OCISessionBegin fled\n”);
return 1;
}
/* 创建语句句柄 */
status = OCIHandleAlloc(envhp, (dvoid **)&stmthp, OCI_HTYPE_STMT, 0, NULL);
if (status != OCI_SUCCESS)
{
printf(“ERROR: OCIHandleAlloc (statement) fled\n”);
return 1;
}
/* 释放资源 */
OCIHandleFree(envhp, OCI_HTYPE_STMT, (dvoid *)stmthp);
OCIHandleFree(envhp, OCI_HTYPE_SESSION, (dvoid *)authp);
OCIHandleFree(envhp, OCI_HTYPE_SERVER, (dvoid *)srvhp);
OCIHandleFree(envhp, OCI_HTYPE_ERROR, (dvoid *)errhp);
OCIHandleFree(envhp, OCI_HTYPE_ENV, (dvoid *)envhp);
return 0;
}
上述代码首先创建一个环境句柄,再创建一个错误句柄,接着创建服务器上下文句柄,并通过OCIServerAttach()函数连接到指定的数据库。接下来创建一个用户认证句柄,并通过OCIAttrSet()函数设置用户名和密码。然后,通过OCISessionBegin()函数开始与数据库的会话。我们还需要创建一个语句句柄。
二、执行SQL查询
在创建完数据库连接之后,我们就可以向Oracle数据库发送SQL语句,并读取返回的数据了。下面是一个简单的查询过程:
```c#define MAX_NAME_LEN 50
int mn(){
OCIEnv *envhp; OCIError *errhp;
OCIServer *srvhp; OCISession *authp;
OCIStmt *stmthp; OCIDefine *defhp;
OCIParam *parmh = NULL; sword status;
char oradb[MAX_NAME_LEN] = "ORCL"; char username[MAX_NAME_LEN] = "user";
char password[MAX_NAME_LEN] = "password";
/* 创建连接 */
/* 准备SQL语句 */ char sql_stmt[MAX_NAME_LEN] = "SELECT * FROM customers";
int sql_stmt_len = strlen(sql_stmt);
/* 在语句句柄中执行SQL查询 */ status = OCIStmtPrepare(stmthp, errhp, (const OraText *)sql_stmt, sql_stmt_len, OCI_NTV_SYNTAX, OCI_DEFAULT);
if (status != OCI_SUCCESS) {
printf("ERROR: OCIStmtPrepare fled\n"); return 1;
}
/* 执行查询 */ status = OCIStmtExecute(srvhp, stmthp, errhp, OCI_DEFAULT, OCI_COMMIT_ON_SUCCESS);
if (status != OCI_SUCCESS) {
printf("ERROR: OCIStmtExecute fled\n"); return 1;
}
/* 读取查询结果 */ while (OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT) == OCI_SUCCESS)
{ /* 读取数据 */
}
/* 释放资源 */
return 0;}
上述代码首先创建了一个SQL语句:查询名为“customers”的表的所有数据。然后通过OCIStmtPrepare()函数将该语句准备好。随后通过OCIStmtExecute()函数执行SQL查询,并将其结果保存到语句句柄中。最后通过OCIStmtFetch()函数读取查询结果,进行后续处理。
三、通过OCI API读取查询结果
当我们成功执行SQL查询并将结果保存到语句句柄中之后,就可以读取其中的数据了。我们可以通过OCI API的OCIDefineByPos()函数指定我们想要读取的列,然后使用OCIAttrGet()函数进行读取。
下面是一个示例代码,它可以读取查询结果中的数据并打印出来:
“`c
#define MAX_NAME_LEN 50
int mn()
{
OCIEnv *envhp;
OCIError *errhp;
OCIServer *srvhp;
OCISession *authp;
OCIStmt *stmthp;
OCIDefine *defhp;
OCIParam *parmh = NULL;
sword status;
char oradb[MAX_NAME_LEN] = “ORCL”;
char username[MAX_NAME_LEN] = “user”;
char password[MAX_NAME_LEN] = “password”;
/* 创建连接 */
/* 准备SQL语句 */
/* 在语句句柄中执行SQL查询 */
/* 指定读取列 */
char cust_name[MAX_NAME_LEN] = {0};
OCIDefine *defhp = NULL;
status = OCIDefineByPos(stmthp, &defhp, errhp, 1, (void *)cust_name, sizeof(cust_name), SQLT_STR, NULL, NULL, NULL, OCI_DEFAULT);
if (status != OCI_SUCCESS)
{
printf(“ERROR: OCIDefineByPos fled\n”);
return 1;
}
/* 读取查询结果 */
while (OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT) == OCI_SUCCESS)
{
/* 读取数据 */
printf(“Customer name: %s\n”, cust_name);
}
/* 释放资源 */
return 0;
}
上述代码中,我们首先通过OCIDefineByPos()函数指定我们希望读取查询结果的第一列(即客户名称),并将其存储到一个名为cust_name的变量中。然后我们可以在while循环中使用OCIStmtFetch()函数读取查询结果,通过printf()