C语言是一门很受欢迎的编程语言,其与Oracle数据库的结合运用广泛。C语言提供了直接访问系统硬件、编写操作系统和编写高效程序等能力,而Oracle是一种强大的对象关系数据库管理系统,可以存储数据、管理数据、提供安全性和扩展性等。
在使用C语言写入Oracle时,我们通常会使用头文件,如oci.h、oratypes.h等。这些头文件提供了链接Oracle数据库的函数和数据类型,如连接、查询、事务等。下面是一段示例代码:
#include#include#includeint main()
{
OCIEnv *envhp;
OCIError *errhp;
OCIServer *srvhp;
OCISession *usrhp;
OCIStmt *stmthp;
OCIDefine *defhp;
//初始化环境
OCIInitialize(OCI_DEFAULT);
OCIEnvInit(&envhp, OCI_DEFAULT, 0, 0);
//分配错误句柄、服务器句柄和用户会话句柄
OCIHandleAlloc(envhp, (void **)&errhp, OCI_HTYPE_ERROR, 0, 0);
OCIHandleAlloc(envhp, (void **)&srvhp, OCI_HTYPE_SERVER, 0, 0);
OCIHandleAlloc(envhp, (void **)&usrhp, OCI_HTYPE_SESSION, 0, 0);
//连接到数据库,输入用户名和密码
OCIServerAttach(srvhp, errhp, (text *)"oracle.example.com:1521/ORCLCDB", strlen("oracle.example.com:1521/ORCLCDB"), OCI_DEFAULT);
OCIAttrSet(usrhp, OCI_HTYPE_SESSION, (void *)"username", strlen("username"), OCI_ATTR_USERNAME, errhp);
OCIAttrSet(usrhp, OCI_HTYPE_SESSION, (void *)"password", strlen("password"), OCI_ATTR_PASSWORD, errhp);
OCISessionBegin(srvhp, errhp, usrhp, OCI_CRED_RDBMS, OCI_DEFAULT);
//分配语句句柄
OCIHandleAlloc(envhp, (void **)&stmthp, OCI_HTYPE_STMT, 0, 0);
//执行查询语句
OCIStmtPrepare(stmthp, errhp, (text *)"SELECT * FROM test_table", strlen("SELECT * FROM test_table"), OCI_NTV_SYNTAX, OCI_DEFAULT);
OCIStmtExecute(srvhp, stmthp, errhp, 1, 0, 0, 0, OCI_DEFAULT);
//定义结果集
OCIHandleAlloc(envhp, (void **)&defhp, OCI_HTYPE_DEFINE, 0, 0);
OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT);
//释放资源
OCIHandleFree(stmthp, OCI_HTYPE_STMT);
OCISessionEnd(srvhp, errhp, usrhp, OCI_DEFAULT);
OCIHandleFree(usrhp, OCI_HTYPE_SESSION);
OCIHandleFree(srvhp, OCI_HTYPE_SERVER);
OCIHandleFree(errhp, OCI_HTYPE_ERROR);
OCIHandleFree(envhp, OCI_HTYPE_ENV);
return 0;
}
在此代码示例中,我们使用OCIServerAttach函数连接到Oracle数据库,并使用OCISessionBegin函数输入用户名和密码进行会话。然后我们使用OCIStmtPrepare函数预编译一个查询语句,并使用OCIStmtExecute函数执行该语句,最后使用OCIStmtFetch函数获取查询ResultSet并进行操作。最后,我们使用OCIHandleFree函数释放所有分配的资源。
除了查询之外,我们还可以使用C语言向Oracle数据库中写入数据。下面是一段使用OCIStmtExecute函数写入数据的示例代码:
int main()
{
OCIEnv *envhp;
OCIError *errhp;
OCIServer *srvhp;
OCISession *usrhp;
OCIStmt *stmthp;
//初始化环境
OCIInitialize(OCI_DEFAULT);
OCIEnvInit(&envhp, OCI_DEFAULT, 0, 0);
//分配错误句柄、服务器句柄和用户会话句柄
OCIHandleAlloc(envhp, (void **)&errhp, OCI_HTYPE_ERROR, 0, 0);
OCIHandleAlloc(envhp, (void **)&srvhp, OCI_HTYPE_SERVER, 0, 0);
OCIHandleAlloc(envhp, (void **)&usrhp, OCI_HTYPE_SESSION, 0, 0);
//连接到数据库,输入用户名和密码
OCIServerAttach(srvhp, errhp, (text *)"oracle.example.com:1521/ORCLCDB", strlen("oracle.example.com:1521/ORCLCDB"), OCI_DEFAULT);
OCIAttrSet(usrhp, OCI_HTYPE_SESSION, (void *)"username", strlen("username"), OCI_ATTR_USERNAME, errhp);
OCIAttrSet(usrhp, OCI_HTYPE_SESSION, (void *)"password", strlen("password"), OCI_ATTR_PASSWORD, errhp);
OCISessionBegin(srvhp, errhp, usrhp, OCI_CRED_RDBMS, OCI_DEFAULT);
//分配语句句柄
OCIHandleAlloc(envhp, (void **)&stmthp, OCI_HTYPE_STMT, 0, 0);
//执行插入语句
OCIStmtPrepare(stmthp, errhp, (text *)"INSERT INTO test_table(id, name) VALUES (:id, :name)", strlen("INSERT INTO test_table(id, name) VALUES (:id, :name)"), OCI_NTV_SYNTAX, OCI_DEFAULT);
//绑定参数
int id = 1;
char name[10] = "test";
OCIBind *bndhp;
OCIHandleAlloc(envhp, (void **)&bndhp, OCI_HTYPE_BIND, 0, 0);
OCIBindByName(stmthp, &bndhp, errhp, (text *)":id", strlen(":id"), &id, sizeof(id), SQLT_INT, 0, 0, 0, 0, OCI_DEFAULT);
OCIBindByName(stmthp, &bndhp, errhp, (text *)":name", strlen(":name"), name, sizeof(name), SQLT_STR, 0, 0, 0, 0, OCI_DEFAULT);
OCIStmtExecute(srvhp, stmthp, errhp, 1, 0, 0, 0, OCI_DEFAULT);
//释放资源
OCIHandleFree(stmthp, OCI_HTYPE_STMT);
OCISessionEnd(srvhp, errhp, usrhp, OCI_DEFAULT);
OCIHandleFree(usrhp, OCI_HTYPE_SESSION);
OCIHandleFree(srvhp, OCI_HTYPE_SERVER);
OCIHandleFree(errhp, OCI_HTYPE_ERROR);
OCIHandleFree(envhp, OCI_HTYPE_ENV);
return 0;
}
在此示例代码中,我们使用OCIStmtPrepare函数预编译一个插入语句,并使用OCIBindByName函数绑定参数。然后我们使用OCIStmtExecute函数执行该语句,并使用OCIHandleFree函数释放所有分配的资源。
总之,C语言结合Oracle数据库可以实现强大的功能。我们可以利用这种结合来读取和写入Oracle数据库,执行各种查询和操作,并管理数据库。