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()

数据运维技术 » C语言与Oracle查询功能实现(c 和oracle查询)