OCI編程自學與總結(1.1)

這段自學 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— 傳遞給函數的參數爲無效句柄,或傳回的句柄無效

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章