• <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>

            拂曉·明月·彎刀

            觀望,等待只能讓出現的機會白白溜走

              C++博客 :: 首頁 ::  :: 聯系 :: 聚合  :: 管理 ::

            一. Oracle oci工具包安裝: 
            $ORACLE_HOME\BIN:執行文件和help文件 
            $ORACLE_HOME\OCI\INCLUDE:頭文件 
            $ORACLE_HOME\OCI\LIB\BC:  for Borlanf C++的OCI庫 
            $ORACLE_HOME\OCI\LIB\MSVC:  for MS Visual C++的OCI庫

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

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

            8. 當應用進程與服務器斷開連接時,程序沒有使用OCITransCommit()進行事務的提交,則所有活動的事務會自動回滾。 
            9. OCI重定義數據類型 
                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語句準備后,可以用OCIAttrSet(0設置該語句的類型屬性OCI_ATTR_STMT_TYPE,以后可讀取語句屬性,根據屬性分別進行處理。 
            11. 批量綁定輸入和定義輸出參數:將數據存入一個靜態數據組中。一次執行可以提交或讀取多行記錄值。 
            12. 結合占位符和指示器變量: 
            占位符:在程序中,一些SQL語句需要在程序運行時才能確定它的語句數據,在設計時可用一個占位符來代替,當程序運行時,在它準備好語句后,必須為每個占位符指定一個變量,即將占位符與程序變量地址結合,執行時,Oracle就從這些變量中讀取數據,并將它們與SQL語句一起傳遞給Oracle服務器執行。OCI結合占位符時,它將占位符與程序變量關聯起來,并同時要指出程序變量的數據類型和數據長度。 
            如:select * from test where name=:p1 and age>:p2 
            :p1和:p2為占位符

            指示器變量:由于在Oracle中,列值可以為NULL,但在C語言中沒有NULL值,為了能使OCI程序表達NULL列值,OCI函數允許程序為所執行語句中的結合變量同時關聯一個指示符變量或指示符變量數組,以說明所結合的占位符是否為NULL或所讀取的列值是否為NULL,以及所讀取的列值是否被截取。 
            除SQLT_NTY(SQL Named DataType)外,指示符變量或指示符變量數組的數據類型為sb2,其值說明: 
            作為輸入變量時:(如insert ,update語句中) 
             =-1:OCI程序將NULL賦給Oracle表的列,忽略占位符結合的程序變量值 
            >=0:應用程序將程序變量值賦給指定列 
            作為輸出變量時:(如select語句中) 
            =-2:所讀取的列數據長度大于程序變量的長度,則被截取。 
            =-1:所讀取的值為NULL,輸出變量的值不會被改變。 
            =0:數據被完整讀入到指定的程序變量中 
            >0:所讀取的列數據長度大于程序變量的長度,則被截取,指示符變量值為所讀取數據被截取前的實際長度 
            三. OCI函數說明 
            注:紅色為輸入參數   藍色為輸出參數  ,否則為輸入/出參數

            示例以下面結構作為說明 
              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;  //指示器數組 
            typedef struct 
            { 
            ub2     ub2_tname[100]; 
                  ub2     ub2_age[100]; 
            } stdLen_T; //字段長度

            t_std tstd[100];  //數組變量,用于批量操作 
            stdInd_T tstdInd; 
            stdLen_T tstdLen; 
            stdLen_T tstdRet;

            t_std std;

            各函數數明 
            1.創建OCI環境 
            sword OCIEnvCreate(   
            OCIEnv **envhpp,  //OCI環境句柄指針 
            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一個函數就可以初始化環境了,相當于OCIInitialize+ OCIEnvInit

            2.申請/釋放句柄 
              sword OCIHandleAlloc( 
            CONST dvoid *parenth,  //新申請句柄的父句柄,一般為OCI環境句柄 
            Dvoid **hndlpp,   //申請的新句柄 
            Ub4 type, type,  //句柄類型 
            Size_t xtramem_sz,   //申請的內存數 
            Dvoid **usrmempp  //申請到的內存塊指針 
            ) 
            注: 
             一般需要申請的句柄有: 
                          服務器句柄OCIServer, 句柄類型OCI_HTYPE_SERVER 
            錯誤句柄OCIError,用于捕獲OCI錯誤信息, 句柄類型OCI_HTYPE_ERROR 
            事務句柄OCISession, 句柄類型OCI_HTYPE_SESSION 
            上下文句柄OCISvcCtx, 句柄類型OCI_HTYPE_SVCCTX 
            SQL語句句柄OCIStmt, 句柄類型OCI_HTYPE_STMT 
            eg: 申請一個錯誤句柄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   //句柄類型 
            )

            eg: 
            OCIHandleFree(stmtp, OCI_HTYPE_STMT) 
            3.讀取/設置句柄屬性 
             sword OCIAttrSet( 
            dvoid *trgthndlp,  //需設置的句柄名 
            ub4  trghndltyp, //句柄類型 
            dvoid *attributep, //設置的屬性名 
            ub4 size, //屬性值長度 
            ub4 attrtype,     //屬性類型 
            OCIError *errhp   //錯誤句柄 
            ) 
            注:一般要設置的屬性有: 
             服務器實例: 
            句柄類型OCI_HTYPE_SVCCTX,屬性類型OCI_ATTR_SERVER 
                   連接數據的用戶名: 
              句柄類型OCI_HTYPE_SESSION,屬性類型OCI_ATTR_USERNAME 
            用戶密碼 
                句柄類型OCI_HTYPE_SESSION,屬性類型OCI_ATTR_PASSWORD 
            事務:   
              句柄類型OCI_HTYPE_SVCCTX,屬性類型OCI_ATTR_SESSION

            eg:設置用戶名和密碼 
            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, //句柄類型 
            dvoid *attributep, //讀取的屬性名 
            ub4 *sizep, //屬性值長度 
            ub4 attrtype,     //屬性類型 
            OCIError *errhp   //錯誤句柄 
            )

            4.連接/斷開服務器 
              多用戶方式連接: 
            sword  OCIServerAttach( 
            OCIServer     *srvhp,//未初始化的服務器句柄 
                                OCIError      *errhp, 
                                  CONST text    *dblink,//服務器SID 
                                    sb4           dblink_len, 
                                   ub4           mode //=OCI_DEFAULT,系統環境將設為阻塞方式 
            );

              sword OCIServerDetach ( 
            OCIServer   *srvhp, 
                            OCIError    *errhp, 
                                    ub4         mode //OCI_DEFAULT 
            ); 
            單用戶方式連接: 
              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.開始/結束一個會話 
            先認證用戶再建立一個會話連接 
              sword OCISessionBegin ( 
            OCISvcCtx     *svchp,  //服務環境句柄 
                                OCIError      *errhp, 
                            OCISession    *usrhp,   //用戶會話句柄 
                                    ub4           credt,    //認證類型 
                                    ub4           mode   //操作模式 
            );

                     *認證類型: 
            OCI_CRED_RDBMS:用數據庫用戶名和密碼進行認證,則先要設置OCI_ATTR_USERNAME和OCI_ATTR_PASSWORD屬性 
            OCI_CRED_EXT:外部認證,不需要設置用戶和密碼 
            OCI_DEFAULT:用戶會話環境只能被指定的服務器環境句柄所設置 
            OCI_SYSDBA:用戶要具有sysdba權限 
            OCI_SYSOPER:用戶要具有sysoper權限


            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.讀取錯誤信息 
              sword OCIErrorGet ( 
            dvoid      *hndlp, //錯誤句柄 
                                ub4        recordno,//從那里讀取錯誤記錄,從1開始 
                                text       *sqlstate,//已取消,=NULL 
                                sb4        *errcodep, //錯誤號 
                                text       *bufp,  //錯誤內容 
                                ub4        bufsiz,  //bufp長度 
                                ub4        type //傳遞的錯誤句柄類型 
            =OCI_HTYPE_ERROR:錯誤句柄 
            =OCI_HTYPE_ENV:環境句柄 
            ); 
            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.準備SQL語句 
            sword OCIStmtPrepare ( 
            OCIStmt       *stmtp,//語句句柄   
                            OCIError      *errhp, 
                                  CONST text    *stmt,  //SQL語句 
                                  ub4           stmt_len,   //語句長度 
                                  ub4           language,  //語句的語法格式=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. 綁定輸入參數

            OCIBindArrayOfStruct() Set skip parameters for static array bind ,數組綁定,一般用于批量操作 
            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中定義每個參數所跳過的字節數。 
            如:

            存儲方式:

             

            第一條記錄第二條記錄 N


             SkipPara(實際就是結構體長度,即本次所有列的長度和)

             

            sword OCIBindByName ( 
            OCIStmt       *stmtp, //語句句柄 
                            OCIBind       **bindpp,//結合句柄,=NULL 
                            OCIError      *errhp, 
                            CONST text    *placeholder,//占位符名稱 
                            sb4           placeh_len, //占位符長度 
                            dvoid         *valuep, //綁定的變量名 
                            sb4           value_sz, //綁定的變量名長度 
                            ub2           dty,  //綁定的類型 
                            dvoid         *indp, //指示符變量指針(sb2類型),單條綁定時為NULL, 
                            ub2           *alenp, //說明執行前后被結合的數組變量中各元素數據實際的長度,單條綁定時為NULL 
                            ub2           *rcodep,//列級返回碼數據指針,單條綁定時為NULL 
                            ub4           maxarr_len, //最多的記錄數,如果是單條綁定,則為0 
                            ub4           *curelep, //實際的記錄數,單條綁定則為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,//綁定的結構句柄,由OCIBindByPos定義 
                            OCIError    *errhp, 
                            ub4         pvskip, //下一列跳過的字節數** 
                            ub4         indskip,//下一個指示器或數組跳過的字節數 
                            ub4         alskip, //下一個實際值跳過的字節數 
                            ub4         rcskip //下一個列級返回值跳過的字節數 
            );

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


            批量取數據,一次取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.執行SQL語句 
            sword OCIStmtExecute ( 
            OCISvcCtx           *svchp,  //服務環境句柄 
                                  OCIStmt             *stmtp,  //語句句柄 
                                  OCIError            *errhp, 
                                  ub4                 iters, // ** 
                                  ub4                 rowoff, //** 
                                  CONST OCISnapshot   *snap_in, 
                                  OCISnapshot         *snap_out, 
                                  ub4                 mode //** 
            ); 
            **注: 
            1. iters:對于select語句,它說明一次執行讀取到buffer中的記錄行數,如果不能確定select語句所返回的行數,可將iters設置為0,而對于其他的語句,iters表示這些語句的執行次數,此時iters不能為0。 
            2. rowoff:在多行執行時,該參數表示從所結合的數據變量中的第幾條記錄開始執行(即記錄偏移量)。 
            3. mode:=OCI_DEFAULT:default模式 
            =OCI_DESCRIBE_ONLY:描述模式,只返回選擇列表的描述信息,而不執行語句 
            =OCI_COMMIT_ON_SUCCESS:自動提交模式,當執行成功后,自動提交。 
            =OCI_EXACT_FETCH:精確提取模式。 
            =OCI_BATCH_ERRORS:批錯誤執行模式:用于執行數組方式的操作,在此模式下,批量insert ,update,delete時,執行過程中任何一條記錄錯誤不會導致整個insert ,update,delete失敗,系統自動會收集錯誤信息,而在非批錯誤方式下,其中的任何一條記錄錯誤,將會導致整個操作失敗。 
            Eg: 
            執行一次 
            swResult = OCIStmtExecute(svchp, stmtp,  errhp;, 
                                 1, 0, NULL, NULL, OCI_DEFAULT); 
            批量執行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, //語句句柄 
                                  OCIDefine   **defnpp,//定義句柄—用于數組變量 
                                  OCIError    *errhp, 
                                  ub4         position,//位置序號(從1 開始) 
                                  dvoid       *valuep, //輸出的變量名 
                                  sb4         value_sz, //變量長度 
                                  ub2         dty,  //數據類型 
                                  dvoid       *indp, //指示器變量/指示器變量數組,如果此字段可能存在空值,則要指示器變量,否則單條處理時為NULL 
                                  ub2         *rlenp, //提取的數據長度 
                                  ub2         *rcodep, //列級返回碼數組指針 
            ub4         mode //OCI_DEFAULT 
            );

             


            sword OCIDefineArrayOfStruct ( 
            OCIDefine   *defnp,//由OCIDefineByPos定義的句柄 
                            OCIError    *errhp, 
            ub4         pvskip, //下一列跳過的字節數,一般就是結構的大小 
                            ub4         indskip,//下一個指示器或結構跳過的字節數,=0 
                            ub4         rlskip, //下一個實際值跳過的字節數,=0 
                            ub4         rcskip //下一個列列級返回值跳過的字節數,=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:

            單條查詢 
            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); 
            如果此字段沒有空值,則 
            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; 
            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.提取結果 
            sword OCIStmtFetch ( 
            OCIStmt     *stmtp,//語句句柄 
                                OCIError    *errhp, 
                                ub4         nrows, //從當前位置處開始一次提取的記錄數,對于數據變量,可以>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.事務操作 
            開始一個事務 
            sword OCITransStart ( 
            OCISvcCtx    *svchp, 
                                 OCIError     *errhp, 
                                 uword        timeout, //** 
                                 ub4          flags ); 
            **注: 
            1. Timeout: 
            當flag=OCI_TRANS_RESUME:它表示還有多少秒事務將被激活 
            =OCI_TRANS_NEW: 事務響應的超時時間(秒) 
            2. Flags:指定一個新的事務還是已有事務 
            =OCI_TRANS_NEW:定義一個新的事務 
            =OCI_TRANS_RESUME

            準備一個事務: 
            sword OCITransPrepare ( 
            OCISvcCtx    *svchp, 
                                   OCIError     *errhp, 
                                   ub4          flags );//OCI_DEFAULT

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

            斷開一個事務: 
            sword OCITransDetach ( 
            OCISvcCtx    *svchp, 
                                  OCIError     *errhp, 
            ub4          flags );//OCI_DEFAULT

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


            四. OCI數據類型與C語言數據類型對照表 
            表字段類型      OCI類型 C類型 備注 
            Number(N) SQLT_UIN  int 無符號整型 
            Number(N) SQLT_INT  int 有符號整型 
            Number(n,m) SQLT_FLT  float 符點數 
            Varchar2(N) Sqlt_chr  Char 字符串 
            Raw(N)   Sqlt_BIN 具體看不同的定義 二進制類型,多用于一個結構字段 
            DATE SQLT_DAT 無 最好轉換成字符串或數字

            posted on 2011-03-23 00:09 一路風塵 閱讀(645) 評論(0)  編輯 收藏 引用 所屬分類: Oracle
            97久久精品国产精品青草| 蜜桃麻豆WWW久久囤产精品| 久久婷婷五月综合色奶水99啪| 人妻无码中文久久久久专区| 青青草原综合久久大伊人| 国产精品九九久久免费视频| 久久99精品久久久久久水蜜桃| 久久强奷乱码老熟女网站| 久久综合久久美利坚合众国| 久久久91人妻无码精品蜜桃HD| 久久精品桃花综合| 无码人妻久久一区二区三区免费| 精品永久久福利一区二区| 香港aa三级久久三级| 免费精品久久久久久中文字幕| 91麻豆精品国产91久久久久久| 狠狠色丁香久久综合五月| 久久久久久亚洲精品不卡| 久久精品一区二区影院| 久久成人小视频| 无码人妻久久一区二区三区免费丨 | 青草国产精品久久久久久| 久久久久久久久久久| 亚洲国产精品成人久久| 久久99精品国产一区二区三区| 国产精品伦理久久久久久| 亚州日韩精品专区久久久| 久久久女人与动物群交毛片| 人人狠狠综合久久亚洲高清| 热久久最新网站获取| 久久久久久国产精品无码超碰| 91精品国产91久久久久福利| 亚洲综合精品香蕉久久网97 | 2021国产精品久久精品| 99久久人妻无码精品系列蜜桃 | 日韩人妻无码精品久久久不卡| 粉嫩小泬无遮挡久久久久久| 久久精品国产精品亚洲人人 | 久久99国产综合精品免费| 久久93精品国产91久久综合| 精品国产乱码久久久久久呢|