OCI文檔

OCI(Oracle Call Interface)是運用ORACLE公司開發的一個應用程式開發工具,是一個通過訪問Oracle資料庫的伺服器,控制各類SQL語句的執行,進而創建應用程式的的應用程式接口(API)。

網上很少有oci的中文文檔,一般英文文檔大家可能看了也不太順,我整理了一份,寫了一些常用的OCI函式,供大家參考。
因為無法加附屬檔案,只好把內容貼上來了
一. Oracleoci工具包安裝:
$ORACLE_HOME\BIN:執行檔案和help檔案
$ORACLE_HOME\OCI\INCLUDE:頭檔案
$ORACLE_HOME\OCI\LIB\BC:forBorlanfC++的OCI庫
$ORACLE_HOME\OCI\LIB\MSVC:forMSVisualC++的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_SELECTOCI_STMT_INSERT
OCI_STMT_UPDATEOCI_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重定義數據類型
typedefunsignedcharub1;
typedefsignedcharsb1;
typedefunsignedshortub2;
typedefsignedshortsb2;
typedefunsignedintub4;
typedefsignedintsb4;
typedefub4duword;
typedefsb4dsword;
typedefdsworddword;
10. 在SQL語句準備後,可以用OCIAttrSet(0設定該語句的類型屬性OCI_ATTR_STMT_TYPE,以後可讀取語句屬性,根據屬性分別進行處理。
11. 批量綁定輸入和定義輸出參數:將數據存入一個靜態數據組中。一次執行可以提交或讀取多行記錄值。
12. 結合占位符和指示器變數:
占位符:在程式中,一些SQL語句需要在程式運行時才能確定它的語句數據,在設計時可用一個占位符來代替,當程式運行時,在它準備好語句後,必須為每個占位符指定一個變數,即將占位符與程式變數地址結合,執行時,Oracle就從這些變數中讀取數據,並將它們與SQL語句一起傳遞給Oracle伺服器執行。OCI結合占位符時,它將占位符與程式變數關聯起來,並同時要指出程式變數的數據類型和數據長度。
如:select*fromtestwherename=:p1andage>:p2
:p1和:p2為占位符
指示器變數:由於在Oracle中,列值可以為NULL,但在C語言中沒有NULL值,為了能使OCI程式表達NULL列值,OCI函式允許程式為所執行語句中的結合變數同時關聯一個指示符變數或指示符變數數組,以說明所結合的占位符是否為NULL或所讀取的列值是否為NULL,以及所讀取的列值是否被截取。
除SQLT_NTY(SQLNamedDataType)外,指示符變數或指示符變數數組的數據類型為sb2,其值說明:
作為輸入變數時:(如insert,update語句中)
 =-1:OCI程式將NULL賦給Oracle表的列,忽略占位符結合的程式變數值
>=0:應用程式將程式變數值賦給指定列
作為輸出變數時:(如select語句中)
=-2:所讀取的列數據長度大於程式變數的長度,則被截取。
=-1:所讀取的值為NULL,輸出變數的值不會被改變。
=0:數據被完整讀入到指定的程式變數中
>0:所讀取的列數據長度大於程式變數的長度,則被截取,指示符變數值為所讀取數據被截取前的實際長度
三. OCI函式說明
註:紅色為輸入參數藍色為輸出參數,否則為輸入/出參數
示例以下面結構作為說明
swordswResult;
OCIBind*hBind;
OCIDefine*hDefine;
OCIStmt*stmtp
OCIError*errhp;
OCIStmt*stmtp
OCISvcCtx*svchp
OCIEnv*envhpp;
OCISession*usrhp;
sb2 sb2aInd[30];//指示器變數,用於取可能存在空值的欄位
Typedefstrcut
{
chartname[40];
intage;
}t_std;
typedefstruct
{
sb2sb2_tname[100];
sb2sb2_age[100];
}stdInd_T;//指示器數組
typedefstruct
{
ub2ub2_tname[100];
ub2ub2_age[100];
}stdLen_T;//欄位長度
t_stdTSTD[100];//數組變數,用於批量操作
stdInd_TtstdInd;
stdLen_TtstdLen;
stdLen_TtstdRet;
t_stdstd;
各函式數明
1.創建OCI環境
swordOCIEnvCreate(
OCIEnv**envhpp,//OCI環境句柄指針
ub4mode,//初始化模式:OCI_DEFAULT/OCI_THREADED等
CONSTdvoid*ctxp,
CONSTdvoid*(*malicfp)(dvoid*ctxp,size_tsize),
CONSTdvoid*(ralocfp)(dvoid*ctxp,dvoid*memptr,size_tnewsize),
CONSTvoid*(*mfreefp)(dvoid*ctxp,dvoid*memptr),
Size_txstramemsz,
Dvoid**usrmempp
)
eg:
swResult=OCIEnvCreate(&envhpp,OCI_DEFAULT,NULL,NULL,NULL,NULL,0,NULL);
if(swResult!=OCI_SUCCESS&&swResult!=OCI_SUCCESS_WITH_INFO)
returnFALSE;
swordOCIInitialize(
ub4mode,
CONSTdvoid*ctxp,
CONSTdvoid*(*malocfp)(/*dvoid*ctxp,size_tsize_*/),
CONSTdvoid*(*ralocfp)(/*_dvoid*ctxp,dvoid*memptr,size_tnewsize_*/),
CONSTvoid(*mfreefp)(/*_dvoid*ctxp,dvoid*memptr_*/)
);
swordOCIEnvInit(
OCIEnv**envhpp,
ub4mode,
size_txtramemsz,
dvoid**usrmempp
);
註:
在8i以後,可用OCIEnvCreate一個函式就可以初始化環境了,相當於OCIInitialize+OCIEnvInit
2.申請/釋放句柄
swordOCIHandleAlloc(
CONSTdvoid*parenth,//新申請句柄的父句柄,一般為OCI環境句柄
Dvoid**hndlpp,//申請的新句柄
Ub4type,type,//句柄類型
Size_txtramem_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)
{
returnFALSE;
}
釋放句柄
swordOCIHandleFree(
dvoid*hndlp,//要釋放的句柄
ub4type//句柄類型
)
eg:
OCIHandleFree(stmtp,OCI_HTYPE_STMT)
3.讀取/設定句柄屬性
swordOCIAttrSet(
dvoid*trgthndlp,//需設定的句柄名
ub4trghndltyp, //句柄類型
dvoid*attributep,//設定的屬性名
ub4size, //屬性值長度
ub4attrtype,//屬性類型
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:設定用戶名和密碼
charusername[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)
returnFALSE;
swResult=OCIAttrSet(usrhp,OCI_HTYPE_SESSION,(text*)passwd,strlen(passwd),
OCI_ATTR_PASSWORD,errhp);
if(swResult!=OCI_SUCCESS&&swResult!=OCI_SUCCESS_WITH_INFO)
returnFALSE;
swordOCIAttrGet(
dvoid*trgthndlp,//需讀取的句柄名
ub4trghndltyp, //句柄類型
dvoid*attributep,//讀取的屬性名
ub4*sizep, //屬性值長度
ub4attrtype,//屬性類型
OCIError*errhp//錯誤句柄
)
4.連線/斷開伺服器
多用戶方式連線:
swordOCIServerAttach(
OCIServer*srvhp,//未初始化的伺服器句柄
OCIError*errhp,
CONSTtext*dblink,//伺服器SID
sb4dblink_len,
ub4mode//=OCI_DEFAULT,系統環境將設為阻塞方式
);
swordOCIServerDetach(
OCIServer*srvhp,
OCIError*errhp,
ub4mode//OCI_DEFAULT
);
單用戶方式連線:
swordOCILogon(
OCIEnv*envhp,
OCIError*errhp,
OCISvcCtx**svchp,
CONSTtext*username,
ub4uname_len,
CONSTtext*password,
ub4passwd_len,
CONSTtext*dbname,
ub4dbname_len
);
swordOCILogoff(
OCISvcCtx*svchp
OCIError*errhp
);
5.開始/結束一個會話
先認證用戶再建立一個會話連線
swordOCISessionBegin(
OCISvcCtx*svchp,//服務環境句柄
OCIError*errhp,
OCISession*usrhp,//用戶會話句柄
ub4credt,//認證類型
ub4mode//操作模式
);
*認證類型:
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)
returnFALSE;
swordOCISessionEnd(
OCISvcCtx*svchp,
OCIError*errhp,
OCISession*usrhp,
ub4mode);
6.讀取錯誤信息
swordOCIErrorGet(
dvoid*hndlp,//錯誤句柄
ub4recordno,//從那裡讀取錯誤記錄,從1開始
text*sqlstate,//已取消,=NULL
sb4*errcodep,//錯誤號
text*bufp,//錯誤內容
ub4bufsiz,//bufp長度
ub4type//傳遞的錯誤句柄類型
=OCI_HTYPE_ERROR:錯誤句柄
=OCI_HTYPE_ENV:環境句柄
);
eg:
ub4ub4RecordNo=1;
OCIError*herror
sb4sb4ErrorCode;
charsErrorMsg[1024];
if(OCIErrorGet(hError,ub4RecordNo++,NULL,&sb4ErrorCode,(OraText*)sErrorMsg,sizeof(sErrorMsg),OCI_HTYPE_ERROR)==OCI_SUCCESS)
printf(“errormsg:%s\n”,sErrorMsg);
7.準備SQL語句
swordOCIStmtPrepare(
OCIStmt*stmtp,//語句句柄
OCIError*errhp,
CONSTtext*stmt,//SQL語句
ub4stmt_len,//語句長度
ub4language,//語句的語法格式=OCI_NTV_SYNTAX
ub4mode//=OCI_DEFAULT
);
eg:
charsSQL[1024];
sprintf(sSQL,“selecttable_namefromuser_tables”);
swResult=OCIStmtPrepare(stmtperrhp,(CONSTOraText*)sSQL,strlen(sSQL),OCI_NTV_SYNTAX,OCI_DEFAULT);
if(swResult!=OCI_SUCCESS&&swResult!=OCI_SUCCESS_WITH_INFO)
returnFALSE;
8.綁定輸入參數
OCIBindArrayOfStruct() Setskipparametersforstaticarraybind,數組綁定,一般用於批量操作
OCIBindByName() Bindbyname按名綁定
OCIBindByPos() Bindbyposition按位置綁定,建議一般按此方式綁定
OCIBindDynamic() SetsadditionalattributesafterbindwithOCI_DATA_AT_EXECmode
OCIBindObject() Setadditionalattributesforbindofnameddatatype
註:
OCIBindArrayOfStruct必須先用OCIBindByPos初始化,然後在OCIBindArrayOfStruct中定義每個參數所跳過的位元組數。
如:
存儲方式:
第一條記錄第二條記錄 N
SkipPara(實際就是結構體長度,即本次所有列的長度和)
swordOCIBindByName(
OCIStmt*stmtp,//語句句柄
OCIBind**bindpp,//結合句柄,=NULL
OCIError*errhp,
CONSTtext*placeholder,//占位符名稱
sb4placeh_len,//占位符長度
dvoid*valuep,//綁定的變數名
sb4value_sz,//綁定的變數名長度
ub2dty,//綁定的類型
dvoid*indp,//指示符變數指針(sb2類型),單條綁定時為NULL,
ub2*alenp,//說明執行前後被結合的數組變數中各元素數據實際的長度,單條綁定時為NULL
ub2*rcodep,//列級返回碼數據指針,單條綁定時為NULL
ub4maxarr_len,//最多的記錄數,如果是單條綁定,則為0
ub4*curelep,//實際的記錄數,單條綁定則為NULL
ub4mode//=OCI_DEFAULT
);
swordOCIBindByPos(OCIStmt*stmtp,
OCIBind**bindpp,
OCIError*errhp,
ub4position,//綁定的位置
dvoid*valuep,
sb4value_sz,
ub2dty,
dvoid*indp,
ub2*alenp,
ub2*rcodep,
ub4maxarr_len,
ub4*curelep,
ub4mode);
swordOCIBindArrayOfStruct(
OCIBind*bindp,//綁定的結構句柄,由OCIBindByPos定義
OCIError*errhp,
ub4pvskip,//下一列跳過的位元組數**
ub4indskip,//下一個指示器或數組跳過的位元組數
ub4alskip,//下一個實際值跳過的位元組數
ub4rcskip//下一個列級返回值跳過的位元組數
);
例:
swordswResult;
OCIBind*hBind;
Ub4rec_num;
Sql:insertintostudentvalues(: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:selectusername,agefromstudentwhereusername=:p1andage=: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語句
swordOCIStmtExecute(
OCISvcCtx*svchp,//服務環境句柄
OCIStmt*stmtp,//語句句柄
OCIError*errhp,
ub4iters,//**
ub4rowoff,//**
CONSTOCISnapshot*snap_in,
OCISnapshot*snap_out,
ub4mode//**
);
**註:
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() Setadditionalattributesforstaticarraydefine
OCIDefineByPos() Defineanoutputvariableassociation
OCIDefineDynamic() SetsadditionalattributesfordefineinOCI_DYNAMIC_FETCHmode
OCIDefineObject() Setadditionalattributesfordefineofnameddatatype
swordOCIDefineByPos(
OCIStmt*stmtp,//語句句柄
OCIDefine**defnpp,//定義句柄—用於數組變數
OCIError*errhp,
ub4position,//位置序號(從1開始)
dvoid*valuep,//輸出的變數名
sb4value_sz,//變數長度
ub2dty,//數據類型
dvoid*indp,//指示器變數/指示器變數數組,如果此欄位可能存在空值,則要指示器變數,否則單條處理時為NULL
ub2*rlenp,//提取的數據長度
ub2*rcodep,//列級返回碼數組指針
ub4mode//OCI_DEFAULT
);
swordOCIDefineArrayOfStruct(
OCIDefine*defnp,//由OCIDefineByPos定義的句柄
OCIError*errhp,
ub4pvskip,//下一列跳過的位元組數,一般就是結構的大小
ub4indskip,//下一個指示器或結構跳過的位元組數,=0
ub4rlskip,//下一個實際值跳過的位元組數,=0
ub4rcskip//下一個列列級返回值跳過的位元組數,=0
);
swordOCIDefineDynamic(
OCIDefine*defnp,
OCIError*errhp,
dvoid*octxp,
OCICallbackDefine(ocbfp)(/*_
dvoid*octxp,
OCIDefine*defnp,
ub4iter,
dvoid**bufpp,
ub4**alenpp,
ub1*piecep,
dvoid**indpp,
ub2**rcodep_*/));
swordOCIDefineObject(OCIDefine*defnp,
OCIError*errhp,
CONSTOCIType*type,
dvoid**pgvpp,
ub4*pvszsp,
dvoid**indpp,
ub4*indszp);
eg:
單條查詢
sql:selectusername,agefromstudentwhereusername=: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);
批量查詢
selectusername,agefromstudentwhereage>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.提取結果
swordOCIStmtFetch(
OCIStmt*stmtp,//語句句柄
OCIError*errhp,
ub4nrows,//從當前位置處開始一次提取的記錄數,對於數據變數,可以>1,否則不能>1
ub2orientation,//提取的方向:OCI_FETCH_NEXT
ub4mode//OCI_DEFAULT
)
eg
while((swResult=OCIStmtFetchstmtperrhp,1,OCI_FETCH_NEXT,OCI_DEFAULT))!=OCI_NO_DATA)
{
……
}
12.事務操作
開始一個事務
swordOCITransStart(
OCISvcCtx*svchp,
OCIError*errhp,
uwordtimeout,//**
ub4flags);
**註:
1. Timeout:
當flag=OCI_TRANS_RESUME:它表示還有多少秒事務將被激活
=OCI_TRANS_NEW:事務回響的逾時時間(秒)
2. Flags:指定一個新的事務還是已有事務
=OCI_TRANS_NEW:定義一個新的事務
=OCI_TRANS_RESUME
準備一個事務:
swordOCITransPrepare(
OCISvcCtx*svchp,
OCIError*errhp,
ub4flags);//OCI_DEFAULT
swordOCITransForget(
OCISvcCtx*svchp,
OCIError*errhp,
ub4flags);//OCI_DEFAULT
斷開一個事務:
swordOCITransDetach(
OCISvcCtx*svchp,
OCIError*errhp,
ub4flags);//OCI_DEFAULT
提交一個事務:
swordOCITransCommit(
OCISvcCtx*svchp,//服務環境句柄
OCIError*errhp,
ub4flags);//OCI_DEFAULT
回滾一個事務
swordOCITransRollback(
dvoid*svchp,
OCIError*errhp,
ub4flags);//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_chrChar 字元串
Raw(N) Sqlt_BIN 具體看不同的定義 二進制類型,多用於一個結構欄位
DATE SQLT_DAT 無 最好轉換成字元串或數字

相關詞條

相關搜尋

熱門詞條

聯絡我們