OCI操作oracle數(shù)據(jù)庫文檔良心出品_第1頁
OCI操作oracle數(shù)據(jù)庫文檔良心出品_第2頁
OCI操作oracle數(shù)據(jù)庫文檔良心出品_第3頁
OCI操作oracle數(shù)據(jù)庫文檔良心出品_第4頁
OCI操作oracle數(shù)據(jù)庫文檔良心出品_第5頁
已閱讀5頁,還剩26頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、OCI簡介1 . OCI概述OCIOracle Call Interfce ,即Oracle調(diào)用層接口是Oracle公司提供的由頭文 件和庫函數(shù)等組成的一個訪問Oracle數(shù)據(jù)庫的應(yīng)用程序編程接口 application programming interface API,它允許開發(fā)人員在第三代編程語言包括C, C+, COBOLFORTRA附通過 SQLStructure Query Language 來操縱 Oracle 數(shù)據(jù)庫, 而且OC在一定程度上支持第三代編程語言諸如C, C+, COBOL FORTRA的數(shù) 據(jù)類型、語法等等.OCI的顯著特點(diǎn)是全面支持Oracle的面向?qū)ο蠹夹g(shù),同

2、時OCI 還具有如下的一些特點(diǎn): 1非常有利于應(yīng)用程序的設(shè)計; 2高度限制應(yīng)用程序的執(zhí)行;3允許開發(fā)人員應(yīng)用已熟悉的第三代程序設(shè)計語言來應(yīng)用OCI;4支持動態(tài)SQL5幾乎所有的Oracle的開發(fā)工具都支持OCI;6通過回調(diào)技術(shù)callbacks來實(shí)現(xiàn)動態(tài)綁定與定義;7通過OCI的描述函數(shù)可以獲取 Oracle數(shù)據(jù)庫的各種參數(shù);8增強(qiáng)了數(shù)組在DMLdata manipulation language 語言中的應(yīng)用;OC接口支持Windows NTF0Windows 95/98/2O0o/xP®作系統(tǒng),它所支持的 C 語言編譯器包括Borland C+和MicrosoftVisualC+

3、 等.在使用OCFF發(fā)Oralce 數(shù)據(jù)庫應(yīng)用程序之前,應(yīng)首先安裝這些操作系統(tǒng)和C語言編譯工具.在選擇安裝OCFF發(fā)工具包后,Oracle安裝程序?qū)C文件拷貝到oracle主目錄內(nèi)的以下子 目錄中: .BIN、:執(zhí)行文件和幫助文件: .OCIINCLUDE 文件;.OCILIB其中包含仍bc和msvc®個子目錄,分別用于存儲支持Borland C+林口MicroSoflVisualC+的OCI庫文件,這些庫文件與OC源程序編譯后所產(chǎn)生 的目標(biāo)文件進(jìn)行鏈接生成可執(zhí)行程序.一個應(yīng)用 OC屐序的生成可執(zhí)行應(yīng)用程序的過程如圖1:OCI庫由此,我們可以看出:一個應(yīng)用 OCI的應(yīng)用程序與其它不

4、連接數(shù)據(jù)庫的應(yīng)用程序生成可執(zhí)行程序的過程沒有區(qū)別,在程序的鏈接階段 OCI庫與源程序的目標(biāo)代碼 文件鏈接而生成可執(zhí)行程序o2. OCI程序的根本結(jié)構(gòu)在一個應(yīng)用程序中,我們是通過調(diào)用 OC提供的庫函數(shù)來實(shí)現(xiàn)對Oracle數(shù)據(jù)庫的 操縱.OC提供了上百個函數(shù),都是以O(shè)CFF頭的函數(shù),比方創(chuàng)立OC環(huán)境的OCI 函數(shù):OCIEnvCreate().OCI函數(shù)的一個特點(diǎn)或者說是難點(diǎn)就是它的參數(shù)特別多, 函數(shù)往往都有十幾個參數(shù).一般情況下,一個OC應(yīng)用程序都是在多用戶環(huán)境下的. 在一個n層網(wǎng)絡(luò)結(jié)構(gòu)的配 置中,客戶端的應(yīng)用程序需要完成一些數(shù)據(jù)操縱,包括交換數(shù)據(jù)與處理數(shù)據(jù).-個OC應(yīng)用程序的根本結(jié)構(gòu)包括:1初

5、始化OC環(huán)境和線程;2分配必要的句柄與數(shù)據(jù)結(jié)構(gòu);3建立與數(shù)據(jù)庫的連接以及創(chuàng)立用戶會話;4通過SQlLj Oracle效勞器交換數(shù)據(jù),而后再做數(shù)據(jù)處理:5結(jié)束用戶會話與斷開與數(shù)據(jù)庫的連接;6釋放在程序中所分配的句柄.示意如圖2.神度OCI環(huán)境第一步+分配句柄與數(shù)零結(jié)構(gòu)第二步3-連S9S據(jù)庫與開始會話第三步一, ;執(zhí)行SQL與處殿廉第四步結(jié)束會話與斷開連接第五步3"釋放句柄第六步圖2 OCI程序的根本結(jié)構(gòu)3.在OCI應(yīng)用程序中執(zhí)行SQL的步驟結(jié)構(gòu)化查詢語言SQL Structure Query Language 是操縱關(guān)系數(shù)據(jù)庫的主流語 言,目前,幾乎所有的商業(yè)數(shù)據(jù)庫軟件都支持 SQ昭言

