• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            整理的OCI文檔(轉(zhuǎn)載)


            網(wǎng)上很少有OCI的中文文檔,一般英文文檔大家可能看了也不太順,我整理了一份,寫(xiě)了一些常用的OCI函數(shù),供大家參考。
            因?yàn)闊o(wú)法加附件,只好把內(nèi)容貼上來(lái)了
            一. Oracle oci工具包安裝:
            $ORACLE_HOME\BIN:執(zhí)行文件和help文件
            $ORACLE_HOME\OCI\INCLUDE:頭文件
            $ORACLE_HOME\OCI\LIB\BC:  for Borlanf C++的OCI庫(kù)
            $ORACLE_HOME\OCI\LIB\MSVC:  for MS Visual C++的OCI庫(kù)

            如果是unix下,對(duì)于ORACLE8i,則OCI庫(kù)在$ORACLE_HOME/lib下,如果是9i,則在$ORACLE_HOME/lib32下,庫(kù)文件名一般為libclntsh.so
            1. 創(chuàng)建OCI環(huán)境即創(chuàng)建和初始化OCI工作環(huán)境,其他的OCI函數(shù)需要OCI環(huán)境才能執(zhí)行。
            2. 需要申請(qǐng)的句柄類(lèi)型:
            OCI環(huán)境句柄: OCI_HTYPE_ENV—它定義所有OCI函數(shù)的環(huán)境調(diào)用環(huán)境,是其他句柄的父句柄。(由OCIEnvInit或OCIEnvCreate生成)
             錯(cuò)誤句柄:OCI_HTYPE_ERROR—作為一些OCI函數(shù)的參數(shù),用來(lái)記錄這些OCI函數(shù)操作過(guò)程中所產(chǎn)生的錯(cuò)誤,當(dāng)有錯(cuò)誤發(fā)生時(shí),可用COIErrorGet()來(lái)讀取錯(cuò)誤句柄 中記錄的錯(cuò)誤信息。
            服務(wù)器環(huán)境句柄:OCI_HTYPE_SVCCTX—定義OCI調(diào)用的服務(wù)器操作環(huán)境,它包含服務(wù)器、用戶(hù)會(huì)話(huà)和事務(wù)三種句柄。
            服務(wù)器句柄:OCI_HTYPE_SERVER—標(biāo)識(shí)數(shù)據(jù)源,它轉(zhuǎn)換為與服務(wù)器的物理連接。
            用戶(hù)會(huì)話(huà)句柄:OCI_HTYPE_SESSION—定義用戶(hù)角色和權(quán)限及OCI調(diào)用的執(zhí)行環(huán)境。
            事務(wù)句柄:OCI_HTYPE_TRANS—定義執(zhí)行SQL操作的事務(wù)環(huán)境,事務(wù)環(huán)境中包含用戶(hù)的會(huì)話(huà)狀態(tài)信息。
            語(yǔ)句句柄:OCI_HTYPE_STMT—是一個(gè)標(biāo)識(shí)SQL語(yǔ)句或PL/SQL塊,以及其相關(guān)屬性的環(huán)境。
            Bind/Define句柄:屬于語(yǔ)句句柄的子句柄,由OCI庫(kù)隱式自動(dòng)生成。用戶(hù)不需要自己再申請(qǐng),OCI輸入變量存儲(chǔ)在bind 句柄中,輸出變量存儲(chǔ)在定義句柄中

             3. 句柄屬性包括:
            服務(wù)器環(huán)境句柄屬性:(OCI_HTYPE_SVCCTX)
             OCI_ATTR_SERVER—設(shè)置/讀取服務(wù)環(huán)境的服務(wù)器環(huán)境屬性
             OCI_ATTR_SESSION—設(shè)置/讀取服務(wù)環(huán)境的會(huì)話(huà)認(rèn)證環(huán)境屬性
                           OCI_ATTR_TRANS—設(shè)置/讀取服務(wù)環(huán)境的事務(wù)環(huán)境屬性
            用戶(hù)會(huì)話(huà)句柄屬性:(OCI_HTYPE_SESSION)
            OCI_ATTR_USERNAME—設(shè)置會(huì)話(huà)認(rèn)證所使用的用戶(hù)名
              OCI_ATTR_PASSWORD—設(shè)置會(huì)話(huà)認(rèn)證所使用的用戶(hù)口令
            服務(wù)器句柄:(OCI_HTYPE_SEVER)
            OCI_ATTR_NOBLOCKING_MODE—設(shè)置/讀取服務(wù)器連接:=TRUE時(shí)服務(wù)器連接設(shè)置為非阻塞方式
            語(yǔ)句句柄:(OCI_HTYPE_STMT) 
            OCI_ATTR_ROW_COUNT—只讀,為當(dāng)前已處理的行數(shù),其default=1
            OCI_ATTR_STMT_TYPE—讀取當(dāng)前SQL語(yǔ)句的類(lèi)型:
            Eg : OCI_STMT_BEGIN
                   OCI_STMT_SELECT   OCI_STMT_INSERT    
            OCI_STMT_UPDATE  OCI_STMT_DELETE
                               OCI_ATTR_PARAM_COUNT—返回語(yǔ)句選擇列表中的列數(shù)
            4. 關(guān)于輸出變量定義:如果在語(yǔ)句執(zhí)行前就知道select語(yǔ)句的選擇列表結(jié)構(gòu),則定義輸出操作可在調(diào)用 OCISTMTExecute前進(jìn)行,如果查詢(xún)語(yǔ)句的參數(shù)為用戶(hù)動(dòng)態(tài)輸入的,則必須在執(zhí)行后定義。
            5. OCI函數(shù)返回值:
            OCI_SUCCESS –函數(shù)執(zhí)行成功 (=0)
            OCI_SUCCESS_WITH_INFO –執(zhí)行成功,但有診斷消息返回,可能是警告信息
            OCI_NO_DATA—函數(shù)執(zhí)行完成,但沒(méi)有其他數(shù)據(jù)
            OCI_ERROR—函數(shù)執(zhí)行錯(cuò)誤
            OCI_INVALID_HANDLE—傳遞給函數(shù)的參數(shù)為無(wú)效句柄,或傳回的句柄無(wú)效
            OCI_NEED_DATA—需要應(yīng)用程序提供運(yùn)行時(shí)刻的數(shù)據(jù)
            OCI_CONTINUE—回調(diào)函數(shù)返回代碼,說(shuō)明回調(diào)函數(shù)需要OCI庫(kù)恢復(fù)其正常的處理操作
            OCI_STILL_EXECUTING—服務(wù)環(huán)境建立在非阻塞模式,OCI函數(shù)調(diào)用正在執(zhí)行中。
            6. OCI連接有二種方式:Blocking(阻塞方式)和non_Blocking(非阻塞方式),阻塞方式就是當(dāng)調(diào)用 OCI操作時(shí),必須等到此OCI操作完成后服務(wù)器才返回客戶(hù)端相應(yīng)的信息,不管是成功還是失敗。非阻塞方式是當(dāng)客戶(hù)端提交OCI操作給服務(wù)器后,服務(wù)器立即返回OCI_STILL_EXECUTING信息,而并不等待服務(wù)端的操作完成。
               
                
              對(duì)于non-blocking方式,應(yīng)用程序若收到一個(gè)OCI函數(shù)的返回值為 OCI_STILL_EXECUTING時(shí)必須再次對(duì)每一個(gè)OCI函數(shù)的返回值進(jìn)行判斷,判斷其成功與否。
              可通過(guò)設(shè)置服務(wù)器屬性為OCI_ATTR_NONBLOCKING_MODE來(lái)實(shí)現(xiàn)。系統(tǒng)默認(rèn)方式為阻塞模式.
            7. OCI函數(shù)設(shè)置的模式有:
              OCI_DEFUALT:使用OCI默認(rèn)的環(huán)境
              OCI_THREADED:線(xiàn)程環(huán)境下使用OCI
              OCI_OBJECT:對(duì)象模式
              OCI_SHARED:共享模式
              OCI_EVENTS
              OCI_NO_UCB
              OCI_ENV_NO_MUTEX:非互斥訪(fǎng)問(wèn)模式
              其中模式可以用邏輯運(yùn)算符進(jìn)行迭加,將函數(shù)設(shè)置成多多種模式:如mode=OCI_SHREADED| OCI_OBJECT

            8. 當(dāng)應(yīng)用進(jìn)程與服務(wù)器斷開(kāi)連接時(shí),程序沒(méi)有使用OCITransCommit()進(jìn)行事務(wù)的提交,則所有活動(dòng)的事務(wù)會(huì)自動(dòng)回滾。 
            9. OCI重定義數(shù)據(jù)類(lèi)型
                 typedef unsigned char  ub1;    
            typedef   signed char  sb1;
            typedef unsigned short    ub2;  
            typedef   signed short    sb2;
            typedef unsigned int  ub4;   
            typedef   signed int  sb4;  
            typedef         ub4      duword;    
            typedef         sb4      dsword;    
            typedef         dsword   dword;

            10. 在SQL語(yǔ)句準(zhǔn)備后,可以用OCIAttrSet(0設(shè)置該語(yǔ)句的類(lèi)型屬性O(shè)CI_ATTR_STMT_TYPE,以后可讀取語(yǔ)句屬性,根據(jù)屬性分別進(jìn)行處理。
            11. 批量綁定輸入和定義輸出參數(shù):將數(shù)據(jù)存入一個(gè)靜態(tài)數(shù)據(jù)組中。一次執(zhí)行可以提交或讀取多行記錄值。
            12. 結(jié)合占位符和指示器變量:
            占位符:在程序中,一些SQL語(yǔ)句需要在程序運(yùn)行時(shí)才能確定它的語(yǔ)句數(shù)據(jù),在設(shè)計(jì)時(shí)可用一個(gè)占位符來(lái)代替,當(dāng)程序運(yùn)行時(shí),在它準(zhǔn)備好語(yǔ)句后,必須為每個(gè)占位符指定一個(gè)變量,即將占位符與程序變量地址結(jié)合,執(zhí)行時(shí),Oracle就從這些變量中讀取數(shù)據(jù),并將它們與SQL語(yǔ)句一起傳遞給Oracle服務(wù)器執(zhí)行。OCI結(jié)合占位符時(shí),它將占位符與程序變量關(guān)聯(lián)起來(lái),并同時(shí)要指出程序變量的數(shù)據(jù)類(lèi)型和數(shù)據(jù)長(zhǎng)度。
            如:select * from test where name=:p1 and age>;:p2 
            :p1和:p2為占位符

            指示器變量:由于在Oracle中,列值可以為NULL,但在C語(yǔ)言中沒(méi)有NULL值,為了能使OCI程序表達(dá)NULL列值,OCI函數(shù)允許程序?yàn)樗鶊?zhí)行語(yǔ)句中的結(jié)合變量同時(shí)關(guān)聯(lián)一個(gè)指示符變量或指示符變量數(shù)組,以說(shuō)明所結(jié)合的占位符是否為NULL或所讀取的列值是否為NULL,以及所讀取的列值是否被截取。
            除SQLT_NTY(SQL Named DataType)外,指示符變量或指示符變量數(shù)組的數(shù)據(jù)類(lèi)型為sb2,其值說(shuō)明:
            作為輸入變量時(shí):(如insert ,update語(yǔ)句中)
             =-1:OCI程序?qū)ULL賦給Oracle表的列,忽略占位符結(jié)合的程序變量值
            >;=0:應(yīng)用程序?qū)⒊绦蜃兞恐蒂x給指定列
            作為輸出變量時(shí):(如select語(yǔ)句中)
             =-2:所讀取的列數(shù)據(jù)長(zhǎng)度大于程序變量的長(zhǎng)度,則被截取。
             =-1:所讀取的值為NULL,輸出變量的值不會(huì)被改變。
            =0:數(shù)據(jù)被完整讀入到指定的程序變量中
            >0:所讀取的列數(shù)據(jù)長(zhǎng)度大于程序變量的長(zhǎng)度,則被截取,指示符變量值為所讀取數(shù)據(jù)被截取前的實(shí)際長(zhǎng)度
            三. OCI函數(shù)說(shuō)明
            注:紅色為輸入?yún)?shù)   藍(lán)色為輸出參數(shù)  ,否則為輸入/出參數(shù)

             示例以下面結(jié)構(gòu)作為說(shuō)明
               sword     swResult;
            OCIBind*  hBind;
              OCIDefine*  hDefine;
            OCIStmt      *stmtp
            OCIError     *errhp;
            OCIStmt       *stmtp
            OCISvcCtx  * svchp
            OCIEnv * envhpp;
            OCISession * usrhp;
            sb2 sb2aInd[30]; //指示器變量,用于取可能存在空值的字段
            Typedef strcut 
            {
            char tname[40];
            int age;
            } t_std;
            typedef struct
            {
            sb2     sb2_tname[100];
                    sb2     sb2_age[100];
            } stdInd_T;  //指示器數(shù)組
            typedef struct
            {
            ub2     ub2_tname[100];
                   ub2     ub2_age[100];
            } stdLen_T; //字段長(zhǎng)度

            t_std tstd[100];  //數(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, //初始化模式:OCI_DEFAULT/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, NULL, NULL, 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 void    (*mfreefp) (/*_ dvoid *ctxp, dvoid *memptr _*/)
            );

            sword OCIEnvInit ( 
            OCIEnv    **envhpp,
                               ub4       mode,
                                size_t    xtramemsz,
                               dvoid     **usrmempp
             );
            注:
             在8i以后,可用OCIEnvCreate一個(gè)函數(shù)就可以初始化環(huán)境了,相當(dāng)于OCIInitialize+ OCIEnvInit

            2.申請(qǐng)/釋放句柄
               sword OCIHandleAlloc(
            CONST dvoid *parenth,  //新申請(qǐng)句柄的父句柄,一般為OCI環(huán)境句柄
            Dvoid **hndlpp,   //申請(qǐng)的新句柄 
            Ub4 type, type,  //句柄類(lèi)型
            Size_t xtramem_sz,   //申請(qǐng)的內(nèi)存數(shù)
            Dvoid **usrmempp  //申請(qǐng)到的內(nèi)存塊指針
            )
            注:
              一般需要申請(qǐng)的句柄有:
                           服務(wù)器句柄OCIServer, 句柄類(lèi)型OCI_HTYPE_SERVER
            錯(cuò)誤句柄OCIError,用于捕獲OCI錯(cuò)誤信息, 句柄類(lèi)型OCI_HTYPE_ERROR
            事務(wù)句柄OCISession, 句柄類(lèi)型OCI_HTYPE_SESSION
            上下文句柄OCISvcCtx, 句柄類(lèi)型OCI_HTYPE_SVCCTX
            SQL語(yǔ)句句柄OCIStmt, 句柄類(lèi)型OCI_HTYPE_STMT
            eg: 申請(qǐng)一個(gè)錯(cuò)誤句柄OCIError
            swResult = 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   //句柄類(lèi)型
            )
             
            eg:
             OCIHandleFree(stmtp, OCI_HTYPE_STMT)
            3.讀取/設(shè)置句柄屬性
              sword OCIAttrSet(
            dvoid *trgthndlp,  //需設(shè)置的句柄名
            ub4  trghndltyp, //句柄類(lèi)型
            dvoid *attributep, //設(shè)置的屬性名
            ub4 size, //屬性值長(zhǎng)度
            ub4 attrtype,     //屬性類(lèi)型
            OCIError *errhp   //錯(cuò)誤句柄
            )
            注:一般要設(shè)置的屬性有:
              服務(wù)器實(shí)例:
            句柄類(lèi)型OCI_HTYPE_SVCCTX,屬性類(lèi)型OCI_ATTR_SERVER
                    連接數(shù)據(jù)的用戶(hù)名:
               句柄類(lèi)型OCI_HTYPE_SESSION,屬性類(lèi)型OCI_ATTR_USERNAME
            用戶(hù)密碼
                 句柄類(lèi)型OCI_HTYPE_SESSION,屬性類(lèi)型OCI_ATTR_PASSWORD
            事務(wù):  
               句柄類(lèi)型OCI_HTYPE_SVCCTX,屬性類(lèi)型OCI_ATTR_SESSION

            eg:設(shè)置用戶(hù)名和密碼
            char username[20],passwd[20];
              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_WITH_INFO)
            return FALSE;

            swResult = OCIAttrSet(usrhp, OCI_HTYPE_SESSION,    (text*) passwd, strlen(passwd), 
            OCI_ATTR_PASSWORD, errhp);
            if(swResult != OCI_SUCCESS && swResult != OCI_SUCCESS_WITH_INFO)
            return FALSE;

              
            sword OCIAttrGet(
            dvoid *trgthndlp,  //需讀取的句柄名
            ub4  trghndltyp, //句柄類(lèi)型
            dvoid *attributep, //讀取的屬性名
            ub4 *sizep, //屬性值長(zhǎng)度
            ub4 attrtype,     //屬性類(lèi)型
            OCIError *errhp   //錯(cuò)誤句柄
            )

            4.連接/斷開(kāi)服務(wù)器
               多用戶(hù)方式連接:
              sword  OCIServerAttach(
            OCIServer     *srvhp,//未初始化的服務(wù)器句柄
                                  OCIError      *errhp,
                                      CONST text    *dblink,//服務(wù)器SID
                                     sb4           dblink_len,
                                    ub4           mode //=OCI_DEFAULT,系統(tǒng)環(huán)境將設(shè)為阻塞方式
            );

               sword OCIServerDetach (
            OCIServer   *srvhp,
                             OCIError    *errhp,
                                     ub4         mode //OCI_DEFAULT
            ); 
            單用戶(hù)方式連接:
               sword OCILogon (
            OCIEnv          *envhp,
                                OCIError        *errhp,
                               OCISvcCtx       **svchp,
                              CONST text      *username,
                              ub4             uname_len,
                               CONST text      *password,
                               ub4             passwd_len,
                               CONST text      *dbname,
                               ub4             dbname_len 
            );

            sword OCILogoff ( 
            OCISvcCtx      *svchp
                              OCIError       *errhp 
            );

            5.開(kāi)始/結(jié)束一個(gè)會(huì)話(huà)
            先認(rèn)證用戶(hù)再建立一個(gè)會(huì)話(huà)連接
               sword OCISessionBegin ( 
            OCISvcCtx     *svchp,  //服務(wù)環(huán)境句柄
                                  OCIError      *errhp,
                              OCISession    *usrhp,   //用戶(hù)會(huì)話(huà)句柄
                                     ub4           credt,    //認(rèn)證類(lèi)型
                                     ub4           mode   //操作模式
            );

                      *認(rèn)證類(lèi)型:
            OCI_CRED_RDBMS:用數(shù)據(jù)庫(kù)用戶(hù)名和密碼進(jìn)行認(rèn)證,則先要設(shè)置OCI_ATTR_USERNAME和OCI_ATTR_PASSWORD屬性
            OCI_CRED_EXT:外部認(rèn)證,不需要設(shè)置用戶(hù)和密碼
            OCI_DEFAULT:用戶(hù)會(huì)話(huà)環(huán)境只能被指定的服務(wù)器環(huán)境句柄所設(shè)置
            OCI_SYSDBA:用戶(hù)要具有sysdba權(quán)限
            OCI_SYSOPER:用戶(hù)要具有sysoper權(quán)限


            Eg:
            swResult = OCISessionBegin(svchp, 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.讀取錯(cuò)誤信息
                sword OCIErrorGet (
            dvoid      *hndlp, //錯(cuò)誤句柄
                                 ub4        recordno,//從那里讀取錯(cuò)誤記錄,從1開(kāi)始
                                 text       *sqlstate,//已取消,=NULL
                                 sb4        *errcodep, //錯(cuò)誤號(hào)
                                 text       *bufp,  //錯(cuò)誤內(nèi)容
                                 ub4        bufsiz,  //bufp長(zhǎng)度
                                 ub4        type //傳遞的錯(cuò)誤句柄類(lèi)型
            =OCI_HTYPE_ERROR:錯(cuò)誤句柄
            =OCI_HTYPE_ENV:環(huán)境句柄
            );
            eg:
             ub4    ub4RecordNo = 1;
            OCIError* hError
            sb4    sb4ErrorCode;
            char   sErrorMsg[1024];

            if (OCIErrorGet(hError, ub4RecordNo++, NULL, &sb4ErrorCode, (OraText*) sErrorMsg, sizeof(sErrorMsg), OCI_HTYPE_ERROR) == OCI_SUCCESS)
                   printf(“error msg:%s\n”, sErrorMsg);


            7.準(zhǔn)備SQL語(yǔ)句
            sword OCIStmtPrepare ( 
            OCIStmt       *stmtp,//語(yǔ)句句柄  
                               OCIError      *errhp,
                                    CONST text    *stmt,  //SQL語(yǔ)句
                                    ub4           stmt_len,   //語(yǔ)句長(zhǎng)度
                                    ub4           language,  //語(yǔ)句的語(yǔ)法格式=OCI_NTV_SYNTAX
            ub4           mode //=OCI_DEFAULT
            );

            eg:
             char sSQL[1024];

            sprintf(sSQL, “select table_name from user_tables”);

            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() Bind by name  按名綁定
            OCIBindByPos() Bind by position  按位置綁定,建議一般按此方式綁定
            OCIBindDynamic() Sets additional attributes after bind with OCI_DATA_AT_EXEC mode  
            OCIBindObject() Set additional attributes for bind of named data type 

            注:
            OCIBindArrayOfStruct必須先用OCIBindByPos初始化,然后在OCIBindArrayOfStruct中定義每個(gè)參數(shù)所跳過(guò)的字節(jié)數(shù)。
            如:
             
            存儲(chǔ)方式:



            第一條記錄第二條記錄 N


              SkipPara(實(shí)際就是結(jié)構(gòu)體長(zhǎng)度,即本次所有列的長(zhǎng)度和)

             

            sword OCIBindByName ( 
            OCIStmt       *stmtp, //語(yǔ)句句柄
                             OCIBind       **bindpp,//結(jié)合句柄,=NULL
                             OCIError      *errhp,
                             CONST text    *placeholder,//占位符名稱(chēng)
                             sb4           placeh_len, //占位符長(zhǎng)度
                             dvoid         *valuep, //綁定的變量名
                             sb4           value_sz, //綁定的變量名長(zhǎng)度
                             ub2           dty,  //綁定的類(lèi)型
                             dvoid         *indp, //指示符變量指針(sb2類(lèi)型),單條綁定時(shí)為NULL,
                             ub2           *alenp, //說(shuō)明執(zhí)行前后被結(jié)合的數(shù)組變量中各元素?cái)?shù)據(jù)實(shí)際的長(zhǎng)度,單條綁定時(shí)為NULL
                             ub2           *rcodep,//列級(jí)返回碼數(shù)據(jù)指針,單條綁定時(shí)為NULL
                             ub4           maxarr_len, //最多的記錄數(shù),如果是單條綁定,則為0
                             ub4           *curelep, //實(shí)際的記錄數(shù),單條綁定則為NULL
                             ub4           mode //=OCI_DEFAULT
            ); 

            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 );

            sword OCIBindArrayOfStruct (
            OCIBind     *bindp,//綁定的結(jié)構(gòu)句柄,由OCIBindByPos定義
                             OCIError    *errhp,
                             ub4         pvskip, //下一列跳過(guò)的字節(jié)數(shù)**
                             ub4         indskip,//下一個(gè)指示器或數(shù)組跳過(guò)的字節(jié)數(shù) 
                             ub4         alskip, //下一個(gè)實(shí)際值跳過(guò)的字節(jié)數(shù)
                             ub4         rcskip //下一個(gè)列級(jí)返回值跳過(guò)的字節(jié)數(shù)
            );

            例:
            sword     swResult;
            OCIBind*  hBind;
            Ub4 rec_num;
            Sql:  insert into student 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=:p2

            hBind = NULL;
            swResult = OCIBindByPos(stmtp &hBind, errhp,1,tstd[0].tname, 
            sizeof(tstd[0].tname), SQLT_CHR, &tstdInd.sb2_usernmae[0], 
            &tstdLen.ub2_username[0],&tstdRet.ub2_username[0],100, &rec_num, OCI_DEFAULT);
            swResult = OCIBindArrayOfStruct(hBind, errhp,sizeof(tstd [0]), sizeof(sb2), sizeof(ub2), sizeof(ub2));

            9.執(zhí)行SQL語(yǔ)句
            sword OCIStmtExecute ( 
            OCISvcCtx           *svchp,  //服務(wù)環(huán)境句柄
                                    OCIStmt             *stmtp,  //語(yǔ)句句柄
                                    OCIError            *errhp,
                                    ub4                 iters, // **
                                    ub4                 rowoff, //**
                                    CONST OCISnapshot   *snap_in,
                                    OCISnapshot         *snap_out,
                                    ub4                 mode //**
            );
             **注:
            1. iters:對(duì)于select語(yǔ)句,它說(shuō)明一次執(zhí)行讀取到buffer中的記錄行數(shù),如果不能確定select語(yǔ)句所返回的行數(shù),可將iters設(shè)置為0,而對(duì)于其他的語(yǔ)句,iters表示這些語(yǔ)句的執(zhí)行次數(shù),此時(shí)iters不能為0。
            2. rowoff:在多行執(zhí)行時(shí),該參數(shù)表示從所結(jié)合的數(shù)據(jù)變量中的第幾條記錄開(kāi)始執(zhí)行(即記錄偏移量)。
            3. mode:=OCI_DEFAULT:default模式
            =OCI_DESCRIBE_ONLY:描述模式,只返回選擇列表的描述信息,而不執(zhí)行語(yǔ)句
            =OCI_COMMIT_ON_SUCCESS:自動(dòng)提交模式,當(dāng)執(zhí)行成功后,自動(dòng)提交。
            =OCI_EXACT_FETCH:精確提取模式。
            =OCI_BATCH_ERRORS:批錯(cuò)誤執(zhí)行模式:用于執(zhí)行數(shù)組方式的操作,在此模式下,批量insert ,update,delete時(shí),執(zhí)行過(guò)程中任何一條記錄錯(cuò)誤不會(huì)導(dǎo)致整個(gè)insert ,update,delete失敗,系統(tǒng)自動(dòng)會(huì)收集錯(cuò)誤信息,而在非批錯(cuò)誤方式下,其中的任何一條記錄錯(cuò)誤,將會(huì)導(dǎo)致整個(gè)操作失敗。
            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()   Define an output variable association  
            OCIDefineDynamic()   Sets additional attributes for define in OCI_DYNAMIC_FETCH mode  
            OCIDefineObject()   Set additional attributes for define of named data type  

            sword OCIDefineByPos ( 
            OCIStmt     *stmtp, //語(yǔ)句句柄 
                                   OCIDefine   **defnpp,//定義句柄—用于數(shù)組變量
                                   OCIError    *errhp,
                                   ub4         position,//位置序號(hào)(從1 開(kāi)始)
                                   dvoid       *valuep, //輸出的變量名
                                   sb4         value_sz, //變量長(zhǎng)度
                                   ub2         dty,  //數(shù)據(jù)類(lèi)型
                                   dvoid       *indp, //指示器變量/指示器變量數(shù)組,如果此字段可能存在空值,則要指示器變量,否則單條處理時(shí)為NULL
                                   ub2         *rlenp, //提取的數(shù)據(jù)長(zhǎng)度
                                   ub2         *rcodep, //列級(jí)返回碼數(shù)組指針
            ub4         mode //OCI_DEFAULT
            );




            sword OCIDefineArrayOfStruct ( 
            OCIDefine   *defnp,//由OCIDefineByPos定義的句柄
                             OCIError    *errhp,
            ub4         pvskip, //下一列跳過(guò)的字節(jié)數(shù),一般就是結(jié)構(gòu)的大小
                             ub4         indskip,//下一個(gè)指示器或結(jié)構(gòu)跳過(guò)的字節(jié)數(shù),=0 
                             ub4         rlskip, //下一個(gè)實(shí)際值跳過(guò)的字節(jié)數(shù),=0
                             ub4         rcskip //下一個(gè)列列級(jí)返回值跳過(guò)的字節(jié)數(shù),=0
            );

            sword OCIDefineDynamic ( 
            OCIDefine   *defnp,
                                     OCIError    *errhp,
                                     dvoid       *octxp, 
                                     OCICallbackDefine       (ocbfp)(/*_
                                              dvoid          *octxp,
                                              OCIDefine      *defnp,
                                              ub4            iter, 
                                              dvoid          **bufpp,
                                              ub4            **alenpp,
                                              ub1            *piecep,
                                              dvoid          **indpp,
                                              ub2            **rcodep _*/)  );

            sword OCIDefineObject ( OCIDefine       *defnp,
                                    OCIError        *errhp,
                                    CONST OCIType   *type,
                                    dvoid           **pgvpp, 
                                    ub4             *pvszsp, 
                                    dvoid           **indpp, 
                                    ub4             *indszp );

            eg:
            單條查詢(xún)
            sql: select username,age from student  where username=:p1;
             如果此字段有可能有空值,則
            hDefine = NULL;
            swResult = OCIDefineByPos(stmtp &hDefine, errhp, 1, tstd.username, sizeof(tstd.username), SQLT_CHR, & sb2aInd[0], NULL, NULL, OCI_DEFAULT);
            如果此字段沒(méi)有空值,則
            hDefine = NULL;
            swResult = OCIDefineByPos(stmtp &hDefine, errhp, 1, tstd.username, sizeof(tstd.username), SQLT_CHR, NULL, NULL, NULL, OCI_DEFAULT);

              批量查詢(xún)
            select username,age from student  where age>;30;
            hDefine = NULL;
            swResult = OCIDefineByPos(stmtp, &hDefine, errhp, 1, &tstd[0].username, 
            sizeof(tstd[0].usenmae), SQLT_CHR, NULL, NULL, NULL, OCI_DEFAULT);

            swResult = OCIDefineArrayOfStruct(hDefine, errhp, sizeof(tstd[0]), 0, 0, 0);
            11.提取結(jié)果
            sword OCIStmtFetch (
            OCIStmt     *stmtp,//語(yǔ)句句柄
                                 OCIError    *errhp, 
                                 ub4         nrows, //從當(dāng)前位置處開(kāi)始一次提取的記錄數(shù),對(duì)于數(shù)據(jù)變量,可以>;1,否則不能>;1
                                 ub2         orientation,//提取的方向:OCI_FETCH_NEXT
            ub4         mode //OCI_DEFAULT
               )

            eg
               while ((swResult=OCIStmtFetch stmtp errhp,1,OCI_FETCH_NEXT,OCI_DEFAULT)) != OCI_NO_DATA)
            {
            ……
            }

            12.事務(wù)操作
            開(kāi)始一個(gè)事務(wù)
            sword OCITransStart ( 
            OCISvcCtx    *svchp, 
                                  OCIError     *errhp, 
                                  uword        timeout, //** 
                                  ub4          flags );
            **注:
            1. Timeout:
            當(dāng)flag=OCI_TRANS_RESUME:它表示還有多少秒事務(wù)將被激活
            =OCI_TRANS_NEW: 事務(wù)響應(yīng)的超時(shí)時(shí)間(秒)
            2. Flags:指定一個(gè)新的事務(wù)還是已有事務(wù)
            =OCI_TRANS_NEW:定義一個(gè)新的事務(wù)
            =OCI_TRANS_RESUME

            準(zhǔn)備一個(gè)事務(wù):
            sword OCITransPrepare (
             OCISvcCtx    *svchp, 
                                    OCIError     *errhp,
                                    ub4          flags );//OCI_DEFAULT

            sword OCITransForget ( 
            OCISvcCtx     *svchp, 
                                   OCIError      *errhp,
                                   ub4           flags );//OCI_DEFAULT

            斷開(kāi)一個(gè)事務(wù):
            sword OCITransDetach ( 
            OCISvcCtx    *svchp,
                                   OCIError     *errhp,
            ub4          flags );//OCI_DEFAULT

              提交一個(gè)事務(wù):
             sword OCITransCommit (
            OCISvcCtx    *svchp,  //服務(wù)環(huán)境句柄
                                          OCIError     *errhp,
                                          ub4          flags ); //OCI_DEFAULT
            回滾一個(gè)事務(wù)
            sword OCITransRollback (
            dvoid        *svchp, 
                                          OCIError     *errhp,
                                          ub4          flags ); //OCI_DEFAULT


            四. OCI數(shù)據(jù)類(lèi)型與C語(yǔ)言數(shù)據(jù)類(lèi)型對(duì)照表
            表字段類(lèi)型      OCI類(lèi)型 C類(lèi)型 備注
            Number(N) SQLT_UIN  int 無(wú)符號(hào)整型
            Number(N) SQLT_INT  int 有符號(hào)整型
            Number(n,m) SQLT_FLT  float 符點(diǎn)數(shù)
            Varchar2(N) Sqlt_chr  Char 字符串
            Raw(N)   Sqlt_BIN 具體看不同的定義 二進(jìn)制類(lèi)型,多用于一個(gè)結(jié)構(gòu)字段
            DATE SQLT_DAT 無(wú) 最好轉(zhuǎn)換成字符串或數(shù)字

            posted on 2008-04-16 09:03 RedLight 閱讀(556) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): ORM關(guān)系對(duì)象數(shù)據(jù)庫(kù)架構(gòu)

            <2008年4月>
            303112345
            6789101112
            13141516171819
            20212223242526
            27282930123
            45678910

            導(dǎo)航

            統(tǒng)計(jì)

            公告


            Name: Galen
            QQ: 88104725

            常用鏈接

            留言簿(3)

            隨筆分類(lèi)

            隨筆檔案

            相冊(cè)

            My Friend

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久国产免费观看精品| 久久国产一区二区| 久久成人国产精品一区二区| 奇米影视7777久久精品| 久久天天婷婷五月俺也去| 久久av高潮av无码av喷吹| 亚洲乱亚洲乱淫久久| 国产精品禁18久久久夂久| 色综合久久久久综合体桃花网 | 伊人久久综合精品无码AV专区| 国产精品永久久久久久久久久| 国产精品久久99| 久久精品国产亚洲AV大全| 天天躁日日躁狠狠久久| 性做久久久久久久| 久久99国产综合精品| 久久国产乱子伦精品免费强| 伊人久久免费视频| 国产精品无码久久久久| 久久久久一级精品亚洲国产成人综合AV区 | 久久亚洲精品人成综合网| 久久久久久久精品妇女99| 久久久久亚洲AV无码观看| 热re99久久6国产精品免费| 99久久这里只有精品| 99久久精品免费看国产免费| 精品欧美一区二区三区久久久| 色综合合久久天天给综看| 亚洲午夜无码久久久久| 久久精品国产免费| 久久精品国产一区二区三区不卡| 中文成人无码精品久久久不卡| 亚洲va中文字幕无码久久 | 国产V亚洲V天堂无码久久久| 久久综合综合久久狠狠狠97色88 | 亚洲欧美久久久久9999| 亚洲综合伊人久久大杳蕉| 久久免费视频网站| 久久婷婷五月综合97色直播| 亚洲精品蜜桃久久久久久| 一本一道久久精品综合|