OCI編程高級(jí)篇(十三) 直接路徑裝載分配句柄
訪(fǎng)問(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)容。
直接路徑裝載最少分配三個(gè)句柄,第一個(gè)是直接路徑上下文句柄OCIDirPathCtx,這個(gè)句柄從父句柄環(huán)境句柄envhp分配,每一個(gè)要裝載的對(duì)象都要有一個(gè)OCIDirPathCtx,可以分配多個(gè)句柄,也可以多個(gè)對(duì)象共用一個(gè)句柄。以OCIDirPathCtx為父句柄,可以分配另外兩個(gè)句柄,一個(gè)是直接路徑字段數(shù)組句柄OCIDirPathColArray,用于設(shè)置表的字段信息和字段數(shù)據(jù)。另一個(gè)是直接路徑流句柄OCIDirPathStream,用于把字段數(shù)組轉(zhuǎn)換成數(shù)據(jù)流。
我們之前創(chuàng)建過(guò)一個(gè)表,用于前面的OCI代碼演示,建表語(yǔ)句是CREATE TABLE test_tab (ID NUMBER, NAME CHAR(30), ADDR VARCHAR2(200))。我們還以這個(gè)表為例,使用直接路徑裝載插入數(shù)據(jù),看看開(kāi)始分配句柄和設(shè)置句柄屬性的過(guò)程。表的名稱(chēng)為test_tab,表的schema為scott,下面是代碼演示。
OCIEnv *envhp = NULL; OCIError *errhp = NULL; OCIServer *svrhp = NULL; OCISession *usrhp = NULL; OCISvcCtx *svchp = NULL; int dp_load(void){ ub4 buf_sz; ub4 ncol; OCIDirPathCtx *dpctx; OCIDirPathColArray *dpca; OCIDirPathStream *dpstr; /* 分配直接路徑上下文句柄,父句柄是envhp */ if (check_oci_error(errhp, OCIHandleAlloc((void *)envhp, (void **)&dpctx, OCI_HTYPE_DIRPATH_CTX, 0, (void **)NULL) ) < 0) return (-1); /* 分配直接路徑字段數(shù)組句柄,父句柄是dpctx */ if (check_oci_error(errhp, OCIHandleAlloc((void *)dpctx, (void **)&dpca, OCI_HTYPE_DIRPATH_COLUMN_ARRAY, 0, (void **)NULL) ) < 0) return (-1); /* 分配直接路徑流句柄,父句柄是dpctx */ if (check_oci_error(errhp, OCIHandleAlloc((void *)dpctx, (void **)&dpstr, OCI_HTYPE_DIRPATH_STREAM, 0, (void **)NULL) ) < 0) return (-1); /* 設(shè)置表的schema,在上下文句柄中設(shè)置 */ if (check_oci_error(errhp, OCIAttrSet((void *)dpctx, (ub4)OCI_HTYPE_DIRPATH_CTX, (void *)"scott", strlen("scott"), (ub4)OCI_ATTR_SCHEMA_NAME, errhp) ) < 0) return (-1); /* 設(shè)置表名稱(chēng),在上下文句柄中設(shè)置 */ if (check_oci_error(errhp, OCIAttrSet((void *)dpctx, (ub4)OCI_HTYPE_DIRPATH_CTX, (void *)"test_tab", strlen("test_tab"), (ub4)OCI_ATTR_NAME, errhp) ) < 0) return (-1); /* 設(shè)置轉(zhuǎn)換緩沖區(qū)的大小為2M */ buf_sz = 2 * 1024 * 1024; if (check_oci_error(errhp, OCIAttrSet((void *)dpctx, (ub4)OCI_HTYPE_DIRPATH_CTX, (void *)&buf_sz, 0, (ub4)OCI_ATTR_BUF_SIZE, errhp) ) < 0) return (-1); /* 設(shè)置表的字段個(gè)數(shù) */ ncol = 3; if (check_oci_error(errhp, OCIAttrSet((void *)dpctx, (ub4)OCI_HTYPE_DIRPATH_CTX, (void *)&ncol, 0, (ub4)OCI_ATTR_NUM_COLS, errhp) ) < 0) return (-1); /* 后面需要設(shè)置表的字段信息了,我們?cè)谙乱还?jié)中繼續(xù) */ /* 未完,待續(xù) ... */ return (0); }
在上面的例子中我們分配了三個(gè)句柄,并且在代表對(duì)象的直接路徑上下文中設(shè)置了表的屬主,表的名稱(chēng),表的字段個(gè)數(shù),轉(zhuǎn)換緩沖區(qū)的大小等屬性。
在下一節(jié)中我們看看怎樣設(shè)置表的字段屬性和字段其他信息,字段的設(shè)置有點(diǎn)復(fù)雜,我們專(zhuān)門(mén)用一節(jié)來(lái)講清楚。

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