6、.標(biāo)準(zhǔn)的SQ昭言根據(jù)它的 功能不同,可以分為查詢、操縱、定義以及限制四種類型.每一種都有假設(shè)干關(guān)鍵 字,具體如表1所小.一個SQ昭句在OCI應(yīng)用程序中的執(zhí)行步驟一般如下:1)準(zhǔn)備 SQL®句.調(diào)用函數(shù) OCIStmtPrepare();2)在SQ聆句中綁定需要輸入到SQ昭句中的變量.對于DM語句來說,由于它帶 有輸入變量,我們可以通過調(diào)用一個或者多個函數(shù) OCIBindByPos()、OCIBindByName(痔把輸入變量白地址綁定在DM語句中的占位符中;3)執(zhí)行SQ昭句.調(diào)用OCIStmtExecute()函數(shù).對于DD聆旬到這一步就完成了一 個語句的執(zhí)行;4)描述SQ中的輸出的

7、數(shù)據(jù).如果有必要的話,我們可以調(diào)用函數(shù)OCIParamGet() 與OCIAttrGet()來獲取我們所讀取的記錄的字段個數(shù)、 字段的數(shù)據(jù)類型以及字段 數(shù)據(jù)定義的最大長度.5)定義輸出變量.對于DQL(Data Query Language)語句,即SELECT查詢語句, 需要定義一定數(shù)量的變量用來接受所選擇列的數(shù)據(jù).我們可以調(diào)用OCIDeflneByPos()、OCIDefineObject()函數(shù)等來完成這個任務(wù).也就建立 SQL 語句所返回的數(shù)據(jù)與應(yīng)用程序中變量的關(guān)系.6)獲取數(shù)據(jù).我們可以調(diào)用函數(shù)OCIStmtFetch()來把用SELECT中的記錄的數(shù)據(jù)賦予應(yīng)用程序中的變量.過程以及

8、過程中調(diào)用到的函數(shù)如圖3所示:SQL功能關(guān)鍵字查詢 I>QL( Data Query Langw於)SELECT操縱 DML(l)ata Manipulation Language)INSERT, DELETE, UPDATE定義 DDL(Dm& Define Language.)CREATE, DROP限制 DCL(D日ta Control Language)GRANT, REVOKE雖然Oracle對標(biāo)準(zhǔn)的SQLS言有所擴(kuò)展,但它也是建立在標(biāo)準(zhǔn)的SQ昭言的根底之 上.上圖是一個一般SQ執(zhí)行的流程圖,對于不同的SQ昭句,所需要的步驟也有 所不同.對于DCLf DDLS句,由于沒

9、有數(shù)據(jù)的輸入與輸出,僅僅涉及到一些權(quán) 限與定義或者刪除數(shù)據(jù)庫中的對象的問題, 因此只需要上圖的第一步與第三步便可以了.而對于DQLf DM語句,由于有數(shù)據(jù)的輸入與輸出,因此需要的步驟就多 一些.其實(shí),DM也可以只用兩步來完成.這是由于DM語句中僅僅涉及數(shù)據(jù)的輸 入即,數(shù)據(jù)從應(yīng)用程序到數(shù)據(jù)庫端,因此我們可以把所要輸入的數(shù)據(jù)以字符串 的形式放在SQ聆句中.而DQ不僅可能有數(shù)據(jù)輸入,而且也有數(shù)據(jù)輸出從數(shù)據(jù) 庫端到應(yīng)用程序,因此,一個DQ晤句需要如上圖的六個步驟.椎備SQLOCTStnlPrcpart 0XIBindByPosOOCIBindByMiO:KISUdObjtctO;OCIBindDynM

10、icO;OCIBindArr«yOfStract() !OCIStjitExecute 0敘迷定義變量OCIParamGet()OCIAtWM)OCIDefiittByPosO,OCIDtfineObjtet0OCID«£ineDyn«iic 0OCUhfuftlrrafOfStTvci DOCIStmtFetehOOCI環(huán)境配置Oracle oci工具包安裝:$ORACLE_HOMEBIN:執(zhí)行文件和help文件$ORACLE_HOMEOCIINCLUDE:頭文件$ORACLE_HOMEOCILIBBC: for Borlanf C+ 的 OCI 庫

