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

拂曉·明月·彎刀

觀望,等待只能讓出現(xiàn)的機(jī)會(huì)白白溜走

  C++博客 :: 首頁(yè) ::  :: 聯(lián)系 :: 聚合  :: 管理 ::

一. 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)的句柄類型: 
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ù)器、用戶會(huì)話和事務(wù)三種句柄。 
服務(wù)器句柄:OCI_HTYPE_SERVER—標(biāo)識(shí)數(shù)據(jù)源,它轉(zhuǎn)換為與服務(wù)器的物理連接。 
用戶會(huì)話句柄:OCI_HTYPE_SESSION—定義用戶角色和權(quán)限及OCI調(diào)用的執(zhí)行環(huán)境。 
事務(wù)句柄:OCI_HTYPE_TRANS—定義執(zhí)行SQL操作的事務(wù)環(huán)境,事務(wù)環(huán)境中包含用戶的會(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)生成。用戶不需要自己再申請(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ì)話認(rèn)證環(huán)境屬性 
              OCI_ATTR_TRANS—設(shè)置/讀取服務(wù)環(huán)境的事務(wù)環(huán)境屬性 
用戶會(huì)話句柄屬性:(OCI_HTYPE_SESSION) 
OCI_ATTR_USERNAME—設(shè)置會(huì)話認(rèn)證所使用的用戶名 
 OCI_ATTR_PASSWORD—設(shè)置會(huì)話認(rèn)證所使用的用戶口令 
服務(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ǔ)句的類型: 
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)行,如果查詢語(yǔ)句的參數(shù)為用戶動(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ù)器才返回客戶端相應(yīng)的信息,不管是成功還是失敗。非阻塞方式是當(dāng)客戶端提交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:線程環(huán)境下使用OCI 
 OCI_OBJECT:對(duì)象模式 
 OCI_SHARED:共享模式 
 OCI_EVENTS 
 OCI_NO_UCB 
 OCI_ENV_NO_MUTEX:非互斥訪問(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ù)類型 
    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ǔ)句的類型屬性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ù)類型和數(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ù)類型為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,  //句柄類型 
Size_t xtramem_sz,   //申請(qǐng)的內(nèi)存數(shù) 
Dvoid **usrmempp  //申請(qǐng)到的內(nèi)存塊指針 
) 
注: 
 一般需要申請(qǐng)的句柄有: 
              服務(wù)器句柄OCIServer, 句柄類型OCI_HTYPE_SERVER 
錯(cuò)誤句柄OCIError,用于捕獲OCI錯(cuò)誤信息, 句柄類型OCI_HTYPE_ERROR 
事務(wù)句柄OCISession, 句柄類型OCI_HTYPE_SESSION 
上下文句柄OCISvcCtx, 句柄類型OCI_HTYPE_SVCCTX 
SQL語(yǔ)句句柄OCIStmt, 句柄類型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   //句柄類型 
)

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

eg:設(shè)置用戶名和密碼 
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, //屬性值長(zhǎng)度 
ub4 attrtype,     //屬性類型 
OCIError *errhp   //錯(cuò)誤句柄 
)

4.連接/斷開(kāi)服務(wù)器 
  多用戶方式連接: 
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 
); 
單用戶方式連接: 
  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ì)話 
先認(rèn)證用戶再建立一個(gè)會(huì)話連接 
  sword OCISessionBegin ( 
OCISvcCtx     *svchp,  //服務(wù)環(huán)境句柄 
                    OCIError      *errhp, 
                OCISession    *usrhp,   //用戶會(huì)話句柄 
                        ub4           credt,    //認(rèn)證類型 
                        ub4           mode   //操作模式 
);

         *認(rèn)證類型: 
