Oracle入门开发必备之API(oracle入门api)

近年来,Oracle数据库的使用越来越广泛,成为许多企业应用系统的首选。作为一名开发人员,掌握Oracle数据库的API开发技能非常重要。本文将介绍Oracle API开发的内容,并提供一些实用的示例。

1. 简介

API全称(Application Programming Interface),即应用程序编程接口。简单地说,API是软件应用与外界交互的接口,通过API可以实现对外的数据交互和调用,实现各个应用和系统之间的数据传输和通信。

Oracle数据库的API主要有四类:

(1)OCI API:Oracle Call Interface,是Oracle提供的一种C语言编程接口。

(2)JDBC API:Java Database Connectivity,是Java语言连接Oracle数据库的API库。

(3)ODBC API:Open Database Connectivity,是Microsoft公司提供的连接各种数据库的统一API规范。

(4).NET API:Microsoft .NET Framework提供的连接Oracle数据库的API库。

在这里,我们将主要介绍OCI API。

2. OCI API

OCI API 是 Oracle Call Interface,是Oracle数据库的C语言编程接口。OCI API是高效的、功能强大的API库,并且对多种语言都有支持。

OCI通过向应用程序提供一组库函数,让应用程序在运行时调用这些函数,从而实现与Oracle数据库的交互。OCI的编程模式类似于C语言中的标准I/O函数库,因此与C语言的程序员可以很快地上手。

OCI的安装包可以在Oracle官网或Oracle安装光盘中找到,安装后将OCI所在目录的include及lib、oraclnt.dll加入到你的工程中。

如果你使用的是VS Code,可以使用Visual Studio Code 集成Oracle Database操作来向应用程序中集成OCI API。

下面我们来看一些实用的OCI API使用示例。

3. OCI API使用示例

3.1 连接Oracle数据库

连接Oracle数据库是OCI API最基本的操作之一。我们先来看一个简单的连接Oracle数据库的代码。

#include 
#include
#include
#define USERNAME "scott"
#define PASSWORD "tiger"
#define DATABASE "orcl"
#define SQLSTR "select * from emp"

int mn(int argc, char *argv[])
{
OCIEnv *envhp; // 环境句柄
OCIError *errhp; // 错误句柄
OCISvcCtx *svchp; // 服务上下文句柄
OCIServer *srvhp; // 服务器句柄
OCISession *authp; // 验证句柄
OCIStmt *stmthp; // 语句句柄
OCIDefine *defnp; // 取值句柄
sword errcode;
text errbuf[512];
ub4 errlen;
ub2 rcount;
ub4 empno;

if (OCIEnvCreate(&envhp, OCI_DEFAULT, (dvoid *)0, (dvoid *(*)(dvoid *, size_t))0, (dvoid *(*)(dvoid *, dvoid *, size_t))0, (void (*)(dvoid *, dvoid *))0, (size_t)0, (dvoid **)0))
{
printf("OCIEnvCreate Error!\n");
return 0;
}

OCIHandleAlloc(envhp, (dvoid **)&errhp, OCI_HTYPE_ERROR, 0, (dvoid **)0);

OCIHandleAlloc(envhp, (dvoid **)&svchp, OCI_HTYPE_SVCCTX, 0, (dvoid **)0);
OCIHandleAlloc(envhp, (dvoid **)&srvhp, OCI_HTYPE_SERVER, 0, (dvoid **)0);
OCIHandleAlloc(envhp, (dvoid **)&authp, OCI_HTYPE_SESSION, 0, (dvoid **)0);
OCIHandleAlloc(envhp, (dvoid **)&stmthp, OCI_HTYPE_STMT, 0, (dvoid **)0);

if (OCIServerAttach(srvhp, errhp, (text *)DATABASE, strlen(DATABASE), OCI_DEFAULT) != OCI_SUCCESS)
{
OCIErrorGet(errhp, 1, (text *)0, &errcode, errbuf, sizeof(errbuf), OCI_HTYPE_ERROR);
printf("OCIServerAttach Error: %s\n", errbuf);
return 0;
}

OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, (dvoid *)srvhp, (ub4)0, OCI_ATTR_SERVER, errhp);

