Oracle是一種被廣泛使用的關系型數據庫系統,而C語言則是一種被廣泛應用于系統編程和嵌入式設備上的高級編程語言。為了方便使用Oracle數據庫系統,在C語言開發中經常會出現用C語言與Oracle數據庫進行直接交互的情況,為了更加方便使用,C語言中也出現了用來封裝Oracle的庫。
下面給出一個封裝好的Oracle數據庫庫的例子:
#include#include #include #include typedef struct { OCIEnv* p_env; OCIError* p_err; OCISvcCtx* p_svc; OCIStmt* p_stmt; OCIDefine* p_define; OCIBind* p_bind; OCIServer* p_server; OCISession* p_session; OCIParam* p_param; ub4 n_nrows; ub2 n_ncols; } ConnInfo; ConnInfo* OracleConnect(const char* sz_dbname, const char* sz_user, const char* sz_pwd) { ConnInfo* conn = NULL; OCIEnv* env = NULL; OCIError* err = NULL; OCISvcCtx* svc = NULL; OCIServer* server = NULL; OCISession* session = NULL; sword s_ret = OCI_SUCCESS; const char* sz_db = "192.168.1.100:1521/orcl"; if (OCIEnvCreate(&env, OCI_THREADED|OCI_OBJECT, NULL, NULL, NULL, NULL, 0, NULL)) { printf("OCIEnvCreate Error!\n"); return NULL; } if (OCIHandleAlloc(env, (void**)&err, OCI_HTYPE_ERROR, 0, NULL)) { printf("OCIHandleAlloc OCI_HTYPE_ERROR Error!\n"); return NULL; } if (OCIHandleAlloc(env, (void**)&server, OCI_HTYPE_SERVER, 0, NULL)) { printf("OCIHandleAlloc OCI_HTYPE_SERVER Error!\n"); return NULL; } s_ret = OCIServerAttach(server, err, (OraText*)sz_dbname, strlen(sz_dbname), 0); if (s_ret != OCI_SUCCESS) { if (s_ret == OCI_INVALID_HANDLE) { printf("OCIServerAttach OCI_INVALID_HANDLE Error!\n"); } else if (s_ret == OCI_SUCCESS_WITH_INFO) { printf("OCIServerAttach OCI_SUCCESS_WITH_INFO Error!\n"); } else { printf("OCIServerAttach Error!\n"); } return NULL; } if (OCIHandleAlloc(env, (void**)&session, OCI_HTYPE_SESSION, 0, NULL)) { printf("OCIHandleAlloc OCI_HTYPE_SESSION Error!\n"); return NULL; } if (OCIAttrSet(session, OCI_HTYPE_SESSION, (void*)sz_user, strlen(sz_user), OCI_ATTR_USERNAME, err)) { printf("OCIAttrSet OCI_ATTR_USERNAME Error!\n"); return NULL; } if (OCIAttrSet(session, OCI_HTYPE_SESSION, (void*)sz_pwd, strlen(sz_pwd), OCI_ATTR_PASSWORD, err)) { printf("OCIAttrSet OCI_ATTR_PASSWORD Error!\n"); return NULL; } s_ret = OCISessionBegin(svc, err, session, OCI_CRED_RDBMS, OCI_DEFAULT); if (s_ret != OCI_SUCCESS) { if (s_ret == OCI_INVALID_HANDLE) { printf("OCISessionBegin OCI_INVALID_HANDLE Error!\n"); } else if (s_ret == OCI_SUCCESS_WITH_INFO) { printf("OCISessionBegin OCI_SUCCESS_WITH_INFO Error!\n"); } else { printf("OCISessionBegin Error!\n"); } return NULL; } if (OCIHandleAlloc(env, (void**)&svc, OCI_HTYPE_SVCCTX, 0, NULL)) { printf("OCIHandleAlloc OCI_HTYPE_SVCCTX Error!\n"); return NULL; } if (OCIAttrSet(svc, OCI_HTYPE_SVCCTX, (void*)server, sizeof(server), OCI_ATTR_SERVER, err)) { printf("OCIAttrSet OCI_ATTR_SERVER Error!\n"); return NULL; } if (OCIAttrSet(svc, OCI_HTYPE_SVCCTX, (void*)session, sizeof(session), OCI_ATTR_SESSION, err)) { printf("OCIAttrSet OCI_ATTR_SESSION Error!\n"); return NULL; } conn = (ConnInfo*)malloc(sizeof(ConnInfo)); memset(conn, 0, sizeof(ConnInfo)); conn->p_env = env; conn->p_err = err; conn->p_svc = svc; conn->p_server = server; conn->p_session = session; return conn; } void OracleDisconnect(ConnInfo* conn) { if (conn) { OCIHandleFree((void*)conn->p_err, OCI_HTYPE_ERROR); OCIHandleFree((void*)conn->p_server, OCI_HTYPE_SERVER); OCIHandleFree((void*)conn->p_session, OCI_HTYPE_SESSION); OCIHandleFree((void*)conn->p_svc, OCI_HTYPE_SVCCTX); OCIHandleFree((void*)conn->p_stmt, OCI_HTYPE_STMT); OCIHandleFree((void*)conn->p_define, OCI_HTYPE_DEFINE); OCIHandleFree((void*)conn->p_bind, OCI_HTYPE_BIND); OCIHandleFree((void*)conn->p_param, OCI_HTYPE_PARAM); OCIHandleFree((void*)conn->p_env, OCI_HTYPE_ENV); free(conn); conn = NULL; } }
該庫主要由OracleConnect函數和OracleDisconnect函數組成,前者用于連接Oracle數據庫,后者用于斷開連接。通過調用這兩個函數,我們就可以在C語言中直接實現與Oracle數據庫的交互。
不僅如此,我們還可以通過這個封裝出來的庫來實現諸如數據增刪改查、存儲過程等操作,從而更加方便地操作Oracle數據庫系統。例如下面是一個C語言連接Oracle數據庫后查詢一個表格數據的例子:
OracleConnect("orcl", "scott", "tiger"); OCIStmt* p_sqlstatement; OCIStmtPrepare(p_sqlstatement, conn->p_err, (CONST OraText*)"SELECT * FROM emp;", strlen("SELECT * FROM emp;"), OCI_NTV_SYNTAX, OCI_DEFAULT); OCIStmtExecute(conn->p_svc, p_sqlstatement, conn->p_err, 1, 0, NULL, NULL, OCI_DEFAULT); OCIStmtFetch(p_sqlstatement, conn->p_err, conn->n_nrows, OCI_FETCH_NEXT, OCI_DEFAULT);
在這個例子中,我們先是通過OracleConnect函數獲取到一個數據庫連接,然后定義了一個SQL語句,語句中查詢了表格emp中的所有數據。接著使用OCIStmtPrepare函數將這些語句封裝到一個C語言類型中,然后再使用OCIStmtExecute函數將其傳遞給Oracle數據庫進行執行。
最后通過OCIStmtFetch函數把查詢結果存儲到C語言中。這個例子充分說明了C語言與Oracle數據庫之間的交互可以通過封裝一個庫來實現。
綜上所述,C語言與Oracle數據庫之間的交互可以通過封裝一個庫來實現,在C語言中,我們可以直接使用這個庫中的函數來完成數據增刪改查、存儲過程等功能,從而更加方便地操作Oracle數據庫系統。