Oracle には API があります。 Oracle データベースの API には主に、1. Oracle が提供する C 言語プログラミング インターフェイスである OCI API、2. Java 言語で Oracle データベースに接続するための API ライブラリである JDBC API、3. ODBC API、の 4 種類があります。各種データベースを接続するための Microsoft Unified API 仕様で提供される 4. .NET API など
このチュートリアルの動作環境: Windows 10 システム、Oracle バージョン 19c、Dell G3 コンピューター。
近年、Oracle データベースはますます広く使用されるようになり、多くのエンタープライズ アプリケーション システムの最初の選択肢となっています。開発者として、Oracle データベースの API 開発スキルを習得することは非常に重要です。この記事では、Oracle API開発の内容と実践例を紹介します。
1. はじめに
API (Application Programming Interface) の正式名称は、アプリケーション プログラミング インターフェイスです。 APIとは簡単に言うと、ソフトウェアアプリケーションが外部とやりとりするためのインターフェースのことで、APIを通じて外部とのデータのやりとりや呼び出しが実現でき、さまざまなアプリケーションやシステム間のデータの送信や通信が実現できます。
Oracle データベース API には 4 つの主要なカテゴリがあります。
(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 データベースの C 言語プログラミング インターフェイスである Oracle Call Interface です。 OCI API は、複数の言語をサポートする効率的で強力な API ライブラリです。
OCI は、一連のライブラリ関数をアプリケーションに提供し、アプリケーションが実行時にこれらの関数を呼び出せるようにすることで、Oracle データベースと対話します。 OCI のプログラミング モデルは C 言語の標準 I/O 関数ライブラリに似ているため、C 言語を使用するプログラマはすぐに使い始めることができます。
OCI のインストール パッケージは、Oracle 公式 Web サイトまたは Oracle インストール CD にあります。インストール後、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 の最も基本的な操作の 1 つです。まず、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],
以上がオラクルには API がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。