OCI編程高級(jí)篇(十二) 直接路徑裝載概念和步驟
訪問(wèn)www.tomcoding.com網(wǎng)站,學(xué)習(xí)Oracle內(nèi)部數(shù)據(jù)結(jié)構(gòu),詳細(xì)文檔說(shuō)明,下載Oracle的exp/imp,DUL,logminer,ASM工具的源代碼,學(xué)習(xí)高技術(shù)含量的內(nèi)容。
Oracle直接路徑裝載是插入數(shù)據(jù)最快的方式,這些OCI函數(shù)能讓你訪問(wèn)Oracle的直接路徑裝載引擎,讓客戶端輸入的數(shù)據(jù)直接轉(zhuǎn)換成數(shù)據(jù)庫(kù)表中的存儲(chǔ)格式,直接寫(xiě)入到數(shù)據(jù)塊中。借用Oracle OCI文檔中的一張圖片,看一下直接路徑裝載的過(guò)程。

直接路徑裝載的環(huán)節(jié)很多,我們一步步來(lái)看都是怎樣操作的。
1. 創(chuàng)建環(huán)境變量,連接到數(shù)據(jù)庫(kù),這一步我們前面已經(jīng)介紹過(guò)了。
2. 分配直接路徑上下文句柄。使用OCIHandleAlloc()函數(shù),以環(huán)境句柄為父句柄,句柄類(lèi)型為OCI_HTYPE_DIRPATH_CTX。
3. 設(shè)置直接路徑上下文的屬性,使用OCIAttrSet()函數(shù),設(shè)置的屬性有裝載表的屬主OCI_ATTR_SCHEMA_NAME,裝載表的名稱OCI_ATTR_NAME,如果是裝載分區(qū),設(shè)置分區(qū)名稱OCI_ATTR_SUB_NAME,如果不想寫(xiě)日志,設(shè)置OCI_ATTR_DIRPATH_NOLOG屬性,設(shè)置輸入緩沖區(qū)的大小OCI_ATTR_BUF_SIZE。
4. 設(shè)置表的字段屬性。使用OCIAttrSet()函數(shù)設(shè)置裝載表的字段個(gè)數(shù)OCI_ATTR_NUM_COLS,使用OCIAttrGet()函數(shù)從直接路徑上下文中得到參數(shù)OCI_ATTR_LIST_COLUMNS。然后循環(huán)遍歷每個(gè)字段,使用OCIParamGet()函數(shù)得到字段描述符,在字段描述符中用OCIAttrSet()函數(shù)設(shè)置字段名稱,字段類(lèi)型和字段數(shù)據(jù)最大長(zhǎng)度。
5. 準(zhǔn)備直接路徑裝載接口,使用OCIDirPathPrepare()函數(shù)。
6. 分配直接路徑裝載的字段數(shù)組句柄,使用OCIHandleAlloc()函數(shù),類(lèi)型為OCI_HTYPE_DIRPATH_COLUMN_ARRAY。
7. 分配直接路徑裝載流句柄,使用OCIHandleAlloc()函數(shù),類(lèi)型為OCI_HTYPE_DIRPATH_STREAM。
8. 獲得直接路徑裝載字段數(shù)組句柄中的最大行數(shù)和字段個(gè)數(shù),使用OCIAttrGet()函數(shù),屬性名稱分別為OCI_ATTR_NUM_ROWS和OCI_ATTR_NUM_COLS。
9. 為每個(gè)字段設(shè)置輸入數(shù)據(jù)入口,使用OCIDirPathColArrayEntrySet()函數(shù)。
10. 清除字段數(shù)組緩沖區(qū),為新數(shù)據(jù)做準(zhǔn)備,使用OCIDirPathColArrayReset()函數(shù)。
11. 清除直接路徑裝載流緩沖區(qū),為新數(shù)據(jù)做準(zhǔn)備,使用OCIDirPathStreamReset()函數(shù)。
12. 把字段緩沖區(qū)中的數(shù)據(jù)轉(zhuǎn)換成流數(shù)據(jù),使用OCIDirPathColArrayToStream()函數(shù)。
13. 裝載流數(shù)據(jù),使用OCIDirPathLoadStream()函數(shù)。
14. 結(jié)束直接路徑裝載,使用OCIDirPathFinish()函數(shù)。
15. 釋放前面分配的句柄。
整個(gè)過(guò)程很復(fù)雜,在接下來(lái)的幾節(jié)中,我們分別介紹這些函數(shù),并用實(shí)際的例子演示函數(shù)的用法。

浙公網(wǎng)安備 33010602011771號(hào)