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

OCI經(jīng)典參考文檔(轉(zhuǎn)載)

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

 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án)境屬性
OCI_ATTR_TRANS—設(shè)置/讀取服務(wù)環(huán)境的事務(wù)環(huán)境屬性
用戶會話句柄屬性:(OCI_HTYPE_SESSION)
OCI_ATTR_USERNAME—設(shè)置會話認證所使用的用戶名
OCI_ATTR_PASSWORD—設(shè)置會話認證所使用的用戶口令
服務(wù)器句柄:(OCI_HTYPE_SEVER)
OCI_ATTR_NOBLOCKING_MODE—設(shè)置/讀取服務(wù)器連接:=TRUE時服務(wù)器連接設(shè)置為非阻塞方式
語句句柄:(OCI_HTYPE_STMT)
OCI_ATTR_ROW_COUNT—只讀,為當(dāng)前已處理的行數(shù),其default=1
OCI_ATTR_STMT_TYPE—讀取當(dāng)前SQL語句的類型:
Eg : OCI_STMT_BEGIN
OCI_STMT_SELECT OCI_STMT_INSERT
OCI_STMT_UPDATE OCI_STMT_DELETE
OCI_ATTR_PARAM_COUNT—返回語句選擇列表中的列數(shù)
4. 關(guān)于輸出變量定義:如果在語句執(zhí)行前就知道select語句的選擇列表結(jié)構(gòu),則定義輸出操作可在調(diào)用 OCISTMTExecute前進行,如果查詢語句的參數(shù)為用戶動態(tài)輸入的,則必須在執(zhí)行后定義。
5. OCI函數(shù)返回值:
OCI_SUCCESS –函數(shù)執(zhí)行成功 (=0)
OCI_SUCCESS_WITH_INFO –執(zhí)行成功,但有診斷消息返回,可能是警告信息
OCI_NO_DATA—函數(shù)執(zhí)行完成,但沒有其他數(shù)據(jù)
OCI_ERROR—函數(shù)執(zhí)行錯誤
OCI_INVALID_HANDLE—傳遞給函數(shù)的參數(shù)為無效句柄,或傳回的句柄無效
OCI_NEED_DATA—需要應(yīng)用程序提供運行時刻的數(shù)據(jù)
OCI_CONTINUE—回調(diào)函數(shù)返回代碼,說明回調(diào)函數(shù)需要OCI庫恢復(fù)其正常的處理操作
OCI_STILL_EXECUTING—服務(wù)環(huán)境建立在非阻塞模式,OCI函數(shù)調(diào)用正在執(zhí)行中。
6. OCI連接有二種方式:Blocking(阻塞方式)和non_Blocking(非阻塞方式),阻塞方式就是當(dāng)調(diào)用 OCI操作時,必須等到此OCI操 作完成后服務(wù)器才返回客戶端相應(yīng)的信息,不管是成功還是失敗。非阻塞方式是當(dāng)客戶端提交OCI操作給服務(wù)器后,服務(wù)器立即返回 OCI_STILL_EXECUTING信息,而并不等待服務(wù)端的操作完成。


對于non-blocking方式,應(yīng)用程序若收到一個OCI函數(shù)的返回值為 OCI_STILL_EXECUTING時必須再次對每一個OCI函數(shù)的返回值進行判斷,判斷其成功與否。
可通過設(shè)置服務(wù)器屬性為OCI_ATTR_NONBLOCKING_MODE來實現(xiàn)。系統(tǒng)默認方式為阻塞模式.
7. OCI函數(shù)設(shè)置的模式有:
OCI_DEFUALT:使用OCI默認的環(huán)境
OCI_THREADED:線程環(huán)境下使用OCI
OCI_OBJECT:對象模式
OCI_SHARED:共享模式
OCI_EVENTS
OCI_NO_UCB
OCI_ENV_NO_MUTEX:非互斥訪問模式
其中模式可以用邏輯運算符進行迭加,將函數(shù)設(shè)置成多多種模式:如mode=OCI_SHREADED| OCI_OBJECT

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

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

示例以下面結(jié)構(gòu)作為說明
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; //字段長度

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一個函數(shù)就可以初始化環(huán)境了,相當(dāng)于OCIInitialize+ OCIEnvInit