11、$ORACLE_HOMEOCILIBMSVC: for MS Visual C+ 的 OCI 庫如果是unix下,對于 ORACLE8i ,那么OCI庫在$ORACLE_HOME/lib下,如果是9i,那么在$ORACLE_HOME/lib32 下,庫文件名一般為 libclntsh.so以上所有過程,只需安裝一個 oracle客戶端,oci的所有頭文件和庫文件全部包 含在內(nèi),VC開發(fā)時只需包含指定的頭文件,引用相關(guān)庫即可.OCI實(shí)現(xiàn)操作oracle 數(shù)據(jù)庫1 .創(chuàng)立OCI環(huán)境即創(chuàng)立和初始化OCI工作環(huán)境,其他的OCI函數(shù)需要OCI環(huán)境才能執(zhí)行2 .需要申請的句柄類型OCI環(huán)境句柄:OCI_H

12、TYPE_ENV 它定義所有OCI函數(shù)的環(huán)境調(diào)用環(huán)境,是 其他句柄的父句柄.(由OCIEnvInit或OCIEnvCreate生成)錯誤句柄:OCI_HTYPE_ERROR 一作為一些 OCI函數(shù)的參數(shù),用來記錄這些 OCI函數(shù)操作過程中所產(chǎn)口的錯誤,當(dāng)有錯誤發(fā)生時,可用 COIErrorGet()來讀 取錯誤句柄 中記錄的錯誤信息.效勞器環(huán)境句柄:OCI_HTYPE_SVCCTX 一定義OCI調(diào)用的效勞器操作環(huán)境,它 包含效勞器、用戶會話而事務(wù)三年句柄.效勞器句柄:OCI_HTYPE_SERVER標(biāo)識數(shù)據(jù)源,它轉(zhuǎn)換為與效勞器的物理連 接.用戶會話句柄:OCI_HTYPE_SESSION一定義

13、用戶角色和權(quán)限及 OCI調(diào)用的執(zhí) 行環(huán)境.事務(wù)句柄:OCI_HTYPE_TRANS 一定義執(zhí)行SQL操作的事務(wù)環(huán)境,事務(wù)環(huán)境中 包含用戶的會話狀態(tài)信息.語句句柄:OCI_HTYPE_STMT 一是一個標(biāo)識SQL語句或PL/SQL塊,以及其相 關(guān)屬性的環(huán)境.Bind/Define句柄:屬于語句句柄的子句柄,由 OCI庫隱式自動生成.用戶不需 要自己再中請,OCI輸入變量存儲在bind句柄中,輸出變量存儲在定義句柄中3 .句柄屬性包括效勞器環(huán)境句柄屬性:(OCI_HTYPE_SVCCTX)OCI_ATTR_SERVER一設(shè)置/讀取效勞環(huán)境的效勞器環(huán)境屬性 OCI_ATTR_SESSION一設(shè)置/讀

14、取效勞環(huán)境的會話認(rèn)證環(huán)境屬性 OCI_ATTR_TRANS 一設(shè)置/讀取效勞環(huán)境的事務(wù)環(huán)境屬性 用戶會話句柄屬性:(OCI_HTYPE_SESSION)OCI_ATTR_USERNAME一設(shè)置會話認(rèn)證所使用的用戶名 OCI_ATTR_PASSWORD一設(shè)置會話認(rèn)證所使用的用戶口令 效勞器句柄:(OCI_HTYPE_SEVER)OCI_ATTR_NOBLOCKING_MODE 設(shè)置/讀取效勞器連接:=TRUE時效勞器連 接設(shè)置為非阻塞方式語句句柄:(OCI_HTYPE_STMT)OCI_ATTR_ROW_COUNT一只讀,為當(dāng)前已處理的行數(shù),其 default=1 OCI_ATTR_STMT_T

15、YPE 一讀取當(dāng)前SQL語句的類型:Eg :OCI_STMT_BEGINOCI_STMT_SELECTOCI_STMT_INSERTOCI_STMT_UPDATEOCI_STMT_DELETEOCI_ATTR_PARAM_COUNT 一返回語句選擇列表中的列數(shù)4 .關(guān)于輸出變量定義如果在語句執(zhí)行前就知道select語句的選擇列表結(jié)構(gòu),那么定義輸出操作可在 調(diào)用OCISTMTExecute前進(jìn)行,如果查詢語句的參數(shù)為用戶動態(tài)輸入的,那么 必須在執(zhí)行后定義.5 . OCI函數(shù)返回值OCI_SUCCESS麗數(shù)執(zhí)行成功=0OCI_SUCCESS_WITH_INFO 耿行成功,但有診斷消息返回,可能是警

16、告信 息OCI_NO_DATA 函數(shù)執(zhí)行完成,但沒有其他數(shù)據(jù)OCI_ERROR一函數(shù)執(zhí)行錯誤OCI_INVALID_HANDLE 一傳遞給函數(shù)的參數(shù)為無效句柄,或傳回的句柄無 效OCI_NEED_DATA 需要應(yīng)用程序提供運(yùn)行時亥U的數(shù)據(jù)OCI_CONTINUE 一回調(diào)函數(shù)返回代碼,說明回調(diào)函數(shù)需要 OCI庫恢復(fù)其正 常的處理操作OCI_STILL_EXECUTING 一效勞環(huán)境建立在非阻塞模式,OCI函數(shù)調(diào)用正在 執(zhí)行中.6 . OCI連接有二種方式Blocking阻塞方式和non_Blocking非阻塞方式,阻塞方式就是當(dāng)調(diào)用 OCI 操作時,必須等到此OCI操作完成后效勞器才返回客戶端相

