OCI是oracle提供的一组接口供开发者使用,以便开发oracle数据库的程序应用,就OCI的开发过程中自己的一点教训做一个总结:
一.首先从环境搭建说起
oracle数据库以Oracle10.2g为例:
oci开发环境的搭建,网上有很多,我也简单说一下我的环境搭建步骤:
输入地址:http://www.oracle.com/technetwork/topics/linuxsoft-082809.html
选择Version 10.2.0.4(对应oracle服务器版本是 10.2.0.1.0 )
下载oracle-instantclient-basic-10.2.0.4-1.i386.rpm
下载oracle-instantclient-devel-10.2.0.4-1.i386.rpm(sdk)
下载oracle-instantclient-sqlplus-10.2.0.4-1.rpm(sqlplus)
安装以上文件
安装时可以使用rpm -qlp查看程序安装的目标路径一边配置环境变量
进入到文件/usr/lib/oracle/10.2.0.4/client
创建目录network
进入network,创建目录admin
进入目录admin,创建文件tnsnames.ora,编辑tnsnames.ora内容:
trade =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.*.*)(PORT = 1521))
(CONNECT_DATA =
(SERVER=DEDICATED)
(SERVICE_NAME = trade)
)
)
保存退出。
进入到oracle用户
su - oracle
cd ~
配置环境变量
export ORACLE_HOME=/usr/lib/oracle/10.2.0.4/client
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export TNS_ADMIN=$ORACLE/network/admin
export PATH=$PATH:$ORACLE_HOME/bin
执行命令 source .bashrc
执行命令chmod -R a+rX $ORACLE_HOME
sqlplus trade/trade@trade
这样我们就可以在命令行下用pl/sql语言来操作数据库。
oci的开发环境基本上也就搭建好了。
二.OCI连接oracle的基本步骤:
oci的基本函数:
1。创建OCI环境:
sword OCIEnvCreate(OCIEnv** envhpp,ub4 mode,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);
2。申请/释放据并
sword OCIHandleAlloc(const dvoid *parenth,dvoid **hndlpp,ub4 type,size_t xtramem_sz,dvoid** usrmempp);
3.读取/设置句柄属性
sword OCIAttrSet(dvoid *trgthndlp,ub4 trghndltyp,dvoid *attributep,ub4 size,ub4 attrtype,OCIError* errhp);
4.连接/断开服务器:
多用户连接方式:
sword OCIServerAttach(OCIServer* srvhp,OCIError *errhp,const text *dblink,sb4 dblink_len,ub4 mode);
sword OCIServerDetach(OCISever* srvhp,OCIError *errhp,ub4 mode);
但用户方式连接
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,OCISession *usrhp,ub4 credt,ub4 mod);
5.开始/结束一个会话
sword OCISessionBegin(OCISvcCtx *svchp,OCIError *errhp,OCISession *usrhp,ub4 credt,ub4 mode);
sword OCISessionEnd(OCISvcCtx *svchp,OCIError *errhp,OCISession *usrhp,ub4 mode);
6.读取错误信息
sword OCIErrorGet(dvoid * hndlp,ub4 recordno,text* sqlstate,sb4 *errcodep,text* bufp,ub4 bufsiz,ub4 type);
7.准备SQL语句
sword OCIStmtPrepare(OCIStmt *stmtp,OCIError* errhp,const text* stmt,ub4 stmt_len,ub4 language,ub4 mode);
8.帮定输入参数
OCIBindArrayOfStruct();
OCIBindByName();
OCIBindByPos();
OCIBindByDynamic();
OCIBindObject();
9.执行SQL语句
sword OCIStmtExecute(OCISvcCtx *svchp,OCIStmt *stmthp,OCIError* errhp,ub4 iters,ub4 rowoff,const OCISnapshot *snap_out,ub4 mode);
10.定义输出变量
OCIDefineArrayOfStruct();
OCIDefineByPos();
OCIDefineDynamic();
OCIDefineObject();
11.提取结果
sword OCIStmtFetch(OCIStmt *stmthp,OCIError *errhp,ub4 nrows,ub2 orientation,ub4 mode)
12。事务操作
开始一个事务:
sword OCITransStart(OCISvcCtx* svchp,OCIError* errhp,uword timeout,ub4 flags);
准备一个事务:
sword OCITransPrepare(OCISvcCtx *svchp,OCIError *errhp,ub4 flags);
sword OCITransForget(OCISvcCtx *svchp,OCIError *errhp,ub4 flags);
断开一个事务:
sword OCITransDetach(OCISvcCtx *svchp,OCIError* errhp,ub4 flags);
提交一个事务:
sword OCITransCommit(OCISvcCtx* svchp,OCIError *errhp,ub4 flags);
回滚一个事务:
sword OCITransRollback(dvoid *svchp,OCIError *errhp, ub4 flags);
基本要用到的OCI函数就是这些。其他的是高级高能。我们可以用这些函数来进行基本的编程。