2.申請/釋放句柄
sword OCIHandleAlloc(
CONST dvoid *parenth, //新申請句柄的父句柄,一般為OCI環(huán)境句柄
Dvoid **hndlpp, //申請的新句柄
Ub4 type, type, //句柄類型
Size_t xtramem_sz, //申請的內(nèi)存數(shù)
Dvoid **usrmempp //申請到的內(nèi)存塊指針
)
注:
一般需要申請的句柄有:
服務(wù)器句柄OCIServer, 句柄類型OCI_HTYPE_SERVER
錯誤句柄OCIError,用于捕獲OCI錯誤信息, 句柄類型OCI_HTYPE_ERROR
事務(wù)句柄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.讀取/設(shè)置句柄屬性
sword OCIAttrSet(
dvoid *trgthndlp, //需設(shè)置的句柄名
ub4 trghndltyp, //句柄類型
dvoid *attributep, //設(shè)置的屬性名
ub4 size, //屬性值長度
ub4 attrtype, //屬性類型
OCIError *errhp //錯誤句柄
)
注:一般要設(shè)置的屬性有:
服務(wù)器實例:
句柄類型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, //屬性值長度
ub4 attrtype, //屬性類型
OCIError *errhp //錯誤句柄
)

4.連接/斷開服務(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.開始/結(jié)束一個會話
先認證用戶再建立一個會話連接
sword OCISessionBegin (
OCISvcCtx *svchp, //服務(wù)環(huán)境句柄
OCIError *errhp,
OCISession *usrhp, //用戶會話句柄
ub4 credt, //認證類型
ub4 mode //操作模式
);

*認證類型:
OCI_CRED_RDBMS:用數(shù)據(jù)庫用戶名和密碼進行認證,則先要設(shè)置OCI_ATTR_USERNAME和OCI_ATTR_PASSWORD屬性
OCI_CRED_EXT:外部認證,不需要設(shè)置用戶和密碼
OCI_DEFAULT:用戶會話環(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.讀取錯誤信息
sword OCIErrorGet (
dvoid *hndlp, //錯誤句柄
ub4 recordno,//從那里讀取錯誤記錄,從1開始
text *sqlstate,//已取消,=NULL
sb4 *errcodep, //錯誤號
text *bufp, //錯誤內(nèi)容
ub4 bufsiz, //bufp長度
ub4 type //傳遞的錯誤句柄類型
=OCI_HTYPE_ERROR:錯誤句柄
=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語句
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. 綁定輸入?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中定義每個參數(shù)所跳過的字節(jié)數(shù)。
如:

存儲方式:



第一條記錄第二條記錄 N


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



sword OCIBindByName (
OCIStmt *stmtp, //語句句柄
OCIBind **bindpp,//結(jié)合句柄,=NULL
OCIError *errhp,
CONST text *placeholder,//占位符名稱
sb4 placeh_len, //占位符長度
dvoid *valuep, //綁定的變量名
sb4 value_sz, //綁定的變量名長度
ub2 dty, //綁定的類型
dvoid *indp, //指示符變量指針(sb2類型),單條綁定時為NULL,
ub2 *alenp, //說明執(zhí)行前后被結(jié)合的數(shù)組變量中各元素數(shù)據(jù)實際的長度,單條綁定時為NULL
ub2 *rcodep,//列級返回碼數(shù)據(jù)指針,單條綁定時為NULL
ub4 maxarr_len, //最多的記錄數(shù),如果是單條綁定,則為0
ub4 *curelep, //實際的記錄數(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, //下一列跳過的字節(jié)數(shù)**
ub4 indskip,//下一個指示器或數(shù)組跳過的字節(jié)數(shù)
ub4 alskip, //下一個實際值跳過的字節(jié)數(shù)
ub4 rcskip //下一個列級返回值跳過的字節(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語句
sword OCIStmtExecute (
OCISvcCtx *svchp, //服務(wù)環(huán)境句柄
OCIStmt *stmtp, //語句句柄
OCIError *errhp,
ub4 iters, // **
ub4 rowoff, //**
CONST OCISnapshot *snap_in,
OCISnapshot *snap_out,
ub4 mode //**
);
**注:
1. iters:對于select語句,它說明一次執(zhí)行讀取到buffer中的記錄行數(shù),如果不能確定select語句所返回的行數(shù),可將iters設(shè)置為0,而對于其他的語句,iters表示這些語句的執(zhí)行次數(shù),此時iters不能為0。
2. rowoff:在多行執(zhí)行時,該參數(shù)表示從所結(jié)合的數(shù)據(jù)變量中的第幾條記錄開始執(zhí)行(即記錄偏移量)。
3. mode:=OCI_DEFAULT:default模式
=OCI_DESCRIBE_ONLY:描述模式,只返回選擇列表的描述信息,而不執(zhí)行語句
=OCI_COMMIT_ON_SUCCESS:自動提交模式,當(dāng)執(zhí)行成功后,自動提交。
=OCI_EXACT_FETCH:精確提取模式。
=OCI_BATCH_ERRORS: 批錯誤執(zhí)行模式:用于執(zhí)行數(shù)組方式的操作,在此模式下,批量insert ,update,delete時,執(zhí)行過程中任何一條記錄錯誤不會導(dǎo)致整個 insert ,update,delete失敗,系統(tǒng)自動會收集錯誤信息,而在非批錯誤方式下,其中的任何一條記錄錯誤,將會導(dǎo)致整個操作失敗。
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, //語句句柄
OCIDefine **defnpp,//定義句柄—用于數(shù)組變量
OCIError *errhp,
ub4 position,//位置序號(從1 開始)
dvoid *valuep, //輸出的變量名
sb4 value_sz, //變量長度
ub2 dty, //數(shù)據(jù)類型
dvoid *indp, //指示器變量/指示器變量數(shù)組,如果此字段可能存在空值,則要指示器變量,否則單條處理時為NULL
ub2 *rlenp, //提取的數(shù)據(jù)長度
ub2 *rcodep, //列級返回碼數(shù)組指針
ub4 mode //OCI_DEFAULT
);




sword OCIDefineArrayOfStruct (
OCIDefine *defnp,//由OCIDefineByPos定義的句柄
OCIError *errhp,
ub4 pvskip, //下一列跳過的字節(jié)數(shù),一般就是結(jié)構(gòu)的大小
ub4 indskip,//下一個指示器或結(jié)構(gòu)跳過的字節(jié)數(shù),=0
ub4 rlskip, //下一個實際值跳過的字節(jié)數(shù),=0
ub4 rcskip //下一個列列級返回值跳過的字節(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);
如果此字段沒有空值,則
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,//語句句柄
OCIError *errhp,
ub4 nrows, //從當(dāng)前位置處開始一次提取的記錄數(shù),對于數(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ù)操作
開始一個事務(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)的超時時間(秒)
2. Flags:指定一個新的事務(wù)還是已有事務(wù)
=OCI_TRANS_NEW:定義一個新的事務(wù)
=OCI_TRANS_RESUME

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

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

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

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


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


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=582980

posted on 2007-07-06 15:44 王光平 閱讀(684) 評論(0)  編輯 收藏 引用 所屬分類: 編程技術(shù)

<2007年7月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

導(dǎo)航

統(tǒng)計

留言簿(4)

隨筆分類

隨筆檔案

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            蜜臀91精品一区二区三区| 亚洲色在线视频| 亚洲日本一区二区三区| 国产一区二区精品久久91| 国产精品尤物福利片在线观看| 亚洲毛片一区二区| 欧美护士18xxxxhd| 亚洲国产高清aⅴ视频| 亚洲欧美在线高清| 国产精品毛片a∨一区二区三区| 欧美在线一区二区三区| 久久黄色小说| 女人香蕉久久**毛片精品| 欧美成人自拍视频| 一本色道久久综合亚洲精品高清| 亚洲免费观看| 亚洲影视在线| 久久女同互慰一区二区三区| 免费在线一区二区| 欧美精品激情blacked18| 欧美日韩免费高清一区色橹橹| 国产精品高潮呻吟久久av无限| 国产午夜精品视频免费不卡69堂| 伊人狠狠色j香婷婷综合| 蜜臀av国产精品久久久久| 欧美精品一区二区久久婷婷| 欧美三级视频在线| 国内精品美女在线观看| 亚洲日本在线观看| 先锋影音久久久| 亚洲国产日韩欧美在线99 | 一区二区视频免费在线观看| 91久久国产综合久久| 亚洲欧美久久| 亚洲国产精品悠悠久久琪琪 | 久久久久**毛片大全| 欧美另类极品videosbest最新版本| 国产精品国产福利国产秒拍| 亚洲黄色片网站| 久久久女女女女999久久| 99在线精品视频| 欧美freesex8一10精品| 久久久久久久久一区二区| 欧美激情视频一区二区三区免费| 国产精品中文在线| 一区二区三区国产| 欧美成ee人免费视频| 亚洲无人区一区| 欧美国产日韩一区二区三区| 国产一区二区三区四区在线观看| 亚洲私人影吧| 亚洲国产综合视频在线观看| 久久五月婷婷丁香社区| 国产日产亚洲精品| 欧美一二三视频| 一区二区三欧美| 欧美三级乱人伦电影| 亚洲激情黄色| 欧美大片免费观看| 久久久久国产一区二区三区| 国产日本欧美在线观看| 欧美日韩直播| 欧美日韩91| 日韩一区二区精品| 欧美电影资源| 久久看片网站| 在线日韩欧美| 欧美激情一区在线| 欧美成人中文| 一区二区三区毛片| 亚洲视频日本| 国产精品ⅴa在线观看h| 亚洲欧美资源在线| 亚洲女女做受ⅹxx高潮| 国产一区二区观看| 蜜桃av久久久亚洲精品| 久久手机精品视频| 亚洲黄网站在线观看| 91久久精品国产91久久| 欧美日韩色婷婷| 亚洲主播在线播放| 久久成人免费日本黄色| 亚洲第一精品福利| 亚洲美女免费视频| 国产精品久久久久久超碰| 欧美一区二区三区在线视频 | 国产丝袜一区二区| 久久影院午夜片一区| 久久精品视频99| 国内精品伊人久久久久av影院| 久久久久久香蕉网| 免费观看一区| 一本色道综合亚洲| 亚洲女爱视频在线| 国产亚洲午夜| 久久夜精品va视频免费观看| 欧美中文字幕视频在线观看| 久久久久久久一区二区| 亚洲人成啪啪网站| av成人免费| 国产欧美日韩精品a在线观看| 久久精品伊人| 你懂的视频欧美| 欧美制服丝袜第一页| 久久精品免费看| 亚洲免费黄色| 亚洲欧美成人一区二区在线电影| 国产情侣一区| 欧美一级专区免费大片| 欧美成人免费全部| 欧美一级视频免费在线观看| 久久av红桃一区二区小说| 亚洲精选中文字幕| 亚洲在线一区二区三区| 黄色成人在线| 亚洲欧洲日本专区| 国产精品久久77777| 久久人人爽爽爽人久久久| 欧美激情1区2区| 性一交一乱一区二区洋洋av| 亚洲成色777777女色窝| 亚洲国产另类久久久精品极度| 免费在线成人| 欧美伊人久久大香线蕉综合69| 久久久久女教师免费一区| 亚洲精品久久久久久久久久久久久| 一区二区三区.www| 一区二区三区不卡视频在线观看| 国外成人免费视频| 亚洲社区在线观看| 国产欧美一区二区三区另类精品 | 亚洲在线视频观看| 亚洲美女黄网| 久久一区二区三区国产精品| 欧美在线视频导航| 久久精品一区二区国产| 亚洲午夜精品一区二区| 久久资源在线| 久热精品视频在线| 亚洲一区免费网站| 久久久久久久性| 久久精品一区四区| 欧美日韩视频在线第一区| 欧美韩日视频| 亚洲二区视频在线| 久久精品视频在线播放| 午夜久久美女| 国产精品视频xxx| 欧美在线高清| 久久久久久免费| 国产亚洲精品久久飘花| 香蕉成人久久| 久久国产精品久久国产精品| 国产精品免费在线| 欧美一级日韩一级| 国产精品永久入口久久久| 一区二区三区日韩精品视频| aa级大片欧美三级| 欧美日韩视频不卡| 美日韩在线观看| 亚洲美女精品久久| 欧美激情网友自拍| 亚洲黄网站黄| 日韩亚洲欧美一区二区三区| 欧美一区二区三区电影在线观看| 久久福利精品| 国产一区二区三区成人欧美日韩在线观看 | 亚洲高清久久| 亚洲三级影院| 欧美日韩一级黄| 亚洲一区视频在线观看视频| 亚洲中午字幕| 国产精品网曝门| 久久综合伊人77777尤物| 欧美成人蜜桃| 亚洲国产综合91精品麻豆| 亚洲精品1区| 欧美日韩一区二| 亚洲自拍偷拍麻豆| 欧美午夜精品久久久久久久| 日韩写真视频在线观看| 亚洲一区尤物| 亚洲第一黄色网| 亚洲欧美国产高清va在线播| 国产精品视频yy9099| 久久精品99无色码中文字幕| 欧美激情aaaa| 亚洲黄色av| 国产日韩一区二区| 久久综合九色九九| 一区二区三区黄色| 免费成人高清| 午夜在线a亚洲v天堂网2018| 国产精品99免费看| 欧美伦理91i| 久久久久国产一区二区| 一本大道久久a久久精二百| 久久久午夜视频| 亚洲影视在线| 亚洲图片在线观看|