17、應(yīng)的信息, 不管 是成功還是失敗.非阻塞方式是當(dāng)客戶端提交OCI操作給效勞器后,效勞器 立即返回OCI_STILL_EXECUTING信息,而并不等待效勞端的操作完成.對于non-blocking方式,應(yīng)用程序假設(shè)收到一個 OCI函數(shù)的返回值 為OCI_STILL_EXECUTING 時必須再次對每一個 OCI函數(shù)的返回值進(jìn)行判斷,判斷其成功與否.可通過設(shè)置效勞器屬性為 OCI_ATTR_NONBLOCKING_MODE 來實(shí)現(xiàn).系 統(tǒng)默認(rèn)方式為阻塞模式.7 . OCI函數(shù)設(shè)置的模式OCI_DEFUALT:使用OCI默認(rèn)的環(huán)境OCI_THREADED :線程環(huán)境下使用OCIOCI_OBJECT

18、:對象模式OCI_SHARED:共享模式OCI_EVENTSOCI_NO_UCBOCI_ENV_NO_MUTEX :非互斥訪問模式其中模式可以用邏輯運(yùn)算符進(jìn)行迭加,將函數(shù)設(shè)置成多多種模式:如mode=OCI_SHREADED| OCI_OBJECT8 .事務(wù)當(dāng)應(yīng)用進(jìn)程與效勞器斷開連接時,程序沒有使用OCITransCommit()進(jìn)行事務(wù) 的提交,那么所有活動的事務(wù)會自動回滾.9 . OCI重定義數(shù)據(jù)類型typedef unsigned char ub1;typedef signed char sb1;typedef unsigned short ub2;typedef signed shor

19、t sb2;typedef unsigned int ub4;typedef signed int sb4;typedefub4 duword;typedefsb4 dsword;typedefdsword dword;10 .屬性操作在SQL語句準(zhǔn)備后,可以用OCIAttrSet(0設(shè)置該語句的類型屬性 OCI_ATTR_STMT_TYPE ,以后可讀取語句屬性,根據(jù)屬性分別進(jìn)行處理.11 .批量綁定輸入和定義輸出參數(shù)將數(shù)據(jù)存入一個靜態(tài)數(shù)據(jù)組中.一次執(zhí)行可以提交或讀取多行記錄值.12 .占位符和指示器變量占位符:在程序中,一些 SQL語句需要在程序運(yùn)行時才能確定它的語句數(shù) 據(jù),在設(shè)計時可用一

20、個占位符來代替,當(dāng)程序運(yùn)行時,在它準(zhǔn)備好語句后, 必須為每個占位符指定一個變量,即將占位符與程序變量地址結(jié)合,執(zhí)行時, Oracle就從這些變量中讀取數(shù)據(jù),并將它們與 SQL語句一起傳遞給Oracle 效勞器執(zhí)行.OCI結(jié)合占位符時,它將占位符與程序變量關(guān)聯(lián)起來,并同時 要指出程序變量的數(shù)據(jù)類型和數(shù)據(jù)長度.如:select * from test where name=:p1 and age>:p2:p1和:p2為占位符指示器變量:由于在Oracle中,列值可以為NULL ,但在C語言中沒有NULL 值,為了能使OCI程序表達(dá)NULL列值,OCI函數(shù)允許程序為所執(zhí)行語句中 的結(jié)合變量同時

21、關(guān)聯(lián)一個指示符變量或指示符變量數(shù)組,以說明所結(jié)合的占 位符是否為NULL或所讀取的列值是否為NULL ,以及所讀取的列值是否被 截取.除SQLT_NTY SQL Named DataType外,指示符變量或指示符變量數(shù)組的數(shù)據(jù)類型為sb2,其值說明:作為輸入變量時:如insert ,update語句中=-1: OCI程序?qū)ULL賦給Oracle表的列,忽略占位符結(jié)合的程序變量值>=0:應(yīng)用程序?qū)⒊绦蜃兞恐蒂x給指定列作為輸出變量時:如select語句中=-2:所讀取的列數(shù)據(jù)長度大于程序變量的長度,那么被截取.=-1:所讀取的值為NULL,輸出變量的值不會被改變.=0:數(shù)據(jù)被完整讀入到指定

