青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

整理的OCI文檔(轉載)


網上很少有OCI的中文文檔,一般英文文檔大家可能看了也不太順,我整理了一份,寫了一些常用的OCI函數,供大家參考。
因為無法加附件,只好把內容貼上來了
一. 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 2008-04-16 09:03 RedLight 閱讀(574) 評論(0)  編輯 收藏 引用 所屬分類: ORM關系對象數據庫架構


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


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

導航

統計

公告


Name: Galen
QQ: 88104725

常用鏈接

留言簿(3)

隨筆分類

隨筆檔案

相冊

My Friend

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美日本在线视频| 国产精品国产三级国产普通话三级 | 久久黄色影院| 亚洲三级免费电影| 久久网站热最新地址| 国产一区二区三区在线观看视频 | 欧美一区二区三区视频免费| 99re这里只有精品6| 欧美高清视频在线| 亚洲精品久久久久久久久久久| 久久综合综合久久综合| 欧美一区二区在线看| 国产一区二区欧美| 久久久精品午夜少妇| 久久成人精品电影| 国模私拍视频一区| 久久综合网hezyo| 久久久精品动漫| 亚洲国产精品专区久久 | 欧美另类视频| 亚洲一区二区黄色| 亚洲网站视频福利| 欧美成人在线免费视频| 久久天天躁狠狠躁夜夜av| 久久av一区二区三区漫画| 国产婷婷97碰碰久久人人蜜臀| 欧美一区国产在线| 久久精品视频在线看| 亚洲国产欧美日韩精品| 亚洲精品美女免费| 国产精品无码专区在线观看| 久久午夜精品| 欧美gay视频激情| 亚洲一区bb| 久久www成人_看片免费不卡| 亚洲第一级黄色片| 日韩网站在线观看| 国内精品久久久久久影视8| 欧美电影在线观看完整版| 欧美区日韩区| 久久九九免费| 欧美日本高清视频| 欧美一区=区| 欧美xx视频| 亚洲欧美国产77777| 久久视频在线免费观看| 亚洲午夜激情免费视频| 久久久www成人免费毛片麻豆 | 一区二区三区波多野结衣在线观看| 国产日韩精品一区观看| 亚洲激情电影在线| 国产婷婷97碰碰久久人人蜜臀| 亚洲黄色影院| 韩国v欧美v日本v亚洲v| 一区二区高清| 亚洲经典三级| 欧美亚洲日本网站| 亚洲视频一二| 欧美va天堂在线| 久久三级视频| 国产精品一区久久久久| 亚洲人成人99网站| 激情综合久久| 亚洲欧美资源在线| 亚洲视频导航| 欧美电影免费观看高清| 久久久天天操| 国产精品一二三四| 日韩视频一区二区三区在线播放免费观看| 狠狠噜噜久久| 午夜精品免费| 午夜视频一区二区| 欧美日韩一区二区三区在线看| 欧美jizzhd精品欧美巨大免费| 国产欧美精品日韩精品| 亚洲网站在线| 亚洲欧美国产不卡| 欧美午夜激情小视频| 亚洲精品乱码| 亚洲精品国产品国语在线app| 久久五月婷婷丁香社区| 免费不卡亚洲欧美| 精品96久久久久久中文字幕无| 午夜亚洲一区| 久久成人人人人精品欧| 国产日韩欧美麻豆| 香蕉乱码成人久久天堂爱免费 | 亚洲高清毛片| 欧美亚洲视频一区二区| 亚洲欧美中文另类| 国产精品第13页| 这里是久久伊人| 亚洲自拍偷拍视频| 国产精品高潮呻吟视频| 亚洲永久字幕| 欧美一区高清| 好吊妞这里只有精品| 久久久久免费| 亚洲高清在线观看一区| av成人免费观看| 欧美三级欧美一级| 亚洲欧美精品在线| 老司机精品导航| 亚洲高清视频在线| 欧美国产亚洲视频| 日韩一级大片| 欧美一级在线视频| 国内成+人亚洲+欧美+综合在线| 久久久久网站| 亚洲人成人99网站| 亚洲欧美在线一区二区| 国产亚洲精品v| 老司机免费视频一区二区| 亚洲人精品午夜| 亚洲欧美视频| 伊人婷婷欧美激情| 欧美日韩91| 亚洲欧美另类国产| 欧美福利视频网站| 亚洲特级毛片| 好吊色欧美一区二区三区视频| 美女主播一区| 一区二区三区四区蜜桃| 久久综合色综合88| 中文亚洲字幕| 狠狠久久亚洲欧美专区| 欧美理论大片| 欧美中文字幕不卡| 99成人精品| 欧美成在线视频| 欧美一级淫片播放口| 亚洲精品欧美精品| 国产小视频国产精品| 欧美日韩国产成人在线91| 久久精品成人一区二区三区 | 欧美日韩成人精品| 性欧美超级视频| 日韩一区二区电影网| 麻豆av一区二区三区久久| 亚洲午夜黄色| 欧美精品一区二区三区高清aⅴ| 亚洲综合丁香| 亚洲国产日韩精品| 久久久噜久噜久久综合| 亚洲午夜精品福利| 亚洲经典在线看| 国产日韩欧美一区二区| 欧美日韩人人澡狠狠躁视频| 另类图片综合电影| 欧美在线影院在线视频| 亚洲午夜精品17c| 亚洲黄一区二区| 欧美国产视频日韩| 久久久综合精品| 午夜视频在线观看一区二区三区 | 一区久久精品| 欧美亚一区二区| 欧美国产激情二区三区| 亚洲国产美女| 女女同性精品视频| 久久精品夜色噜噜亚洲a∨| 亚洲天堂成人在线观看| 99精品国产在热久久婷婷| 亚洲黄色尤物视频| 亚洲国产精品一区制服丝袜| 影音先锋中文字幕一区| 精品51国产黑色丝袜高跟鞋| 国产精品男gay被猛男狂揉视频| 欧美另类videos死尸| 欧美国产日韩在线观看| 欧美激情区在线播放| 欧美第一黄网免费网站| 欧美极品一区| 欧美日韩a区| 国产精品v欧美精品∨日韩| 欧美日韩一区二区三区在线| 欧美日韩综合视频网址| 欧美日韩亚洲一区二区三区在线| 欧美剧在线免费观看网站| 欧美精品久久久久久久免费观看| 欧美国产91| 欧美三级网址| 国产精品久久久久av免费| 国产老女人精品毛片久久| 国产偷自视频区视频一区二区| 国产亚洲一区二区在线观看| 狠狠色综合日日| 91久久极品少妇xxxxⅹ软件| 亚洲日本va午夜在线影院| 日韩视频在线观看国产| 在线一区二区日韩| 午夜精品国产更新| 亚洲成色www久久网站| 亚洲国产高清在线| 一本久久a久久精品亚洲| 亚洲视频一区二区| 久久精品视频网| 亚洲电影免费观看高清完整版在线观看 | 午夜在线视频观看日韩17c| 欧美与黑人午夜性猛交久久久|