OCI8使用OCIInitialize函式來初始化OCI。這是使用OCI8與資料庫建立會話必須的一步;同時,必須是第一步。如果成功,則返回0。
基本介紹
- 外文名:OCI常用函式
- 函式原型:sword OCIBindArrayOfStruct
- 用途:初始化OCI
- 性質:常用函式
函式說明,程式環境,I環境句柄,分配各OCI句柄,存儲路徑,資料庫會話,錯誤原因,準備執行,定義輸出變數,定義輸入變數,執行陳述語句,十一、事務提交,十二、事務回滾,資料庫連線,大致步驟,
函式說明
程式環境
函式原型:sword OCIInitialize (ub4 mode,CONST dvoid *ctxp,CONST dvoid *(*malocfp) (/* dvoid *ctxp,size_t size _*/),
CONST dvoid *(*ralocfp)(/*_ dvoid *ctxp,dvoid *memptr,size_t newsize _*/),
CONST void (*mfreefp)(/*_ dvoid *ctxp,dvoid *memptr _*/))
參數說明:
mode——詳細說明OCI初始化(Initialize)模式(mode)。它的取值如下:
OCI_DEFAULT——預設模式;
OCI_THREADED——多執行緒模式;在該模式下,各並發處理中不為用戶所見的內在數據結構受各自執行緒的保護,而不受別的執行緒干擾;
OCI_OBJECT——使用目標特性;
OCI_SHARED——使用共享記憶體;
OCI_EVENTS——
Mode參數可以擁有多個值,以“|”符號分隔各取值項。
*Ctxp——用戶定義的記憶體回調程式;默認為0
*(*malocfp)——用戶定義的記憶體分配程式;默認為0
*(*ralocfp)——重新分配記憶體程式;默認為0
*memptr 是指向記憶體塊的指針;
*mfreefp——用戶定義的記憶體釋放程式;默認為0
該函式使用舉例如下:
OCIInitialize((ub4) OCI_THREADED | OCI_OBJECT,
(dvoid *)0,(dvoid *(*)(dvoid *, size_t)) 0,
(dvoid * (*)(dvoid *,dvoid *,size_t))0,
(void (*)(dvoid *,dvoid *)) 0 )
注意!OCIEnvCreate() 可以代替OCIInitialize() 和OCIEnvInit()
I環境句柄
在初始化OCI程式環境以後,使用OCIEnvInit來初始化OCI的環境句柄,該函式成功返回0。
函式原型:swordOCIEnvInit(OCIEnv **envhpp,
ub4 mode,
size_t xtramemsz,
dvoid **usrmempp )
參數說明:
**envhpp——指向環境句柄的指針;
mode——指定初始化環境句柄的模式,其取值如下:
OCI_DEFAULT——預設模式;在預設模式下,OCI庫始終互斥各環境句柄;
OCI_NO_MUTEX——非互斥模式;在該模式下,OCI庫各環境句柄並不互斥,所有的調用都使用同一個環境句柄,並且只能有一個環境句柄起作用。
OCI_ENV_NO_UCB——禁止回滾模式;該模式用以禁止在環境句柄初始化過程中的動態CALL_BACK函式調用;
Xtramemsz——指定在該環境句柄生存期內分配記憶體的數量;
**usrmempp——指向Xtramemsz參數的指針;usermempp參數是函式返回值;
該函式使用舉例如下:
套用例子:OCIEnvInit((OCIEnv **) envhp,
(ub4) OCI_DEFAULT,
(size_t) 0,(dvoid **) 0)
分配各OCI句柄
一個OCI連線在建立前,還需要將所需要的句柄一一分配成功,在OCI8里,使用函式OCIHandleAlloc來分配各句柄,成功返回0。
函式原型:sword OCIHandleAlloc(CONST dvoid *parenth,
dvoid **hndlpp,
ub4 type,
size_t xtramem_sz,
dvoid **usrmempp )
參數說明:
*parenth——已初始化後的環境句柄;
**hndlpp——函式執行成功後,返回的一個OCI句柄;該返回值的具體含義由type參數來決定;
type——參數hndlpp的返回值的類型;其常用取值如下:
OCI_HTYPE_SVCCTX——返回一個服務類型的句柄;
OCI_HTYPE_ERROR——返回一個錯誤類型的句柄;
OCI_HTYPE_SESSION——返回一個會話類型的句柄;
OCI_HTYPE_SERVER——返回一個伺服器類型的句柄;
OCI_HTYPE_STMT——返回一個陳述類型的句柄;
其中,陳述類型的句柄是在創建與資料庫會話成功後,將要對資料庫進行操作時分配的,其餘類型的句柄是在環境句柄初始化後分配的;
xtramem_sz——指定在該句柄生存期內分配記憶體的數量;
**usrmempp——指向xtramem_sz參數的指針,由函式返回;
該函式使用舉例如下:OCIHandleAlloc((dvoid *) *envhp,
(dvoid **) errhp,
(ub4) OCI_HTYPE_ERROR,
(size_t) 0,
(dvoid **) 0)
存儲路徑
(以給定的方式設定伺服器連線指針的參數)。
分配各OCI句柄後,還需要做的工作是為OCI運算元據源創建存儲路徑,並將各項參數設定到相應的句柄中,這項工作由函式OCIServerAttach和OCIAttrSet來實現。成功,返回0。
函式原型:sword OCIServerAttach(OCIServer *srvhp,
OCIError *errhp,
CONST text *dblink,
sb4 dblink_len,
ub4 mode )
參數說明:
*srvhp——已分配成功的伺服器句柄;
*dblink——登入資料庫的實例名;
dblink_len——參數*dblink字元串的長度;
mode——指定不同操作的模式。現在只有一種模式可選:OCI_DEFAULT。
該函式使用舉例如下:OCIServerAttach(srvhp, errhp,
(text *) cstring,
(sb4) strlen((char *)cstring), (ub4) OCI_DEFAULT))
函式原型:sword OCIAttrSet (CONST dvoid *trgthndlp,
ub4 trghndltyp,
dvoid *attributep,
ub4 *sizep,
ub4 attrtype,
OCIError *errhp )
參數說明:
*trgthndlp——需要設定的句柄,該句柄在這之前已分配成功;該參數由trghndltyp參數決定;
trghndltyp——參數trgthndlp的類型,其取值參見OCIHandleAlloc函式說明中的type參數說明;
*attributep——設定參數trgthndlp的值;
*sizep——attributep參數指向的字元串長度;
attrtype——參數attributep的類型;其取值如下:
OCI_ATTR_SERVER——伺服器類型;
OCI_ATTR_USERNAME——用戶名類型
OCI_ATTR_PASSWORD——用戶密碼類型
OCI_ATTR_SESSION——會話類型;
該函式使用舉例如下:OCIAttrSet((dvoid *) svchp,
(ub4) OCI_HTYPE_SVCCTX,
(dvoid *) srvhp,
(ub4) 0,
(ub4) OCI_ATTR_SERVER,
errhp))
(註:此時該函式的意思是將伺服器句柄設定到服務句柄中,其類型為伺服器類型)
說明:在登入資料庫前以給定的方式設定伺服器連線指針的參數時,attrtype參數的所有類型都需要設定到服務句柄中。設定的步驟為:先將伺服器句柄設定到服務句柄中,然後將用戶名、密碼設定到會話句柄中,在調用OCISessionBegin函式成功後,再將會話句柄設定到服務句柄中。
資料庫會話
創建和開始與資料庫的會話使用函式OCISessionBegin來實現,其目的是建立與資料庫的會話連線;函式成功,返回0。
函式原型:sword OCISessionBegin (OCISvcCtx *svchp,
OCIError *errhp,
OCISession *authp,
ub4 credt,
ub4 mode))
參數說明:
*svchp——已分配並設定成功的服務句柄;
*authp——已分配並設定了用戶名、密碼的會話句柄;
credt——建立用戶會話的類型;其取值如下:
OCI_CRED_RDBMS——需要使用用戶名和密碼來建立會話;
OCI_CRED_EXT——不需要使用用戶名和密碼來建立會話;
mode——操作的模式;其取值如下:
OCI_DEFAULT——預設模式;在該模式下只支持一個會話句柄;
OCI_MIGRATE——移動會話模式;在該模式下,新的會話連線會以不同的會話句柄返回;使用該模式創建新的會話時,必須已存在一個不可移動會話模式的會話連線。也就是說,一個移動會話模式的會話連線必須有一個不可移動模式的連線作為父連線;
OCI_SYSDBA——在該模式下,會鑑別用戶是否以SYSDBA形式對資料庫進行訪問;
OCI_SYSOPER——在該模式下,會鑑別用戶是否以SYSOPER形式對資料庫進行訪問;
OCI_PRELIM_AUTH——這種模式和OCI_SYSDBA、OCI_SYSOPER一起使用,作為某些訪問任務的鑑別;
該函式使用舉例如下:OCISessionBegin(svchp,
errhp,
authp,
OCI_CRED_RDBMS,
OCI_DEFAULT)
錯誤原因
若某函式執行出錯,則可以使用函式OCIErrorGet來取得錯誤原因,從而能得到某些提示。
函式原型:sword OCIErrorGet (dvoid *hndlp,
ub4 recordno,
text *sqlstate,
sb4 *errcodep,
text *bufp,
ub4 bufsiz,
ub4 type )
參數說明:
*hndlp——錯誤類型句柄errhp;
recordno——錯誤查找的原始位置,從1開始,其預設值為1;
*sqlstate——OCI8不支持,預設值為NULL;
*errcodep——ORACLE錯誤返回代碼,由函式返回;初始值可以為(sb4)0;
*bufp——錯誤信息提示,由函式以字元串形式返回;
bufsiz——bufp參數原始字元串長度;
type——句柄類型;其取值為OCI_HTYPE_ERR或著為OCI_HTYPE_ENV;預設值為OCI_HTYPE_ERR;
該函式使用舉例如下:OCIErrorGet((dvoid *) errhp,
(ub4) 1,
(text *) NULL,
&errcode,
(text *)msgbuf,
(ub4) sizeof(msgbuf),
(ub4) OCI_HTYPE_ERROR)
準備執行
用戶定義的SQL或PL/SQL陳述語句。
在執行SQL或PL/SQL語句前,需要對該語句執行分析、出錯檢查,並和陳述句柄綁定起來,使用函式OCIStmtPrepare來進行這一系列操作。該函式在執行陳述語句前必須使用;成功,返回0;
函式原型:sword OCIStmtPrepare ( OCIStmt *stmtp,
OCIError *errhp,
CONST text *stmt,
ub4 stmt_len,
ub4 language,
ub4 mode)
參數說明:
*stmtp——已分配成功的陳述句柄;
*stmt——用戶定義的需要執行的SQL或PL/SQL陳述語句;
stmt_len——用戶定義的需要執行的陳述語句的長度;該參數的值不能為0;
language——語法模式;聲明是本地語法,還是V7模式語法。其取值如下:
OCI_V7_SYNTAX——ORACLE的V7分析語法;
OCI_NTV_SYNTAX——語法依賴於伺服器的版本;
mode——模式;其預設值為OCI_DEFAULT;
該函式使用舉例如下:OCIStmtPrepare(stmthp,
errhp,
(ub4)strlen((char *)sqlcommand),
(ub4) OCI_NTV_SYNTAX,
(ub4) OCI_DEFAULT)
定義輸出變數
OCI執行陳述語句後,將所選擇的變數值返回輸出,此時需有用戶定義的地址空間來容納這些返回值。使用函式OCIDefineByPos通過在陳述語句中標誌某變數在用戶定義的變數集合中的位置來定義變數;若該函式執行成功,返回0。
函式原型:sword OCIDefineByPos (OCIStmt *stmtp,
OCIDefine **defnpp,
OCIError *errhp,
ub4 position,
dvoid *valuep,
sb4 value_sz,
ub2 dty,
dvoid *indp,
ub2 *rlenp,
ub2 *rcodep,
ub4 mode )
參數說明:
position——需要定義的變數在定義句柄的列表中的位置,從1開始;例如:
SELECT empno, ssn, mgrno FROM employees;
則empno的position值為1,ssn的position的值為2,mgrno的position值為3;以此類推。
*valuep——需要定義的變數的在執行成功後的存儲地址;如果提取出來的數據有多項,則該參數可以使用數組;
value_sz——valuep參數的指向的存儲地址空間的長度;
dty——需要定義的變數的數據類型;SQLT_STR表示該變數是個字元串變數;SQLT_INT則表示該變數是個整型變數;
*indp——變數或數組指示器,默認為0;
*rlenp——變數或數組長度指示器,默認為0;
*rcodep——即將提取的變數的值指示器,默認為0;
mode——變數提取模式。其取值為OCI_DEFAULT或OCI_DYNAMIC_FETCH;OCI_DYNAMIC_FETCH用於在提取資料過程中,需要動態資料的時候,此時必須用CIDefineDynamic函式建立一個回調函式用以提取數據;這種情況下,valuep和value_sz參數可以忽略;
該函式使用舉例如下:OCIDefineByPos(stmthp, &dfnhp[4],
errhp, (ub4) 5,
(dvoid *) &No[0],
(sb4) sizeof(No[0]),
(ub2) SQLT_INT,
(dvoid *) 0,
(ub2 *) 0,
(ub2 *) 0,
(ub4) OCI_DEFAULT)
補充說明:如果輸出變數是多行資料,其大小為輸出變數的行數與該變數自身大小的乘積。此時,在函式後面還需要使用另一個函式OCIDefineArrayOfStruct來定義該數組。函式OCIDefineArrayOfStruct說明如下:
函式原形:sword OCIDefineArrayOfStruct(OCIDefine *defnp,
OCIError *errhp,
ub4 pvskip,
ub4 indskip,
ub4 rlskip,
ub4 rcskip )
參數說明:
*defnp——從函式OCIDefineByPos返回的對應該變數的定義句柄,對應於OCIDefineByPos函式的第二項參數defnpp;
indskip——默認為0;
rlskip——默認為0;
rcskip——默認為0;
該函式使用舉例說明如下(對應於函式OCIDefineByPos的例子):
OCIDefineArrayOfStruct(dfnhp[4],
errhp,
sizeof(No[0]),
0,0,0)
定義輸入變數
OCI在執行陳述語句時,有時需要向該語句傳遞輸入值,OCI8通過函式OCIBindByPos或OCIBindByName來實現該功能,OCIBindByPos將需要輸入的變數與與其對應的參數值的位置綁定起來,從而實現向陳述語句中傳遞值的效果,而OCIBindByName則是通過綁定相應的變數名稱來實現輸入值的傳遞。
函式原型:sword OCIBindByPos ( OCIStmt *stmtp,
OCIBind **bindpp,
OCIError *errhp,
ub4 position,
dvoid *valuep,
sb4 value_sz,
ub2 dty,
dvoid *indp,
ub2 *alenp,
ub2 *rcodep,
ub4 maxarr_len,
ub4 *curelep,
ub4 mode )
參數說明:
position——需要綁定的該變數在陳述語句的列表中的位置,從1開始,依次遞增;
*valuep——需要綁定的傳入值的存儲地址;
value_sz——valuep參數的指向的存儲地址空間的長度;
dty——需要綁定的變數的數據類型;SQLT_STR表示該變數是個字元串變數;SQLT_INT則表示該變數是個整型變數;
*indp——變數或數組指示器,默認為0;
*alenp——變數或數組長度指示器,默認為0;
*rcodep——即將提取的變數的值指示器,默認為0;
maxarr_len——dyt參數的最大可能取值的數目,在非PL/SQL語句中該差數無效果;默認值為0;
*curelep——對應與maxarr_len,表示dyt參數取值的實際數目;默認值為0;
mode——變數提取模式。其取值為OCI_DEFAULT或OCI_DATA_AT_EXEC;當使用OCI_DATA_AT_EXEC時,value_sz表示在該陳述語句執行過程中可以使用的傳入的該項值的最大存儲長度,此時需要動態綁定該傳入值;一般來說,mode的取值都為OCI_DEFAULT;
該函式使用舉例如下:OCIBindByPos(stmthp, &bndhp[3],
errhp, (ub4) 4,
(dvoid *) register_number,
(sb4) nLen, SQLT_STR,
(dvoid *) 0, (ub2 *)0,
(ub2 *)0,
(ub4) 0, (ub4 *) 0,
(ub4) OCI_DEFAULT)
函式原型:sword OCIBindByName ( OCIStmt *stmtp,
OCIBind **bindpp,
OCIError *errhp,
CONST text *placeholder,
sb4 placeh_len,
dvoid *valuep,
sb4 value_sz,
ub2 dty,
dvoid *indp,
ub2 *alenp,
ub2 *rcodep,
ub4 maxarr_len,
ub4 *curelep,
ub4 mode )
參數說明:
*stmtp——用以進行查詢的陳述語句句柄;該句柄必須是已經分配成功的句柄;
**bindpp——用戶定義的傳入值集合的指針;該參數指針從下標0開始,依次遞增一個數組單元;
*placeholder——需要綁定的該變數在陳述語句中的占位符;
placeh_len——palceholder參數的長度;
*valuep——指向需要綁定的該變數的傳入值的地址;
value_sz——valuep參數存儲的變數值的位組長度;
dty——需要綁定的變數的數據類型;SQLT_STR表示該變數是個字元串變數;SQLT_INT則表示該變數是個整型變數;
*indp——變數或數組指示器,默認為0;
*alenp——變數或數組長度指示器,默認為0;
*rcodep——即將提取的變數的值指示器,默認為0;
maxarr_len——dyt參數的最大可能取值的數目,在非PL/SQL語句中該差數無效果;默認值為0;
*curelep——對應與maxarr_len,表示dyt參數取值的實際數目;默認值為0;
mode——變數提取模式。其取值為OCI_DEFAULT或OCI_DATA_AT_EXEC;當使用OCI_DATA_AT_EXEC時,value_sz表示在該陳述語句執行過程中可以使用的傳入的該項值的最大存儲長度,此時需要動態綁定該傳入值;一般來說,mode的取值都為OCI_DEFAULT;
該函式使用舉例如下:OCIBindByName(stmthp, &bndhp[1], errhp,
(text *) ":field1",
(sb4) strlen((char *) ":phone_number"),
(dvoid *) & to_field1,
(sb4) sizeof(phone_number),
SQLT_STR,
(dvoid *) 0, (ub2 *)0,
(ub2 *)0,(ub4) 0, (ub4 *) 0,
(ub4) OCI_DEFAULT)
補充說明:如果輸入變數是多行資料,則valuep參數應該為一個用戶定義了大小的靜態數組的初始地址,其大小為輸入變數的行數與該變數自身大小的乘積。此時,在函式後面還需要使用另一個函式OCIBindArrayOfStruct來定義該數組。函式OCIBindArrayOfStruct說明如下:
函式原型:sword OCIBindArrayOfStruct ( OCIBind *bindp,
OCIError *errhp,
ub4 pvskip,
ub4 indskip,
ub4 alskip,
ub4 rcskip )
參數說明:
*bindp——從函式OCIBindByPos或OCIBindByName返回的對應該變數的綁定句柄,對應於函式OCIBindByPos或OCIBindByName的第二項參數bindpp;
pvskip——從本條記錄中該變數的存儲地址的到下條記錄中該變數的存儲地址之間的大小;也就是定義的一條記錄的存儲空間的大小;
indskip——默認為0;
rlskip——默認為0;
rcskip——默認為0;
該函式使用舉例如下:OCIBindArrayOfStruct(bndhp[N],
errhp,
sizeof(record_array[0]),
indsk[N],
rlsk[N],
rcsk[N])
執行陳述語句
在執行語句分析完成,並且變數定義或綁定完成後,便可以執行該陳述句柄,從而實現陳述語句中的SQL語句能完成的功能。使用函式OCIStmtExecute來執行該陳述句柄。執行成功,返回0;
函式原型:sword OCIStmtExecute ( OCISvcCtx *svchp,
OCIStmt *stmtp,
OCIError *errhp,
ub4 iters,
ub4 rowoff,
CONST OCISnapshot *snap_in,
OCISnapshot *snap_out,
ub4 mode)
參數說明:
*svchp——已分配並設定成功的服務句柄;
*stmtp——指向需要執行的陳述語句的句柄;
iters——對於非選擇語句來說,該函式執行次數等於iters減去rowoff的值;對於選擇語句來說,如果iters不為0,則該函式在執行前必須有定義句柄(即需要定義位址空間來存儲select出來的變數值),而函式會預先提取出多於iters條記錄(如果可提取記錄條數大於iters的話),將其中iters條正式提取出來;如果事先並不知道有多少條記錄會被提取,則將iters的值置為0;在非選擇語句中,若iters的值為0,則函式返回錯誤;
rowoff——函式執行時,輸入變數在綁定的變數數組的開始位置。用於多行記錄的修改或插入、刪除;比如,定義的綁定變數為array[100],執行該函式時,iters的值為50,rowoff的值為10,則表示從array[10]開始提取傳入值,而執行的次數則是50-10 = 40(次);
*snap_in——可選參數。默認值為0;
*snap_out——可選參數。默認值為0;
mode——執行模式;有四種執行模式:
OCI_DEFAULT——預設模式,在該模式下,總是隱式返回選擇選擇語句的有關描述信息;
OCI_DESCRIBE_ONLY——在該模式下,陳述句柄並不被執行,但是它會返回可提取記錄的條數;
OCI_COMMIT_ON_SUCCESS——在該模式下,如若函式執行成功,則當前的處理馬上會自動提交;
OCI_EXACT_FETCH——該模式用於當前程式很明確的清楚有多少條記錄會被提取出來;並且,使用該模式前必須要有定義句柄;
該函式的使用舉例如下:OCIStmtExecute(svchp, stmthp, errhp,
(ub4) nCount, (ub4) 0,
(CONST OCISnapshot*) 0,
(OCISnapshot*) 0,
(ub4) OCI_DEFAULT)
另外,還可以使用函式OCIStmtFetch來提取固定數目的記錄,其函式使用說明如下:
函式原型:sword OCIStmtFetch ( OCIStmt *stmtp,
OCIError *errhp,
ub4 nrows,
ub2 orientation,
ub4 mode )
參數說明:
*stmtp——需要執行的陳述句柄;
nrows——需要提取的記錄的條數;
orientation——該參數只有唯一一個預設值:OCI_FETCH_NEXT;
mode——默認為OCI_DEFAULT;
該函式使用舉例如下:sword OCIStmtFetch (stmtp,
errhp,
rows_number,
OCI_FETCH_NEXT,
OCI_DEFAULT)
該函式成功執行,而無數據時,返回OCI_NO_DATA;
十一、事務提交
在執行陳述句柄後,有的語句如insert、delete等需要提交當前事務,從而真正實現insert、delete等功能。OCI8使用函式OCITransCommit來實現這一功能。
函式原型:sword OCITransCommit ( OCISvcCtx *svchp,
OCIError *errhp,
ub4 flags )
參數說明:
*svchp——已分配並設定成功的服務句柄;
flags——提交標誌。默認為0;
該函式使用舉例如下:OCITransCommit(svchp, errhp, (ub4) 0)
十二、事務回滾
在執行完陳述語句後,若需要取消當前執行的操作,則需要回滾當前事務。OCI8使用函式OCITransRollback來完成該功能。
函式原型:sword OCITransRollback(dvoid *svchp,
OCIError *errhp,
ub4 flags )
參數說明:
*svchp——需要回滾當前事務的服務句柄;
flags——回滾標誌。只有一個唯一的取值得:OCI_DEFAULT;
該函式使用舉例如下:OCITransRollback(svchp,
errhp,
OCI_DEFAULT)
資料庫連線
斷開與資料庫的連線需要進行下面一系列工作:結束當前會話、斷開與資料庫連線服務、釋放分配的各個句柄。下面分別說明各項工作所使用的oci函式。
結束當前會話:如果要斷開與資料庫的連線,則需要先結束當前會話,使用函式OCISessionEnd來完成該功能。執行成功,返回0
函式原型:sword OCISessionEnd(OCISvcCtx *svchp,
OCIError *errhp,
OCISession *authp,
ub4 mode)
參數說明:
*svchp——需要斷開的服務句柄;
*authp——會話句柄;
mode——會話結束模式。只有一種模式:OCI_DEFAULT;
該函式使用舉例如下:OCISessionEnd(svchp,
errhp,
authp,
(ub4) 0)
斷開與資料庫的連線服務:當前會話結束後,需要斷開與伺服器的連線,結束用戶對資料庫的操作。OCI8使用函式OCIServerDetach來完成該任務。執行成功,返回0;
函式原型:sword OCIServerDetach(OCIServer *srvhp,
OCIError *errhp,
ub4 mode )
參數說明:
*svchp——需要斷開的伺服器句柄;
mode——執行模式,只有一種模式:OCI_DEFAULT;
該函式使用舉例如下:OCIServerDetach(srvhp,
errhp,
(ub4) OCI_DEFAULT)
釋放分配的各個句柄:在結束當前會話、斷開與資料庫的連線後,由於我們手動分配了很多句柄,系統不會自動釋放,因而需要手工釋放這些句柄,清掃使用環境。OCI8里,使用函式OCIHandleFree來釋放各個句柄。
函式原型:sword OCIHandleFree(dvoid *hndlp,ub4 type)
參數說明:
*hndlp——需要釋放的句柄;
type——該句柄的類型。參見OCIHandleAlloc函式說明的type參數;
註:使用OCIHandleAlloc函式分配了哪些句柄,那么就需要用該函式釋一一放這些句柄;
創建 dblink
create public database link TO_ORCL
connect to to_orcl identified by to_orcl
using '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521)))(CONNECT_DATA =(sid = orcl)))';
大致步驟
一、 定義並初始化所需各變數
envhp、srvhp、errhp、svchp、authp、hndlp、stmthp、等等
二、連線資料庫
1、 OCIInitialize。初始化OCI程式環境
2、OCIEnvInit。 初始化OCI環境句柄
3、 OCIHandleAlloc。分配各句柄,需要分配的句柄類型如下:
OCI_HTYPE_SVCCTX,
OCI_HTYPE_ERROR,
OCI_HTYPE_SESSION,
OCI_HTYPE_SERVER,
4、 OCIServerAttach。指定資料源路徑
5、 OCIAttrSet。設定各項參數。需要設定的參數類型如下:
OCI_ATTR_SERVER 使用的句柄型為OOCI_HTYPE_SVCCTX
OCI_ATTR_USERNAME
OCI_ATTR_PASSWORD
上面兩個參數使用的句柄類型為OCI_HTYPE_SESSION
6、 OCISessionBegin。創建並開始會話
7、 OCIAttrSet。設定會話參數類型OCI_ATTR_SESSION,使用句柄為OCI_HTYPE_SVCCTX
8、 OCIHandleAlloc。分配OCI_HTYPE_STMT型陳述句柄
三、運算元據庫
1、OCIStmtPrepare。準備事件處理
2、OCIBindByPos、OCIBindByName(OCIDefineByPos)綁定(定義)變數。如果是多行資料,則需要使用
OCIBindArrayOfStruct(OCIDefineArrayOfStruct)函式來綁定(定義)存放該數據的數組
3、OCIStmtExecute。執行SQL語句
四、斷開資料庫
1、OCISessionEnd。結束會話
2、OCIServerDetach。斷開與伺服器的連線
3、OCIHandleFree。釋放已分配的各句柄。需要釋放的句柄如下:
OCI_HTYPE_SVCCTX,
OCI_HTYPE_ERROR,
OCI_HTYPE_SESSION,
OCI_HTYPE_SERVER,
OCI_HTYPE_STMT
OCI_HTYPE_ENV
五、提取出錯描述信息
1、OCIErrorGet。上述各函式若執行失敗,都可以使用該函式來提取出錯信息的ORCALE描述。