22、的程序變量中>0:所讀取的列數(shù)據(jù)長度大于程序變量的長度,那么被截取,指示符變量值為所讀取數(shù)據(jù)被截取前的實(shí)際長度OCI函數(shù)說明例如以下面結(jié)構(gòu)作為說明sword swResult;OCIBind* hBind;OCIDefine* hDefine;OCIStmt *stmtpOCIError *errhp ;OCIStmt *stmtpOCISvcCtx * svchpOCIEnv * envhpp;OCISession * usrhp;sb2 sb2aInd30; /后旨示器變量,用于取可能存在空值的字段Typedef strcutchar tname40;int age; t_std;t

23、ypedef struct(sb2 sb2_tname100;sb2 sb2_age100; stdInd_T; /指示器數(shù)組typedef struct(ub2 ub2_tname100;ub2 ub2_age100; stdLen_T; /字段長度t_std tstd100; /數(shù)組變量,用于批量操作stdInd_T tstdInd;stdLen_T tstdLen;stdLen_T tstdRet;t_std std;各函數(shù)數(shù)明1 .創(chuàng)立OCI環(huán)境sword OCIEnvCreate(OCIEnv *envhpp, /OCI 環(huán)境句柄指針ub4 mode, /創(chuàng)始化模式:OCI_DEFA

24、ULT/OCI_THREADED 等CONST dvoid *ctxp,CONST dvoid *(*malicfp)(dvoid *ctxp,size_t size),CONST dvoid *(ralocfp)(dvoid *ctxp,dvoid *memptr,size_t newsize),CONST void *(*mfreefp)(dvoid *ctxp,dvoid *memptr),Size_t xstramemsz,Dvoid *usrmempp) eg :swResult = OCIEnvCreate(&envhpp, OCI_DEFAULT, NULL, NULL,

25、 NULL, N ULL, 0, NULL);if(swResult != OCI_SUCCESS && swResult != OCI_SUCCESS_WITH_INFO) return FALSE;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 vo

26、id (*mfreefp) (/*_ dvoid *ctxp, dvoid *memptr _*/) );sword OCIEnvInit (OCIEnv *envhpp,ub4 mode,size_t xtramemsz, dvoid *usrmempp );注:在8i以后,可用 OCIEnvCreate一個函數(shù)就可以初始化環(huán)境了,相當(dāng)于 OCIInitialize+ OCIEnvInit2 .申請/釋放句柄sword OCIHandleAlloc(CONST dvoid *parenth, /新申請句柄的父句柄,一般為 OCI環(huán)境句柄Dvoid *hndlpp, /申請的新句柄Ub4 ty

27、pe, type, /句柄類型Size_t xtramem_sz, /用請的 內(nèi)存數(shù)Dvoid *usrmempp 中請到的內(nèi)存塊指針)注:一般需要申請的句柄有:效勞器句柄 OCIServer,句柄類型 OCI_HTYPE_SERVER錯誤句柄OCIError,用于捕獲OCI錯誤信息,句柄類型OCI_HTYPE_ERROR 事務(wù)句柄 OCISession,句柄類型 OCI_HTYPE_SESSION上下文句柄OCISvcCtx,句柄類型OCI_HTYPE_SVCCTXSQL 語句句柄 OCIStmt,句柄類型 OCI_HTYPE_STMTeg:申請一個錯誤句柄OCIErrorswResult

28、= OCIHandleAlloc(envhpp, (dvoid *)& errhp, OCI_HTYPE_ERROR, 0,NULL);if(swResult != OCI_SUCCESS && swResult != OCI_SUCCESS_WITH_INFO)return FALSE;釋放句柄sword OCIHandleFree(dvoid *hndlp, 要釋放的句柄ub4 type /柄類型)eg:OCIHandleFree(stmtp, OCI_HTYPE_STMT)3 .讀取/設(shè)置句柄屬性sword OCIAttrSet(dvoid *trgthndlp,

29、 需設(shè)置的句柄名ub4 trghndltyp, /句柄類型dvoid *attributep, /設(shè)置的屬性名ub4 size, /H性值長度ub4 attrtype, /H 性類型OCIError *errhp 錯誤句柄)注:一般要設(shè)置的屬性有:效勞器實(shí)例:句柄類型 OCI_HTYPE_SVCCTX ,屬性類型 OCI_ATTR_SERVER 連接數(shù)據(jù)的用戶名:句柄類型 OCI_HTYPE_SESSION ,屬性類型 OCI_ATTR_USERNAME 用戶密碼句柄類型 OCI_HTYPE_SESSION ,屬性類型 OCI_ATTR_PASSWORD 事務(wù):句柄類型 OCI_HTYPE_S

30、VCCTX ,屬性類型 OCI_ATTR_SESSIONeg:設(shè)置用戶名和密碼char username20,passwd20;strcpy(username, " tiger " ) strcpy(passwd, cotton ) swResult = OCIAttrSet(usrhp, OCI_HTYPE_SESSION, (text*) username, strlen( username),OCI_ATTR_USERNAME, errhp);if(swResult != OCI_SUCCESS && swResult != OCI_SUCCESS_W

31、ITH_INFO) return FALSE;swResult = OCIAttrSet(usrhp, OCI_HTYPE_SESSION, (text*) passwd, strlen(p asswd),OCI_ATTR_PASSWORD, errhp);if(swResult != OCI_SUCCESS && swResult != OCI_SUCCESS_WITH_INFO) return FALSE;sword OCIAttrGet(dvoid *trgthndlp, 需讀取的句柄名ub4 trghndltyp, /句柄類型dvoid *attributep, /讀取

32、的屬性名ub4 *sizep, /屬性值長度ub4 attrtype,/S 性類型OCIError *errhp 錯誤句柄 )4 .連接/斷開效勞器多用戶方式連接:sword OCIServerAttach(OCIServer *srvhp,/未初始化的效勞器句柄OCIError *errhp, CONST text *dblink,效勞器 SID sb4dblink_len,ub4mode /=OCI_DEFAULT系統(tǒng)環(huán)境將設(shè)為阻塞方式);sword OCIServerDetach ( OCIServer *srvhp,OCIError *errhp, ub4 mode /OCI_DEFA

33、ULT ); 單用戶方式連接: sword OCILogon ( OCIEnv *envhp,OCIError *errhp,OCISvcCtx *svchp,CONST text *username, ub4 uname_len,CONST text *password, ub4passwd_len,CONST text *dbname, ub4dbname_len);sword OCILogoff (OCISvcCtx *svchp OCIError *errhp );5 .開始/結(jié)束一個會話先認(rèn)證用戶再建立一個會話連接 sword OCISessionBegin ( OCISvcCtx

34、*svchp, /效勞環(huán)境句柄OCISession *usrhp,仰戶會話句柄ub4credt, /塊證類型ub4mode /操作模式);*認(rèn)證類型:OCI_CRED_RDBMS:用數(shù)據(jù)庫用戶名和密碼進(jìn)行認(rèn)證,那么先要設(shè)置OCI_ATTR_USERNAME 和 OCI_ATTR_PASSWORD 屬性O(shè)CI_CRED_EXT:外部認(rèn)證,不需要設(shè)置用戶和密碼OCI_DEFAULT :用戶會話環(huán)境只能被指定的效勞器環(huán)境句柄所設(shè)置OCI_SYSDBA:用戶要具有sysdba權(quán)限OCI_SYSOPER:用戶要具有sysoper權(quán)限Eg:swResult = OCISessionBegin(svchp,

35、 errh,usrhp, OCI_CRED_RDBMS, OCI_DEFAULT);if(swResult != OCI_SUCCESS && swResult != OCI_SUCCESS_WITH_INFO)return FALSE;sword OCISessionEnd (OCISvcCtx *svchp,OCIError *errhp,OCISession *usrhp,ub4 mode );6 .讀取錯誤信息sword OCIErrorGet (dvoid *hndlp, 錯誤句柄ub4recordno,/A那里讀取錯誤記錄,從1開始text*sqlstate,/已取

36、消,=NULLsb4*errcodep, /昔誤號text *bufp, 錯誤內(nèi)容ub4bufsiz, /bufp 長度ub4type /(專遞的錯誤句柄類型=OCI_HTYPE_ERROR:錯誤句柄=OCI_HTYPE_ENV :環(huán)境句柄);eg:ub4 ub4RecordNo = 1;OCIError* hErrorsb4 sb4ErrorCode;char sErrorMsg1024;if (OCIErrorGet(hError, ub4RecordNo+, NULL, &sb4ErrorCode, (OraText*) sE rrorMsg, sizeof(sErrorMsg)

37、, OCI_HTYPE_ERROR) = OCI_SUCCESS)printf( “n" sErrorMsg);7 .準(zhǔn)備SQL語句sword OCIStmtPrepare (OCIStmt *stmtp,/語句句柄OCIError *errhp,CONST text *stmt, /SQL 語句ub4 stmt_len, /脩句長度ub4 language,旃句的語法格式=OCI_NTV_SYNTAXub4 mode /=OCI_DEFAULT);eg:char sSQL1024;sprintf(sSQL, “selecable_name from user_tables &quo

38、t; );swResult = OCIStmtPrepare(stmtp errhp, (CONST OraText*)sSQL, strlen(sSQL),OCI_NTV_SYNTAX, OCI_DEFAULT);if(swResult != OCI_SUCCESS && swResult != OCI_SUCCESS_WITH_INFO) return FALSE;8 .綁定輸入?yún)?shù)OCIBindArrayOfStruct() Set skip parameters for static array bind,數(shù)組綁定,一般用于批量操作OCIBindByName() Bin

