如果你的應用程序需要與遠程Oracle數據庫進行連接,那么你需要使用C語言來訪問該數據庫。 本文將介紹如何使用C語言連接遠程Oracle,以及如何執行SQL查詢,插入和更新數據。
在開始之前,你需要確保已安裝Oracle客戶端,因為它包含了必需的頭文件和庫文件。 如果你沒有安裝Oracle客戶端,請在Oracle官方網站上下載并安裝它。 安裝完成后,請在鏈接時指定正確的庫路徑。
#include <stdio.h> #include <oci.h> #define MAX_STR_LEN 256 int main() { sword status; OCIError* p_err; OCISession* p_session; OCIServer* p_server; OCIEnv* p_env; OCIStmt* p_stmt; OCIDefine* p_define; OCIParam* p_param; OCILobLocator* p_lob; OCIDateTime* p_date; char user[MAX_STR_LEN] = "username"; char pwd[MAX_STR_LEN] = "password"; char dblink[MAX_STR_LEN] = "dblink_name"; char* p_sql = "SELECT * FROM employees"; int emp_id; char emp_name[MAX_STR_LEN]; float emp_salary; /* 初始化環境 */ if (OCIEnvCreate(&p_env, OCI_THREADED | OCI_OBJECT, NULL, NULL, NULL, NULL, 0, NULL) != OCI_SUCCESS) { fprintf(stderr, "OCIEnvCreate(): Failed to create environment\n"); return -1; } /* 創建錯誤句柄 */ OCIHandleAlloc(p_env, (void**)&p_err, OCI_HTYPE_ERROR, 0, NULL); /* 創建服務器句柄 */ OCIHandleAlloc(p_env, (void**)&p_server, OCI_HTYPE_SERVER, 0, NULL); /* 創建會話句柄 */ OCIHandleAlloc(p_env, (void**)&p_session, OCI_HTYPE_SESSION, 0, NULL); /* 由于Oracle需要使用大量的字符集和語言設置,我們需要指定它們 */ OCIAttrSet(p_session, OCI_HTYPE_SESSION, user, strlen(user), OCI_ATTR_USERNAME, p_err); OCIAttrSet(p_session, OCI_HTYPE_SESSION, pwd, strlen(pwd), OCI_ATTR_PASSWORD, p_err); OCIAttrSet(p_server, OCI_HTYPE_SERVER, dblink, strlen(dblink), OCI_ATTR_DBNAME, p_err); /* 連接到遠程Oracle服務器 */ if (OCIServerAttach(p_server, p_err, (unsigned char*)dblink, strlen(dblink), OCI_DEFAULT) != OCI_SUCCESS) { fprintf(stderr, "OCIServerAttach(): Failed to attach to server\n"); return -1; } /* 設置服務器連接信息 */ OCIAttrSet(p_session, OCI_HTYPE_SESSION, p_server, 0, OCI_ATTR_SERVER, p_err); /* 開始會話 */ if (OCISessionBegin(p_env, p_err, p_session, OCI_CRED_RDBMS, OCI_DEFAULT) != OCI_SUCCESS) { fprintf(stderr, "OCISessionBegin(): Failed to start session\n"); return -1; } /* 設置會話上下文 */ if (OCIAttrSet(p_stmt, OCI_HTYPE_STMT, (void*)&p_session, 0, OCI_ATTR_SESSION, p_err) != OCI_SUCCESS) { fprintf(stderr, "OCIAttrSet(): Failed to set session context\n"); return -1; } /* 準備SQL語句 */ if (OCIStmtPrepare(p_stmt, p_err, (text*)p_sql, strlen(p_sql), OCI_NTV_SYNTAX, OCI_DEFAULT) != OCI_SUCCESS) { fprintf(stderr, "OCIStmtPrepare(): Failed to prepare statement\n"); return -1; } /* 執行SQL語句 */ if (OCIStmtExecute(p_session, p_stmt, p_err, 1, 0, NULL, NULL, OCI_DEFAULT) != OCI_SUCCESS) { fprintf(stderr, "OCIStmtExecute(): Failed to execute statement\n"); return -1; } /* 獲取返回結果 */ if (OCIStmtFetch(p_stmt, p_err, 1, OCI_FETCH_NEXT, OCI_DEFAULT) != OCI_SUCCESS) { fprintf(stderr, "OCIStmtFetch(): Failed to fetch result\n"); return -1; } /* 獲取每一行的列信息 */ OCIAttrGet(p_stmt, OCI_HTYPE_STMT, (void*)&emp_id, NULL, OCI_ATTR_DATA_TYPE, p_err); OCIAttrGet(p_stmt, OCI_HTYPE_STMT, (void*)emp_name, NULL, OCI_ATTR_DATA_TYPE, p_err); OCIAttrGet(p_stmt, OCI_HTYPE_STMT, (void*)&emp_salary, NULL, OCI_ATTR_DATA_TYPE, p_err); printf("ID:%d, Name:%s, Salary:%.2f\n", emp_id, emp_name, emp_salary); /* 清理 */ OCIHandleFree(p_stmt, OCI_HTYPE_STMT); OCIHandleFree(p_param, OCI_HTYPE_DESCRIBE); OCIHandleFree(p_define, OCI_HTYPE_DEFINE); OCIHandleFree(p_lob, OCI_DTYPE_LOB); OCIHandleFree(p_date, OCI_DTYPE_TIMESTAMP); OCISessionEnd(p_session, p_err, NULL, OCI_DEFAULT); OCIServerDetach(p_server, p_err, OCI_DEFAULT); OCIHandleFree(p_session, OCI_HTYPE_SESSION); OCIHandleFree(p_server, OCI_HTYPE_SERVER); OCIHandleFree(p_err, OCI_HTYPE_ERROR); OCIHandleFree(p_env, OCI_HTYPE_ENV); return 0; }
在上面的代碼中,我們使用OCIEnvCreate()函數創建了一個OCIEnv實例,并使用OCIHandleAlloc()函數為錯誤句柄,服務器句柄和會話句柄分別分配了內存。接下來,我們設置了Oracle會話的用戶名,密碼和連接信息,并連接到遠程服務器。然后,我們準備了一個SQL語句并執行它,最后獲取了返回的數據,使用OCIAttrGet()函數來獲取每行的列數據。 最后,我們釋放了所有句柄并關閉了會話和服務器連接。
總之,使用C語言連接遠程Oracle數據庫非常簡單,只需遵循上述步驟即可。 無論是查詢,插入還是更新數據,你都可以使用OCI提供的API輕松完成。 如果你想了解更多有關OCI的信息,請查看Oracle官方文檔。
上一篇c3p0 oracle