C语言连接Oracle数据库传递参数的方法(c oracle 传参数)
C语言连接Oracle数据库传递参数的方法
在C语言编程中,连接Oracle数据库并传递参数是常见的操作。本文将介绍一些基本的方法和代码。
我们需要安装Oracle客户端。Oracle客户端提供了ODBC驱动程序和OCI(Oracle客户端接口)库。ODBC是一种标准的数据库访问接口,而OCI是Oracle专有的接口。在这里,我们将使用OCI来连接Oracle数据库。
1. 安装Oracle客户端
Oracle客户端可以从Oracle官网下载并安装。安装完成后,需要设置环境变量。将Oracle客户端的安装目录添加到系统的PATH环境变量中。
2. 包含OCI库和头文件
在C语言代码中,需要包含OCI库和头文件。头文件是,而库文件则因系统而异。在Windows系统中,库文件是oci.lib,而在Linux系统中,库文件是libclntsh.so。
3. 连接Oracle数据库
连接Oracle数据库需要使用OCI提供的函数。需要定义一个OCIServer结构体和一个OCIError结构体。然后,调用OCIEnvCreate函数创建一个OCI环境对象。接着,使用OCIHandleAlloc函数分配服务器和错误句柄。使用OCILogon函数连接到Oracle数据库。
“`c
OCIEnv *envhp; /* OCI环境对象 */
OCIServer *srvhp; /* 服务器句柄 */
OCIError *errhp; /* 错误句柄 */
OraText *username = (OraText *)”scott”; /* 用户名 */
ub4 username_len = strlen((char *)username);
OraText *password = (OraText *)”tiger”; /* 密码 */
ub4 password_len = strlen((char *)password);
OraText *dbname = (OraText *)”orcl”; /* 数据库名 */
ub4 dbname_len = strlen((char *)dbname);
OCIString *dbstr; /* 数据库名字符串 */
text *envstr = (text *)”ORACLE_HOME=/u01/app/oracle/product/12.2.0.1/dbhome_1″; /* Oracle客户端安装路径 */
ub4 envstr_len = strlen((char *)envstr);
sword ret; /* 函数返回值 */
/* 创建OCI环境对象 */
ret = OCIEnvCreate(&envhp, OCI_OBJECT, (dvoid *)0,
(dvoid * (*)(dvoid *, size_t))0,
(dvoid * (*)(dvoid *, dvoid *, size_t))0,
(void (*)(dvoid *, dvoid *))0, (size_t)0, (dvoid **)0);
/* 分配服务器句柄 */
ret = OCIHandleAlloc((dvoid *)envhp, (dvoid **)&srvhp, OCI_HTYPE_SERVER, (size_t)0, (dvoid **)0);
/* 分配错误句柄 */
ret = OCIHandleAlloc((dvoid *)envhp, (dvoid **)&errhp, OCI_HTYPE_ERROR, (size_t)0, (dvoid **)0);
/* 设置数据库名 */
OCIStringAlloc(envhp, &dbstr, dbname_len, &dbname[0]);
/* 连接到Oracle数据库 */
ret = OCILogon(envhp, errhp, &srvhp, username, username_len, password, password_len, dbstr, dbname_len);
4. 执行SQL语句
连接到Oracle数据库后,可以使用OCI提供的函数执行SQL语句。需要定义一个OCIStmt结构体和一个OCIDefine结构体。然后,使用OCIHandleAlloc函数分配语句和定义句柄。接着,使用OCIStmtPrepare函数准备SQL语句。使用OCIStmtExecute函数执行SQL语句。
```cOCIStmt *stmthp; /* 语句句柄 */
OCIDefine *defhp; /* 定义句柄 */OraText *sql = (OraText *)"SELECT * FROM EMP WHERE DEPTNO=:1"; /* SQL语句 */
ub4 sql_len = strlen((char *)sql);ub2 deptno = 10; /* 部门编号 */
sb2 empno[10]; /* 员工编号 */OraText ename[10][20]; /* 员工姓名 */
OraText job[10][20]; /* 员工职位 */sb2 dept[10]; /* 员工所在部门编号 */
sb4 empno_len = sizeof(empno);sb4 ename_len = sizeof(ename[0]);
sb4 job_len = sizeof(job[0]);sb4 dept_len = sizeof(dept);
sb2 ind1[10]; /* 部门编号的指示变量 */sb2 ind2[10]; /* 员工编号的指示变量 */
sb2 ind3[10]; /* 员工姓名的指示变量 */sb2 ind4[10]; /* 员工职位的指示变量 */
sb2 ind5[10]; /* 员工所在部门编号的指示变量 */sb2 *inds[5]; /* 所有指示变量 */
ub2 num_emp; /* 员工数量 */ub2 i; /* 循环变量 */
ret = 0;
/* 分配语句句柄 */ret = OCIHandleAlloc((dvoid *)envhp, (dvoid **)&stmthp, OCI_HTYPE_STMT, (size_t)0, (dvoid **)0);
/* 分配定义句柄 */ret = OCIHandleAlloc((dvoid *)envhp, (dvoid **)&defhp, OCI_HTYPE_DEFINE, (size_t)0, (dvoid **)0);
/* 准备SQL语句 */ret = OCIStmtPrepare(stmthp, errhp, sql, sql_len, OCI_NTV_SYNTAX, OCI_DEFAULT);
/* 分配内存 */for (i = 0; i
ind1[i] = 0; ind2[i] = 0;
ind3[i] = 0; ind4[i] = 0;
ind5[i] = 0;}
inds[0] = ind1;inds[1] = ind2;
inds[2] = ind3;inds[3] = ind4;
inds[4] = ind5;/* 定义输出变量 */
ret = OCIDefineByPos(stmthp, &defhp, errhp, 1, (dvoid *)dept, sizeof(dept[0]), SQLT_INT, (dvoid *)&ind1[0], (ub2 *)&dept[0], (ub2 *)0, (ub4 *)0, OCI_DEFAULT);ret = OCIDefineByPos(stmthp, &defhp, errhp, 2, (dvoid *)empno, sizeof(empno[0]), SQLT_INT, (dvoid *)&ind2[0], (ub2 *)&empno[0], (ub2 *)0, (ub4 *)0, OCI_DEFAULT);
ret = OCIDefineByPos(stmthp, &defhp, errhp, 3, (dvoid *)ename, sizeof(ename[0]), SQLT_STR, (dvoid *)&ind3[0], (ub2 *)&ename[0], (ub2 *)&ename_len, (ub4 *)0, OCI_DEFAULT);ret = OCIDefineByPos(stmthp, &defhp, errhp, 4, (dvoid *)job, sizeof(job[0]), SQLT_STR, (dvoid *)&ind4[0], (ub2 *)&job[0], (ub2 *)&job_len, (ub4 *)0, OCI_DEFAULT);
ret = OCIDefineByPos(stmthp, &defhp, errhp, 5, (dvoid *)dept, sizeof(dept[0]), SQLT_INT, (dvoid *)&ind5[0], (ub2 *)&dept[0], (ub2 *)0, (ub4 *)0, OCI_DEFAULT);/* 绑定参数 */
ret = OCIBindByPos(stmthp, &defhp, errhp, 1, (dvoid *)&deptno, sizeof(deptno), SQLT_INT, (dvoid *)0, (ub2 *)0, (ub2 *)0, (ub4)0, (ub4 *)0, OCI_DEFAULT);/* 执行SQL语句 */
ret = OCIStmtExecute(srvhp, stmthp, errhp, (ub4)1, (ub4)0, (OCISnapshot *)NULL, (OCISnapshot *)NULL, OCI_DEFAULT);/* 获取结果 */
ret = OCIStmtFetch(stmthp, errhp, (ub4)1, OCI_FETCH_NEXT, OCI_DEFAULT);num_emp = i;
/* 释放资源 */OCIStringFree(envhp, dbstr);
OCIHandleFree((dvoid *)stmthp, OCI_HTYPE_STMT);OCIHandleFree((dvoid *)defhp, OCI_HTYPE_DEFINE);
OCIHandleFree((dvoid *)srvhp, OCI_H