c语言调用OCI接口连接oracle
(1)OCI接口是什么?
OCI是Oracle公司提供的由头文件和库函数等组成的一个访问Oracle数据库的应用程序编程接口,,允许开发人员在第三代编程语言(包括C, C++, COBOL 与 FORTRAN)中通过SQL(Structure Query Language)来操纵Oracle数据库。
简而言之,OCI接口可以内嵌到c语言中操作oracle数据库。
(2)OCI接口使用
OCI编程一般步骤是:初始化环境句柄、生成其他各类句柄、建立数据库连接进行登录、执行SQL语句,对返回的结果进行处理、终止用户会话,断开连接,释放各种句柄。
涉及主要函数流程为
1.创建OCI环境
OCIEnvCreate();
2.申请句柄
句柄是指向OCI库所分配的内存区域的指针,该内存区域中的数据由OCI库维护,应用程序可通过句柄访问其中的数据。
一个句柄可以用来存放上下文或连接信息(如环境或服务上下文句柄).它是由链接库管理,可以简化编程。利用OCIAtrrtGet()和OCIAtrrSet()这些获取或设置属性的OCI接口可以访问到句柄中存放信息。
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
(3)读取/设置句柄属性
OCIAttrSet)();
swResult = OCIAttrSet(usrhp, OCI_HTYPE_SESSION, (text*) username, strlen(username),
OCI_ATTR_USERNAME, errhp); //比如设置数据库用户名和密码
(4)连接数据库
多用户方式连接:
sword OCIServerAttach(); //其中参数4OCI_DEFAUL:表示应用程序的操作模式为阻塞模式,在这种方式下,只有当OCI调用完成后才将控制权返回给客户端应用程序;参数2还需要设置数据库的SID;
单用户方式连接:
sword OCILogon ();
(5)执行SQL语句并处理数据
比如查询多行数据
OCIStmtPrepare():设置缓冲区,将单次查询返回多行结果放在存储区里
OCIDefineByPos():建立所选字段中的一个字段和输出缓冲区的结合。这个函数定义一个将要从 Oracle 服务器中获取数据的输出缓冲区。这个函数会为所选字段隐式地分配定义句柄。如果*defnpp 为一个非空指针,OCI 假设这个指针指向一个之前通过 OCIHandleAlloc()函数或者 OCIDefineByPos()函数分配的有效的句柄。 //备注1
OCIAttrGet():设置执行语句类型
OCIStmtExecute():这个函数用来执行一个已经准备好的 SQL 语句。调用这个函数时,应用程序与服务器建立请求。
OCIStmtFetch2()利用游标获取信息循环,取出多行数据 //备注2
OCIAttrGet()//与sizeof(游标),可获取查询到总行数 //备注3
注意:执行函数时如果报错return前需要释放句柄,OCIHandleFree()
如果是更新或者改动或者删除则需要提交到数据库,Oci_commit(),且备注123不需要执行
(6)结束会话断开数据库连接
多用户:sword OCIServerDetach ( )
单用户:sword OCILogoff ()
(7)断开与数据源的连接,释放句柄
OCIServerDetach()断开与数据源的连接:
sword OCIHandleFree(
dvoid *hndlp, //要释放的句柄
ub4 type //句柄类型
)
python与数据库连接
(1)下载 instantclient压缩包并解压到相关目录
(2)导入包,连接数据库
import cx_Oracle
connect = cx_Oracle.connect(user + "/" + pwd + "@" + ip + ":" + port + "/" + sid)
cursor = connect.cursor()
(3)实现增删改查
cursor.execute(sql); //注意每次使用游标前需要将游标返回表头
cursor.execute(sql)
connect.commit()