在c語言的開發(fā)中,使用數(shù)據(jù)庫(kù)是一個(gè)常見且關(guān)鍵的操作。Oracle數(shù)據(jù)庫(kù)作為企業(yè)級(jí)數(shù)據(jù)庫(kù)系統(tǒng),應(yīng)用廣泛且穩(wěn)定,如何通過C程序查詢Oracle數(shù)據(jù)庫(kù)是進(jìn)行數(shù)據(jù)操作的一個(gè)重要環(huán)節(jié)。本篇文章將詳細(xì)介紹如何使用C語言查詢Oracle數(shù)據(jù)庫(kù)。
連接Oracle數(shù)據(jù)庫(kù)
在使用C語言查詢Oracle數(shù)據(jù)庫(kù)之前,需要先建立連接。一般情況下,使用ODBC或者OCI連接Oracle數(shù)據(jù)庫(kù)會(huì)比較方便。以下是使用OCI連接數(shù)據(jù)庫(kù)的示例代碼:
OCIEnv *envhp; //環(huán)境句柄 OCIServer *srvhp; //服務(wù)器句柄 OCIError *errhp; //錯(cuò)誤句柄 OCISession *usrhp; //用戶句柄 OCISvcCtx *svchp; //服務(wù)句柄 OCIDefine *defhp; //查詢結(jié)果定義句柄 OCIBind *bindp; //綁定變量句柄 OCIStmt *stmthp; //語句句柄 sword retcode; //Oracle函數(shù)返回值 char *username; //Oracle用戶名 char *password; //Oracle用戶密碼 char *servername; //Oracle服務(wù)器名 //創(chuàng)建環(huán)境句柄 OCIEnvCreate(&envhp, OCI_OBJECT|OCI_THREADED, NULL, 0, NULL, NULL, 0, NULL); //創(chuàng)建錯(cuò)誤句柄 OCIHandleAlloc(envhp, (void **)&errhp, OCI_HTYPE_ERROR, 0, NULL); //創(chuàng)建服務(wù)器句柄 OCIHandleAlloc(envhp, (void **)&srvhp, OCI_HTYPE_SERVER, 0, NULL); //創(chuàng)建用戶句柄 OCIHandleAlloc(envhp, (void **)&usrhp, OCI_HTYPE_SESSION, 0, NULL); //創(chuàng)建服務(wù)句柄 OCIHandleAlloc(envhp, (void **)&svchp, OCI_HTYPE_SVCCTX, 0, NULL); //連接數(shù)據(jù)庫(kù) OCIAttrSet(srvhp, OCI_HTYPE_SERVER, servername, strlen(servername), OCI_ATTR_SERVER, errhp); OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, srvhp, 0, OCI_ATTR_SERVER, errhp); OCIAttrSet(usrhp, OCI_HTYPE_SESSION, username, strlen(username), OCI_ATTR_USERNAME, errhp); OCIAttrSet(usrhp, OCI_HTYPE_SESSION, password, strlen(password), OCI_ATTR_PASSWORD, errhp); retcode = OCISessionBegin(svchp, errhp, usrhp, OCI_CRED_RDBMS, OCI_DEFAULT); if (retcode) { OCIHandleFree(svchp, OCI_HTYPE_SVCCTX); OCIHandleFree(srvhp, OCI_HTYPE_SERVER); OCIHandleFree(errhp, OCI_HTYPE_ERROR); return -1; } OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, usrhp, 0, OCI_ATTR_SESSION, errhp);
查詢數(shù)據(jù)
連接好Oracle數(shù)據(jù)庫(kù)之后,就可以使用C程序查詢數(shù)據(jù)了。在使用OCI查詢Oracle數(shù)據(jù)庫(kù)時(shí),需要先使用OCIHandleAlloc為查詢結(jié)果定義句柄分配空間,然后使用OCIDefineByPos或者OCIDefineByNam將查詢結(jié)果與句柄綁定。以下是一個(gè)使用OCI查詢數(shù)據(jù)的示例:
char sql[512]; //SQL語句 int id; //查詢結(jié)果變量 OCIDefine *defhp; //查詢結(jié)果定義句柄 //創(chuàng)建語句句柄 OCIHandleAlloc(envhp, (void **)&stmthp, OCI_HTYPE_STMT, 0, NULL); //準(zhǔn)備SQL語句 sprintf(sql, "SELECT id FROM students WHERE name = 'Tom'"); //執(zhí)行SQL語句 OCIStmtPrepare(stmthp, errhp, (OraText *)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT); //為查詢結(jié)果變量定義句柄分配空間 OCIHandleAlloc(svchp, (void **)&defhp, OCI_HTYPE_DEFINE, 0, NULL); //將查詢結(jié)果變量與句柄綁定 OCIDefineByPos(stmthp, &defhp, errhp, 1, (void *)&id, sizeof(id), SQLT_INT, NULL, NULL, NULL, OCI_DEFAULT); //從數(shù)據(jù)庫(kù)中查詢數(shù)據(jù) OCIStmtExecute(svchp, stmthp, errhp, 1, 0, NULL, NULL, OCI_DEFAULT); //遍歷查詢結(jié)果 while (OCIStmtFetch2(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT) != OCI_NO_DATA) { printf("Tom's id is %d\n", id); }
斷開連接
在使用完Oracle數(shù)據(jù)庫(kù)之后,需要使用OCISessionEnd和OCIHandleFree斷開連接并釋放資源。以下是斷開連接的示例:
//斷開連接 OCISessionEnd(svchp, errhp, usrhp, OCI_DEFAULT); //釋放句柄資源 OCIHandleFree(svchp, OCI_HTYPE_SVCCTX); OCIHandleFree(usrhp, OCI_HTYPE_SESSION); OCIHandleFree(srvhp, OCI_HTYPE_SERVER); OCIHandleFree(stmthp, OCI_HTYPE_STMT); OCIHandleFree(envhp, OCI_HTYPE_ENV);
通過以上方法,我們可以在C程序中方便地查詢Oracle數(shù)據(jù)庫(kù)。需要注意的是,這只是使用OCI查詢Oracle數(shù)據(jù)庫(kù)的一個(gè)簡(jiǎn)單示例,實(shí)際操作中可能會(huì)有更多的細(xì)節(jié)要注意。