OCIAttrSet(authp, OCI_HTYPE_SESSION, (dvoid *)USERNAME, strlen(USERNAME), OCI_ATTR_USERNAME, errhp);
OCIAttrSet(authp, OCI_HTYPE_SESSION, (dvoid *)PASSWORD, strlen(PASSWORD), OCI_ATTR_PASSWORD, errhp);

if (OCISessionBegin(svchp, errhp, authp, OCI_CRED_RDBMS, OCI_DEFAULT))
{
OCIErrorGet(errhp, 1, (text *)0, &errcode, errbuf, sizeof(errbuf), OCI_HTYPE_ERROR);
printf("OCISessionBegin Error:%s\n", errbuf);
return 0;
}

OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, (dvoid *)authp, (ub4)0, OCI_ATTR_SESSION, errhp);

if (OCIStmtPrepare(stmthp, errhp, (text *)SQLSTR, strlen(SQLSTR), OCI_NTV_SYNTAX, OCI_DEFAULT))
{
OCIErrorGet(errhp, 1, (text *)0, &errcode, errbuf, sizeof(errbuf), OCI_HTYPE_ERROR);
printf("OCIStmtPrepare Error:%s\n", errbuf);
return 0;
}

if (OCIStmtExecute(svchp, stmthp, errhp, 1, 0, NULL, NULL, OCI_STMT_SCROLLABLE_READ_ONLY))
{
OCIErrorGet(errhp, 1, (text *)0, &errcode, errbuf, sizeof(errbuf), OCI_HTYPE_ERROR);
printf("OCIStmtExecute Error:%s\n", errbuf);
return 0;
}

while ((errcode = OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT)) == OCI_SUCCESS)
{
OCIAttrGet(stmthp, OCI_HTYPE_STMT, (dvoid *)&empno, NULL, OCI_ATTR_ROWID, errhp);
printf("%d\n", empno);
}

OCISessionEnd(svchp, errhp, authp, OCI_DEFAULT);
OCIServerDetach(srvhp, errhp, OCI_DEFAULT);

OCIHandleFree(errhp, OCI_HTYPE_ERROR);
OCIHandleFree(srvhp, OCI_HTYPE_SERVER);
OCIHandleFree(svchp, OCI_HTYPE_SVCCTX);
OCIHandleFree(authp, OCI_HTYPE_SESSION);
OCIHandleFree(stmthp, OCI_HTYPE_STMT);

OCIEnvFree(envhp);

return 0;
}

上述代码使用OCI连接Oracle数据库,并通过OCI语句句柄实现数据查询操作。

3.2 插入数据

OCI API可以使用OCIStmtPrepare和OCIStmtExecute函数向数据库中插入数据。代码如下:

char *insert_sql = "insert into emp values(:empno, :ename, :job, :mgr, :hiredate, :sal, :comm, :deptno)";
OCIBind *bind[8];

struct tm *p_tm;
time_t tm = time(NULL);
p_tm = localtime(&tm);

OCIDate o_hire;
OCIDateTime *p_hire;
OCIDescriptor *p_dt = NULL;

OCIStmtPrepare(stmthp, errhp, (text *)insert_sql, strlen(insert_sql), OCI_NTV_SYNTAX, OCI_DEFAULT);

OCIDescriptorAlloc(envhp, &p_dt, OCI_DTYPE_TIMESTAMP, 0, NULL);
OCIDateTimeConstruct(envhp, errhp, p_dt, p_tm->tm_year + 1900, p_tm->tm_mon + 1, p_tm->tm_mday, p_tm->tm_hour, p_tm->tm_min, p_tm->tm_sec, 0, NULL, 0);
OCIDateTimeToOracle(envhp, p_dt, &o_hire);

// 绑定 empno 参数
OCIBindByName(stmthp, &bind[0], errhp, (text *)":empno", -1, &empno, sizeof(empno), SQLT_INT, NULL, NULL, NULL, 0, NULL, OCI_DEFAULT);
// 绑定 ename 参数
OCIBindByName(stmthp, &bind[1],

数据运维技术 » Oracle入门开发必备之API(oracle入门api)