OCI_CRED_RDBMS:用數(shù)據(jù)庫(kù)用戶名和密碼進(jìn)行認(rèn)證,則先要設(shè)置OCI_ATTR_USERNAME和OCI_ATTR_PASSWORD屬性 
OCI_CRED_EXT:外部認(rèn)證,不需要設(shè)置用戶和密碼 
OCI_DEFAULT:用戶會(huì)話環(huán)境只能被指定的服務(wù)器環(huán)境句柄所設(shè)置 
OCI_SYSDBA:用戶要具有sysdba權(quán)限 
OCI_SYSOPER:用戶要具有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ò)誤句柄類型 
=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,//占位符名稱 
                sb4           placeh_len, //占位符長(zhǎng)度 
                dvoid         *valuep, //綁定的變量名 
                sb4           value_sz, //綁定的變量名長(zhǎng)度 
                ub2           dty,  //綁定的類型 
                dvoid         *indp, //指示符變量指針(sb2類型),單條綁定時(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ù)類型 
                      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:

單條查詢 
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);

 批量查詢 
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ù)類型與C語(yǔ)言數(shù)據(jù)類型對(duì)照表 
表字段類型      OCI類型 C類型 備注 
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)制類型,多用于一個(gè)結(jié)構(gòu)字段 
DATE SQLT_DAT 無(wú) 最好轉(zhuǎn)換成字符串或數(shù)字

