這段自學 OCI 編程,感覺網上這方面的資料其實也不少,只是不是很容易找到。其實 OCI 沒有想象的那麼複雜,如果你想深究,那應該就只是時間問題。我在網上看到有人這麼寫到,對於 C++ 高手來說 OCI 編程只是簡單的調用接口函數.
服務器句柄 ( Server Handle ),用戶會話句柄( User Session Handle ),事務句柄( Transaction Handle )隸屬於服務上下文句柄( Service Context Handle ),但都是以環境句柄爲父句柄分配的。
查詢輸出定位句柄( Define Handle )和輸入輸出綁定變量句柄( Bind Handle )在執行具體的 SQL 語句的時候,被隱含創建並連接到表達句柄( Statement Handle )上,當表達句柄釋放時,它們也被隱含釋放。所以在執行每一個 sql 語句時,先分配表達句柄,執行結束後,釋放表達句柄,這樣做保證不發生由於定位句柄和綁定變量句柄引起的內存泄漏。
3 、連接 ORACLE 數據庫流程
OCI 連接過程十比較複雜,除了分配設置各個基本句柄外,還要明確彼此之間的聯繫,大致流程如下:
創建環境句柄: OCIEnvCreate(&envhp, …);
創建一個指定環境的錯誤句柄: OCIHandleAlloc((dvoid *)envhp, (dvoid **)&errhp,…);
創建一個指定環境的服務句柄: OCIHandleAlloc((dvoid *)envhp, (dvoid **)&servhp,…);
建立到數據源的訪問路徑 : OCIServerAttach(servhpp, errhpp,…);
創建一個指定環境的服務上下文句柄: (void) OCIHandleAlloc((dvoid *)envhpp,…);
爲指定的句柄及描述符設置特定的屬性: (void) OCIAttrSet((dvoid *)svchpp,…);
創建一個指定環境的用戶連接句柄: (void) OCIHandleAlloc((dvoid *)envhpp,…);
爲用戶連接句柄設置登錄名及密碼: (void) OCIAttrSet((dvoid *)usrhpp,…);
認證用戶建立一個會話連接: OCISessionBegin(svchpp, errhpp,…);
創建一個句子句柄: OCIHandleAlloc((dvoid *)envhpp,…);s
準備 SQL 語句: OCIStmtPrepare(stmthpp, errhpp,…);
綁定輸入變量: OCIBindByPos(stmtp &hBind, errhp,…);
綁定輸出變量: OCIDefineByPos(stmthpp, &bhp1, errhpp,…);
獲得 SQL 語句類型: OCIAttrGet ((dvoid *)stmthpp, (ub4)OCI_HTYPE_STMT,…);
執行 SQL 語句: OCIStmtExecute(svchpp, stmthpp,…);
釋放一個會話: OCISessionRelease();
刪除到數據源的訪問 : OCIServerDetach(servhpp, errhpp, OCI_DEFAULT);
釋放句柄: OCIHandleFree((dvoid *) stmthpp, OCI_HTYPE_STMT);
二、實踐:
我把程序貼到該文章的第二篇中,以下針對應用得以分析並進行說明。
三、基本理論:
1 、創建 OCI 環境即創建和初始化 OCI 工作環境,其他的 OCI 函數需要 OCI 環境才能執行。
2 、需要申請的句柄類型:
OCI 環境句柄: OCI_HTYPE_ENV— 它定義所有 OCI 函數的環境調用環境,是其他句柄的父句柄。 ( 由 OCIEnvInit 或 OCIEnvCreate 生成 ) 。
錯誤句柄: OCI_HTYPE_ERROR— 作爲一些 OCI 函數的參數,用來記錄這些 OCI 函數操作過程中所產生的錯誤,當有錯誤發生時,可用 COIErrorGet() 來讀取錯誤句柄 中記錄的錯誤信息。
服務器環境句柄: OCI_HTYPE_SVCCTX— 定義 OCI 調用的服務器操作環境,它包含服務器、用戶會話和事務三種句柄。
服務器句柄: OCI_HTYPE_SERVER— 標識數據源,它轉換爲與服務器的物理連接。
用戶會話句柄: OCI_HTYPE_SESSION— 定義用戶角色和權限及 OCI 調用的執行環境。
事務句柄: OCI_HTYPE_TRANS— 定義執行 SQL 操作的事務環境,事務環境中包含用戶的會話狀態信息。
語句句柄: OCI_HTYPE_STMT— 是一個標識 SQL 語句或 PL/SQL 塊,以及其相關屬性的環境。
Bind/Define 句柄:屬於語句句柄的子句柄,由 OCI 庫隱式自動生成。用戶不需要自己再申請, OCI 輸入變量存儲在 bind 句柄中,輸出變量存儲在定義句柄中。
3 、句柄屬性包括:
服務器環境句柄屬性: (OCI_HTYPE_SVCCTX)
OCI_ATTR_SERVER— 設置 / 讀取服務環境的服務器環境屬性
OCI_ATTR_SESSION— 設置 / 讀取服務環境的會話認證環境屬性
OCI_ATTR_TRANS— 設置 / 讀取服務環境的事務環境屬性
用戶會話句柄屬性: (OCI_HTYPE_SESSION)
OCI_ATTR_USERNAME— 設置會話認證所使用的用戶名
OCI_ATTR_PASSWORD— 設置會話認證所使用的用戶口令
服務器句柄: (OCI_HTYPE_SEVER)
OCI_ATTR_NOBLOCKING_MODE— 設置 / 讀取服務器連接: =TRUE 時服務器連接設置爲非阻塞方式
語句句柄: (OCI_HTYPE_STMT)
OCI_ATTR_ROW_COUNT— 只讀,爲當前已處理的行數,其 default=1
OCI_ATTR_STMT_TYPE— 讀取當前 SQL 語句的類型:
4 、 OCI 函數返回值:
OCI_SUCCESS – 函數執行成功 (=0)
OCI_SUCCESS_WITH_INFO – 執行成功,但有診斷消息返回,可能是警告信息
OCI_NO_DATA— 函數執行完成,但沒有其他數據
OCI_ERROR— 函數執行錯誤
OCI_INVALID_HANDLE— 傳遞給函數的參數爲無效句柄,或傳回的句柄無效