OCI編程基礎(chǔ)篇(二) 創(chuàng)建環(huán)境、分配句柄
訪問(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)容。
創(chuàng)建OCI環(huán)境
在編寫(xiě)OCI程序的第一步就是創(chuàng)建OCI環(huán)境,然后分配需要的句柄,下面介紹創(chuàng)建OCI環(huán)境的函數(shù)。這是OCI程序第一個(gè)要調(diào)用的函數(shù),名字叫做OCIEnvCreate()。看一下它的函數(shù)原型和參數(shù)。
sword OCIEnvCreate ( OCIEnv **envhpp,
ub4 mode,
const void *ctxp,
const void *(*malocfp)(void *ctxp, size_t size),
const void *(*ralocfp)(void *ctxp, void *memptr, size_t newsize),
const void (*mfreefp)(void *ctxp, void *memptr),
size_t xtramemsz,
void **usrmempp );
envhpp是一個(gè)輸出參數(shù),是一個(gè)指針的指針,為了要把創(chuàng)建的環(huán)境句柄帶回來(lái)。后面的函數(shù)會(huì)用到這個(gè)句柄。
mode是一個(gè)輸入?yún)?shù),指示創(chuàng)建OCI環(huán)境的模式。有幾個(gè)主要的模式介紹一下,一般用到的是缺省模式OCI_DEFAULT,大部分程序用這個(gè)模式就夠了。如果使用多線程調(diào)用OCI函數(shù),那么就要用到線程模式OCI_THREADED,這樣可以保證每個(gè)線程都有一份環(huán)境內(nèi)存,不相互干擾,否則線程之間互相修改共享的環(huán)境內(nèi)存,會(huì)造成coredump。如果使用OCI中的對(duì)象操作函數(shù),就要用到OCI_OBJECT模式。
ctxp是一個(gè)輸入?yún)?shù),指示用戶定義的上下文指針,給回調(diào)函數(shù)用的,一般賦值為NULL就可以了。
malocfp是一個(gè)輸入?yún)?shù),是一個(gè)函數(shù)指針,是用戶定義的分配內(nèi)存的函數(shù),類似C語(yǔ)言中的malloc()函數(shù),一般賦值為NULL。
ralocfp是一個(gè)輸入?yún)?shù),是一個(gè)函數(shù)指針,是用戶定義的再分配內(nèi)存的函數(shù),類似C語(yǔ)言中的realloc()函數(shù),一般賦值為NULL。
mfreefp是一個(gè)輸入?yún)?shù),是一個(gè)函數(shù)指針,是用戶定義的釋放內(nèi)存的函數(shù),類似C語(yǔ)言中的free()函數(shù),一般賦值為NULL。由于創(chuàng)建OCI環(huán)境變量需要分配一定大小的內(nèi)存,分配過(guò)程中就會(huì)用到內(nèi)存分配函數(shù),上面的三個(gè)函數(shù)指針就是為分配內(nèi)存和釋放內(nèi)存準(zhǔn)備的,讓用戶可以自己分配和釋放內(nèi)存,如果沒(méi)有用戶自己定義的函數(shù),那么都賦值為NULL,創(chuàng)建OCI環(huán)境時(shí)就使用系統(tǒng)自己的分配和釋放內(nèi)存的函數(shù)。
xtramemsz是一個(gè)輸入?yún)?shù),指示額外分配內(nèi)存的大小,這個(gè)內(nèi)存可以給用戶使用,生命周期與OCI環(huán)境的生存期一樣長(zhǎng),在釋放環(huán)境內(nèi)存時(shí)才一起釋放掉。一般不用這個(gè)內(nèi)存,可以賦值為0。
usrmempp是一個(gè)輸出參數(shù),帶回分配的用戶內(nèi)存的指針。這個(gè)參數(shù)與上一個(gè)參數(shù)是相關(guān)的,如果上一個(gè)參數(shù)大于0,那么必須賦值把分配的用戶內(nèi)存指針帶回來(lái),如果上個(gè)參數(shù)為0,這里賦值為NULL就可以了。
OCIEnvNlsCreate()的返回值是一個(gè)sword類型的整數(shù),實(shí)際上就是一個(gè)有符號(hào)的整數(shù)。所有的OCI函數(shù)返回值都是sword整數(shù),絕大多數(shù)的時(shí)候返回值是OCI_SUCCESS或OCI_ERROR,表示函數(shù)執(zhí)行成功或出錯(cuò),特定的函數(shù)還會(huì)返回其他值,后面遇到時(shí)再介紹。
看一個(gè)實(shí)際的例子。
OCIEnv *envhp = NULL;
sword rc;
rc = OCIEnvCreate(
&envhp, /* envhpp */
OCI_DEFAULT, /* mode */
(void *)NULL, /* ctxp */
NULL,
NULL,
NULL,
(size_t)0,
(void **)NULL
);
if (rc != OCI_SUCCESS) {
fprintf(stderr, "OCIEnvCreate() - allocate OCI env handle error !\n");
return (-1);
}
這里返回的envhp就是創(chuàng)建的OCI環(huán)境變量指針。
分配句柄
創(chuàng)建完OCI環(huán)境之后,馬上就要分配必須的句柄才能連接到數(shù)據(jù)庫(kù),分配句柄的函數(shù)叫做OCIHandleAlloc()。看一下它的原型和參數(shù)。
sword OCIHandleAlloc ( const void *parenth,
void **hndlpp,
ub4 type,
size_t xtramem_sz,
void **usrmempp );
parenth是一個(gè)輸入?yún)?shù),表示被分配句柄的父句柄指針,一般會(huì)是OCI環(huán)境句柄。
hndlpp是一個(gè)輸出參數(shù),帶回被分配的句柄指針。
type是一個(gè)輸入?yún)?shù),指示分配句柄的類型。句柄類型有很多,在后面用到時(shí)再一一介紹。
xtramem_sz是輸入?yún)?shù),指示額外分配的跟句柄關(guān)聯(lián)的用戶內(nèi)存大小,與創(chuàng)建OCI環(huán)境函數(shù)的最后兩個(gè)參數(shù)意義相同。不想分配的話賦值為0。
usrmempp是輸出參數(shù),帶回分配的用戶內(nèi)存的指針。
一個(gè)實(shí)際的例子,在創(chuàng)建OCI環(huán)境后,第一個(gè)要分配的句柄就是處理錯(cuò)誤的句柄,類型為OCI_HTYPE_ERROR,我們來(lái)看一下。
sword rc;
rc = OCIHandleAlloc(
(const void *)envhp,
(void **)&errhp,
OCI_HTYPE_ERROR,
0,
(void **)NULL
);
if (rc != OCI_SUCCESS) {
fprintf(stderr, "OCIHandleAlloc() - allocate OCI error handle error !\n");
return (-1);
}
下一節(jié)我們?cè)賮?lái)看看還要分配哪些句柄,怎樣連接到數(shù)據(jù)庫(kù)。

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