posted on 2011-03-23 00:09 一路風(fēng)塵 閱讀(681) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Oracle
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美福利视频在线| 亚洲每日更新| 亚洲一线二线三线久久久| 先锋亚洲精品| 欧美高清成人| 日韩亚洲视频在线| 亚洲精品视频在线看| 羞羞漫画18久久大片| 久久久久女教师免费一区| 国产一区二区三区网站| 午夜精品视频在线观看| 一本不卡影院| 欧美午夜宅男影院| 亚洲电影专区| 欧美成人综合网站| 91久久国产综合久久91精品网站 | 欧美午夜精品理论片a级大开眼界| 欧美日韩一二区| 国产夜色精品一区二区av| 黄色av一区| 亚洲另类黄色| 久久精品国产77777蜜臀| 欧美+亚洲+精品+三区| 亚洲伦理在线| 久久久天天操| 欧美三区在线视频| 国产亚洲人成网站在线观看| 亚洲福利在线观看| 亚洲欧美综合精品久久成人| 美日韩精品视频| 亚洲香蕉成视频在线观看| 久久久久国产精品www| 欧美精品福利| 欧美日韩亚洲综合| 国内久久精品| 亚洲夜间福利| 亚洲国产精品一区二区第四页av | 国产精品区二区三区日本| 激情亚洲网站| 亚洲一区国产视频| 欧美va亚洲va日韩∨a综合色| 亚洲一区在线免费| 西瓜成人精品人成网站| 久久精品首页| 国产精品超碰97尤物18| 亚洲国产精品黑人久久久 | 欧美亚洲一区二区在线观看| 欧美激情亚洲视频| 午夜精品成人在线| 国产精品av久久久久久麻豆网| 一区二区三区在线免费视频| 亚洲欧美自拍偷拍| 国产精品99久久久久久久久| 欧美成人一品| 亚洲国产精品一区在线观看不卡| 久久精品国产免费| 亚洲一二三区在线观看| 欧美视频精品一区| 亚洲欧洲三级| 免费毛片一区二区三区久久久| 亚洲综合导航| 91久久精品国产91性色tv| 亚洲激情二区| 欧美紧缚bdsm在线视频| 激情视频一区| 日韩视频不卡| 午夜一区在线| 欧美一区二区性| 亚洲欧美日韩精品久久| 国产精品二区三区四区| 久久精品视频99| 亚洲开发第一视频在线播放| 久久综合99re88久久爱| 国内外成人免费激情在线视频| 亚洲激情综合| 亚洲性av在线| 久久www成人_看片免费不卡 | 亚洲高清电影| 久久精品主播| 亚洲永久免费| 欧美午夜在线一二页| 一区二区国产日产| 欧美一级大片在线观看| 国产午夜亚洲精品羞羞网站| 亚洲欧美激情视频在线观看一区二区三区| 99国产麻豆精品| 国产精品你懂的在线| 91久久精品日日躁夜夜躁欧美| 黄色成人免费观看| 欧美午夜视频在线观看| 欧美黑人国产人伦爽爽爽| 免费成人黄色av| 欧美夜福利tv在线| 香港成人在线视频| 极品中文字幕一区| 欧美ed2k| 日韩天堂在线视频| 亚洲丝袜av一区| 欧美激情小视频| 在线综合亚洲| 亚洲人成网站色ww在线| 欧美精品v国产精品v日韩精品| 一区二区三区黄色| 午夜精品久久久久| 亚洲第一页自拍| 日韩视频在线一区二区| 国产日韩欧美三级| 亚洲国产高清视频| 国产精品尤物| 最新国产の精品合集bt伙计| 国产欧美视频一区二区| 亚洲国产精品久久久久婷婷老年| 国产精品区一区二区三区| 女同一区二区| 国产日韩欧美在线| 亚洲激情另类| 韩日精品中文字幕| 亚洲视频综合| 欧美精彩视频一区二区三区| 欧美三级特黄| 亚洲欧洲日本国产| 在线一区二区三区四区五区| 国产亚洲欧美激情| 亚洲美女在线看| 禁久久精品乱码| 亚洲一区网站| 亚洲小说春色综合另类电影| 久久网站免费| 久久久国产午夜精品| 欧美日韩国产成人| 欧美jjzz| 伊人久久亚洲影院| 性欧美18~19sex高清播放| 亚洲综合欧美日韩| 欧美日韩一区三区四区| 亚洲精品欧美| 国产精品v日韩精品| 亚洲国产乱码最新视频| 亚洲激情啪啪| 久久综合给合久久狠狠色| 久久久久.com| 一区二区三区自拍| 久久久女女女女999久久| 激情视频一区二区| 久久久美女艺术照精彩视频福利播放| 久久久精品国产一区二区三区| 狠狠做深爱婷婷久久综合一区| 欧美在线黄色| 久久久久久国产精品mv| 国产视频一区欧美| 久久大综合网| 亚洲成人资源网| 99ri日韩精品视频| 欧美日韩福利视频| 99re热这里只有精品免费视频| 一本一本大道香蕉久在线精品| 欧美高清成人| 亚洲一区二区三区四区视频| 欧美一区影院| 国内精品嫩模av私拍在线观看| 久久久久**毛片大全| 欧美成人免费小视频| 日韩小视频在线观看专区| 欧美激情久久久久| 在线综合视频| 久久综合狠狠综合久久综青草| 最新成人av网站| 国产精品毛片一区二区三区| 小黄鸭精品aⅴ导航网站入口| 嫩草伊人久久精品少妇av杨幂| 99国内精品久久久久久久软件| 欧美性色综合| 性欧美暴力猛交69hd| 老司机精品久久| 日韩天堂在线观看| 欧美午夜剧场| 亚洲在线电影| 欧美激情久久久久久| 亚洲精品视频在线观看网站| 亚洲一区二区三区影院| 美女爽到呻吟久久久久| 国产精品yjizz| 亚洲一区二区三区涩| 欧美成人精品影院| 亚洲日本无吗高清不卡| 欧美日韩伦理在线免费| 亚洲免费综合| 欧美成人免费大片| 亚洲欧美日韩视频二区| 亚洲私人影吧| 一区二区毛片| 国产情侣久久| 亚洲午夜激情| 亚洲精选一区| 欧美一区激情视频在线观看| 亚洲精品视频啊美女在线直播| 国产精品网站在线观看| 欧美日韩免费观看一区二区三区| 午夜欧美理论片| 亚洲精品久久久久中文字幕欢迎你 |