39、d by name 按名綁定OCIBindByPos() Bind by position按位置綁定,建議一般按此方式綁定OCIBindDynamic()Sets additional attributes after bind with OCI_DATA_AT_EXEC modeOCIBindObject() Set additional attributes for bind of named data type注:OCIBindArrayOfStruct 必須先用 OCIBindByPos 初始化,然后在 OCIBindArrayOfStruct中定義每個參數(shù)所跳過的字節(jié)數(shù).如:存儲方式

40、:第一條記錄第二條記錄NSkipPara便際就是結(jié)構(gòu)體長度,即本次所啟列的長度和sword OCIBindByPos ( OCIStmt*stmtp,OCIBind*bindpp,OCIError*errhp,ub4position, /綁定的位置dvoid*valuep, /緩沖區(qū)地址sb4value_sz, /片一條記錄的長度ub2dty,/在OCI中的數(shù)據(jù)類型dvoid*indp, 是否為空的標(biāo)志ub2*alenp,ub2*rcodep,ub4maxarr_len,ub4*curelep,ub4mode );sword OCIBindByName (OCIStmt*stmtp, 語句句柄

41、OCIBind*bindpp,/結(jié)合句柄尸NULLOCIError*errhp,CONST text*placeholder,/占位符名稱sb4placeh_len, /占位符長度dvoid*valuep, 綁定的變量名sb4value_sz, /郁定的變量名長度ub2dty,/綁je的類型dvoid*indp,/指示符變量指針sb2類型,單條綁定時為NULL,ub2*alenp, /說明執(zhí)行前后被結(jié)合的數(shù)組變量中各元素數(shù)據(jù)實(shí)際的長度,單條綁定時為NULLub2*rcodep,/列級返回碼數(shù)據(jù)指針,單條綁定時為NULLub4maxarr_len,/服多的記錄數(shù),如果是單條綁定,那么為0ub4*

42、curelep, /實(shí)際的記錄數(shù),單條綁定那么為NULLub4mode /=OCI_DEFAULT);sword OCIBindArrayOfStruct (OCIBind *bindp,綁定的結(jié)構(gòu)句柄,由OCIBindByPos定義OCIError *errhp,ub4pvskip, /小一列跳過的字節(jié)數(shù)*ub4indskip,/F一個指示器或數(shù)組跳過的字節(jié)數(shù)ub4alskip, /F一個實(shí)際值跳過的字節(jié)數(shù)ub4rcskip 一個歹U級返回值跳過的字節(jié)數(shù));例:sword swResult;OCIBind* hBind;Ub4 rec_num;Sql: insert into student

