c和Oracle是目前非常流行的兩種編程語言和數(shù)據(jù)庫系統(tǒng),它們之間的操作聯(lián)系非常緊密。在實(shí)際的開發(fā)過程中,經(jīng)常需要用c來操作Oracle數(shù)據(jù)庫,因此熟練掌握c和Oracle的結(jié)合使用是非常必要的。
首先,我們來看一下c和Oracle的連接方式。c中連接Oracle的方式可以使用OCI(Oracle Call Interface),OCI是Oracle數(shù)據(jù)庫提供的對(duì)C語言的支持,除了支持c語言之外,OCI還支持c++、Java、.net等多種編程語言。使用OCI連接Oracle數(shù)據(jù)庫,需要以下步驟:
//連接Oracle數(shù)據(jù)庫
ociHandleAlloc((dvoid **) &poolhp, OCI_HTYPE_STMT, (size_t)0, (dvoid **) &temp);
ociHandleAlloc((dvoid **) &errhp, OCI_HTYPE_ERROR, (size_t)0, (dvoid **) &temp);
ociHandleAlloc((dvoid **) &svchp, OCI_HTYPE_SVCCTX, (size_t)0, (dvoid **) &temp);
ociHandleAlloc((dvoid **) &envhp, OCI_HTYPE_ENV, (size_t)0, (dvoid **) &temp);
//設(shè)置Oracle服務(wù)器信息
OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, (void*) serverip, strlen(serverip)+1, OCI_ATTR_SERVER, errhp);
OCIAttrSet(envhp, OCI_HTYPE_ENV, (void*)mode, strlen(mode), OCI_ATTR_ENVIRONMENT_MODE, errhp);
//連接Oracle數(shù)據(jù)庫
OCILogon2(envhp, errhp, &svchp, (OraText *) username, strlen(username), (OraText *) password, strlen(password), (OraText *) dbname, strlen(dbname), OCI_DEFAULT);
上面的代碼中,ociHandleAlloc()函數(shù)用來開辟Oracle句柄,OCIAttrSet()函數(shù)用來設(shè)置Oracle服務(wù)器信息,OCILogon2()函數(shù)用來連接Oracle數(shù)據(jù)庫。
接下來,我們可以使用c來向Oracle數(shù)據(jù)庫中插入數(shù)據(jù)。以往的操作方式需要寫sql語句,但現(xiàn)在可以直接使用c語言來操作Oracle數(shù)據(jù)庫。例如:
//向Oracle數(shù)據(jù)庫中插入數(shù)據(jù)
//先開辟一塊內(nèi)存
char *sql = (char *)malloc(sizeof(char) * 100);
memset(sql, 0, sizeof(sql));
//向內(nèi)存中填充要插入的數(shù)據(jù)
sprintf(sql, "INSERT INTO student VALUES ('Tom', 18, 'male')");
//執(zhí)行插入操作
OCIDefine *defhp = NULL;
OCIBind *bindhp = NULL;
OCIStmt *stmthp = NULL;
OCISvcCtx *svchp = NULL;
OCIEnv *envhp = NULL;
OCIError *errhp = NULL;
//建立Oracle連接
//......
//執(zhí)行插入操作
OCIStmtPrepare(stmthp, errhp, (OraText *) sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);
OCIStmtExecute(svchp, stmthp, errhp, 1, 0, NULL, NULL, OCI_COMMIT_ON_SUCCESS);
//釋放連接
//......
上面的代碼中,先使用malloc()函數(shù)來開辟內(nèi)存,然后使用sprintf()函數(shù)向內(nèi)存中填充要插入的數(shù)據(jù),最后使用OCIDefine、OCIBind、OCIStmt、OCISvcCtx、OCIEnv、OCIError等函數(shù)來執(zhí)行插入操作。
此外,我們還可以使用c來查詢Oracle數(shù)據(jù)庫中的數(shù)據(jù)。與插入數(shù)據(jù)類似,我們需要先開辟一塊內(nèi)存,然后使用c語言操作數(shù)據(jù)庫,例如:
//查詢Oracle數(shù)據(jù)庫中的數(shù)據(jù)
//先開辟一塊內(nèi)存
char *sql = (char *)malloc(sizeof(char) * 100);
memset(sql, 0, sizeof(sql));
//向內(nèi)存中填充要查詢的數(shù)據(jù)
sprintf(sql, "SELECT * FROM student");
//執(zhí)行查詢操作
OCIDefine *defhp = NULL;
OCIBind *bindhp = NULL;
OCIStmt *stmthp = NULL;
OCISvcCtx *svchp = NULL;
OCIEnv *envhp = NULL;
OCIError *errhp = NULL;
//建立Oracle連接
//......
//執(zhí)行查詢操作
OCIStmtPrepare(stmthp, errhp, (OraText *) sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);
OCIStmtExecute(svchp, stmthp, errhp, 0, 0, NULL, NULL, OCI_COMMIT_ON_SUCCESS);
//獲取查詢結(jié)果
OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT);
//釋放連接
//......
上面的代碼中,同樣需要先開辟內(nèi)存,然后使用sprintf()函數(shù)向內(nèi)存中填充查詢語句,最后使用OCIDefine、OCIBind、OCIStmt、OCISvcCtx、OCIEnv、OCIError等函數(shù)來獲取查詢結(jié)果。
總而言之,c和Oracle的操作結(jié)合非常緊密,掌握這種操作方式可以在實(shí)際開發(fā)中帶來很大的便利。以上僅是簡(jiǎn)單的示范,在實(shí)際的開發(fā)過程中,還需要根據(jù)具體的需求來進(jìn)行更細(xì)致的操作。