一. 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 無 最好轉換成字符串或數字