43、 values (:p1,:p2)單條綁定:hBind = NULL;swResult = OCIBindByPos(stmtp &hBind, errhp,1,ststd.tname,sizeof(ststd.tname), SQLT_CHR, NULL,NULL,NULL,0, NULL, OCI_DEFAULT);批量取數(shù)據(jù),一次取100條Sql: select username,age from student where username=:p1 and age=:p2hBind = NULL;swResult = OCIBindByPos(stmtp &hBind,

44、 errhp,1,tstd0.tname, sizeof(tstd0.tname), SQLT_CHR, &tstdInd.sb2_usernmae0, &tstdLen.ub2_username0,&tstdRet.ub2_username0,100, &rec_num, OCI_DE FAULT);swResult = OCIBindArrayOfStruct(hBind, errhp,sizeof(tstd 0), sizeof(sb2), size of(ub2), sizeof(ub2);9 .執(zhí)行SQL語句sword OCIStmtExecute (

45、OCISvcCtx *svchp, /效勞環(huán)境句柄OCIStmt*stmtp, /語句句柄OCIError*errhp,ub4iters, / *ub4rowoff, /*CONST OCISnapshot *snap_in, OCISnapshot *snap_out, ub4mode /*); *注: 1. iters:對于select語句,它說明一次執(zhí)行讀取到 buffer中的記錄行數(shù),如果 不能確定select語句所返回的行數(shù),可將iters設(shè)置為0,而對于其他的語句, iters表示這些語句的執(zhí)行次數(shù),此時iters不能為0.2. rowoff:在多行執(zhí)行時,該參數(shù)表示從所結(jié)合的數(shù)據(jù)

46、變量中的第幾條記錄開 始執(zhí)行(即記錄偏移量).3. mode: =OCI_DEFAULT:default 模式=OCI_DESCRIBE_ONLY :描述模式,只返回選擇列表的描述信息,而不執(zhí) 行語句=OCI_COMMIT_ON_SUCCESS :自動提交模式,當(dāng)執(zhí)行成功后,自動提交.=OCI_EXACT_FETCH:精確提取模式.=OCI_BATCH_ERRORS:批錯誤執(zhí)行模式:用于執(zhí)行數(shù)組方式的操作,在此 模式下,批量insert ,update,deleteM,執(zhí)行過程中任何一條記錄錯誤不會導(dǎo)致 整個insert ,update,delet既敗,系統(tǒng)自動會收集錯誤信息,而在非批錯誤方式

47、 下,其中的任何一條記錄錯誤,將會導(dǎo)致整個操作失敗.Eg:執(zhí)行一次swResult = OCIStmtExecute(svchp, stmtp, errhp ,1,0, NULL, NULL, OCI_DEFAULT);批量執(zhí)行100次:swResult = OCIStmtExecute(svchp, stmtp, errhp ,100, 0, NULL, NULL, OCI_DEFAULT);10 .定義輸出變量OCIDefineArrayOfStruct() Set additional attributes for static array define OCIDefineByPos()

48、 Define an output variable associationOCIDefineDynamic() Sets additional attributes for define in OCI_DYNAMIC_ FETCH modeOCIDefineObject() Set additional attributes for define of named data typesword OCIDefineByPos (OCIStmt *stmtp, /語句句柄OCIDefine *defnpp,/定義句柄一用于數(shù)組變量OCIError *errhp,ub4position,/位置序號

49、(從1開始)dvoid *valuep,解俞出的變量名sb4value_sz,變量長度ub2dty,傲據(jù)類型dvoid*indp, /指示器變量/指示器變量數(shù)組,如果此字段可能存在空值,那么要指示器變量,否那么單條處理時為NULLub2*rlenp, /提取的數(shù)據(jù)長度ub2*rcodep, /列級返回碼數(shù)組指針ub4 mode OCI_DEFAULT);sword OCIDe巾neArrayOfStruct (OCIDefine *defnp,/ 由 OCIDefineByPos 定義的句柄OCIError *errhp,ub4 pvskip, /下一列跳過的字節(jié)數(shù),一般就是結(jié)構(gòu)的大小ub4i

50、ndskip,/F一個指示器或結(jié)構(gòu)跳過的字節(jié)數(shù),=0ub4 rlskip, /下一個實(shí)際值跳過的字節(jié)數(shù),=0 ub4 rcskip一個歹U歹!J級返回值跳過的字節(jié)數(shù),=0);sword OCIDefineDynamic (OCIDefine *defnp,OCIError *errhp, dvoid *octxp, OCICallbackDefine (ocbfp)(/*_ dvoid*octxp,OCIDefine *defnp, ub4iter,第25頁共33頁dvoid*bufpp,ub4*alenpp,ub1*piecep,dvoid*indpp,ub2*rcodep _*/);swo

51、rd OCIDefineObject ( OCIDefine *defnp, OCIError *errhp, CONST OCIType *type, dvoid*pgvpp,ub4*pvszsp,dvoid*indpp,ub4*indszp );eg:單條查詢sql: select username,age from student where username=:p1; 如果此字段有可能有空值,那么hDefine = NULL;swResult = OCIDefineByPos(stmtp &hDefine, errhp, 1, tstd.username, sizeof(tst

52、d .username), SQLT_CHR, & sb2aInd0, NULL, NULL, OCI_DEFAULT);如果此字段沒有空值,那么hDefine = NULL;swResult = OCIDefineByPos(stmtp &hDefine, errhp, 1, tstd.username, sizeof(tstd .username), SQLT_CHR, NULL, NULL, NULL, OCI_DEFAULT);批量查詢select username,age from student where age>30;hDefine = NULL;swRe

53、sult = OCIDefineByPos(stmtp, &hDefine, errhp, 1, &tstd0.username, 第26頁共33頁sizeof(tstd0.usenmae), SQLT_CHR, NULL, NULL, NULL, OCI_DEFAULT);swResult = OCIDefineArrayOfStruct(hDefine, errhp, sizeof(tstd0), 0, 0, 0);11 .提取結(jié)果sword OCIStmtFetch (OCIStmt *stmtp,/語句句柄 OCIError *errhp, ub4nrows, /從當(dāng)前

54、位置處開始一次提取的記錄數(shù),對于數(shù)據(jù)變量,可以1,否那么不能1ub2orientation,/提取的方向:OCI_FETCH_NEXTub4 mode /OCI_DEFAULT )eg while (swResult=OCIStmtFetch stmtp errhp,1,OCI_FETCH_NEXT,OCI_DEFAULT) != OCI_NO_DATA) 12 .事務(wù)操作開始一個事務(wù)sword OCITransStart (OCISvcCtx *svchp,OCIError *errhp, uword timeout, /* ub4 flags );1. Timeout:當(dāng)flag=OCI_

55、TRANS_RESUME:它表示還有多少秒事務(wù)將被激活 =OCI_TRANS_NEW:事務(wù)響應(yīng)的超時時間(秒)2. Flags指定一個新的事務(wù)還是已有事務(wù)=OCI_TRANS_NEW :定義一個新的事務(wù)=OCI_TRANS_RESUME準(zhǔn)備一個事務(wù):sword OCITransPrepare (OCISvcCtx *svchp,OCIError *errhp,ub4 flags );/OCI_DEFAULTsword OCITransForget (OCISvcCtx *svchp,OCIError *errhp,ub4 flags );/OCI_DEFAULT斷開一個事務(wù):sword OCITransDetach (OCISvcCtx *svchp,OCIError *errhp,ub4flags );OCI_DEFAULT提交一個事務(wù):sword OCITransCommit (OCISvcCtx *svchp, /效勞環(huán)境句柄OCIError *errhp,ub4 flags ); /OCI_DEFAULT回

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論