在現代編程中,與數據庫的交互是不可或缺的一部分。Oracle數據庫是廣泛使用的企業級關系型數據庫管理系統,據統計約有70%以上的中大型企業都在使用它。而C作為一種高效、面向過程的編程語言,也是數十年來一直被廣泛運用。那么,如何利用C語言來與Oracle數據庫進行讀寫呢?
首先,我們需要安裝合適的Oracle驅動程序,比如OCI(Oracle Call Interface)。OCI是一種C編程接口,能夠很好地操作Oracle數據庫。在這里我以OCI為例,講解C如何使用OCI來讀寫Oracle數據庫。
// user.c #include#include #include int main(void) { OCIEnv *envhp; OCIError *errhp; OCISvcCtx *svchp; OCISession *authp; OCIDefine *defhp; OCIStmt *stmthp; sword status = 0; text *username = "scott"; text *password = "tiger"; text *db = "localhost:1521/orcl"; text *sql = "SELECT * FROM emp"; /* 初始化環境變量 */ OCIInitialize(OCI_DEFAULT, (dvoid *)0, (dvoid * (*)(dvoid *, size_t)) 0, (dvoid * (*)(dvoid *, dvoid *, size_t))0, (void (*)(dvoid *, dvoid *)) 0 ); /* 分配環境變量 */ OCIEnvCreate(&envhp, OCI_THREADED|OCI_OBJECT, (dvoid *)0, (dvoid * (*)(dvoid *, size_t)) 0, (dvoid * (*)(dvoid *, dvoid *, size_t)) 0, (void (*)(dvoid *, dvoid *)) 0, (size_t) 0, (dvoid **)0); /*從環境變量中的到錯誤變量*/ OCIHandleAlloc((dvoid *) envhp, (dvoid **) &errhp, OCI_HTYPE_ERROR, (size_t) 0, (dvoid **) 0); /*從環境變量中的到服務器上下文*/ OCIHandleAlloc((dvoid *) envhp, (dvoid **) &svchp, OCI_HTYPE_SVCCTX, (size_t) 0, (dvoid **) 0); /*從環境變量中的到會話上下文*/ OCIHandleAlloc((dvoid *) envhp, (dvoid **) &authp, OCI_HTYPE_SESSION, (size_t) 0, (dvoid **) 0); /*從會話上下文內得出語句句柄*/ OCIHandleAlloc((dvoid *) envhp, (dvoid **) &stmthp, OCI_HTYPE_STMT, (size_t) 0, (dvoid **) 0); /* 連接數據庫 */ status = OCILogon(envhp, errhp, &svchp, username, (ub4)strlen(username), password, (ub4)strlen(password), db, (ub4)strlen(db)); if (status == 0) { printf("Connect Success!\n"); /* 執行查詢操作 */ OCIStmtPrepare(stmthp, errhp, sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT); OCIStmtExecute(svchp, stmthp, errhp, (ub4)0, (ub4)0, (OCISnapshot *)NULL, (OCISnapshot *)NULL, OCI_DEFAULT); /* 定義結果集,這里只獲取第一列 */ OCIDefineByPos(stmthp, &defhp, errhp, 1, (dvoid *)0, 0, SQLT_CHR, (dvoid *)0, 0, (dvoid *)0, OCI_DEFAULT); /* 把結果集打印出來 */ printf("Query Result:\n"); while (OCIStmtFetch2(stmthp, errhp, 1, OCI_FETCH_NEXT, (ub4)0, OCI_DEFAULT) == OCI_SUCCESS) { char buf[1024]; OCIDefineGetString(defhp, 0, buf, sizeof(buf), OCI_ATTR_DATA_LENGTH, &status); printf("%s\n", buf); } } else { printf("Connect Error!\n"); } /* 釋放資源 */ OCIHandleFree((dvoid*)stmthp, OCI_HTYPE_STMT); OCIHandleFree((dvoid*)authp, OCI_HTYPE_SESSION); OCIHandleFree((dvoid*)svchp, OCI_HTYPE_SVCCTX); OCIHandleFree((dvoid*)errhp, OCI_HTYPE_ERROR); OCITerminate(OCI_DEFAULT); return 0; }
這是一個簡單的讀取Oracle數據庫的例子,我們使用OCILogon函數連接到數據庫,然后使用OCIStmtPrepare函數來準備查詢語句,再使用OCIStmtExecute函數來執行查詢語句。接下來,我們使用OCIDefineByPos函數來定義結果集,再使用OCIStmtFetch2函數來獲取查詢結果,并使用OCIDefineGetString函數獲取查詢結果的每個元素。
在這個例子中,我們只使用了一個查詢語句。如果我們想要執行其他更復雜的操作,比如插入、更新或刪除,需要使用其他對應的函數來完成。比如OCIStmtExecute函數可以執行任何SQL語句,而不僅僅是SELECT語句。
此外,我們也可以使用OCI進行寫操作。比如:
text *sql = "INSERT INTO emp (empno, ename) VALUES (9876,'Tom')"; OCIStmtPrepare(stmthp, errhp, sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT); OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0, (OCISnapshot *)NULL, (OCISnapshot *)NULL, OCI_DEFAULT);
這樣就可以在emp表中插入一條數據了。
總之,使用C語言讀寫Oracle數據庫需要掌握OCI這一C編程接口,結合具體的實現語句,可以方便、高效地完成讀寫操作。同時,由于SQL語句的風格與C語言相似,對于C語言開發者來說上手難度不會太大。