Oracle は強力なリレーショナル データベース管理システムです。C で Oracle データベースを使用すると、データベースをより効率的に管理できます。この記事では、C で Oracle データベースを使用する方法と関連するサンプル コードを紹介します。
1. Oracle データベース ドライバーのインストールと設定
Oracle データベースを使用する前に、対応する Oracle ドライバーをインストールする必要があります。 Oracle は公式に ODBC ドライバーを提供しており、公式 Web サイトからダウンロードしてインストールできます。
インストールが完了したら、[コントロール パネル] -> [管理ツール] -> [データ ソース (ODBC)] に移動します。 ODBC ドライバーは「ドライバー」で確認できます。対応するドライバーを選択して構成する必要があります。
「データソース名」に接続するOracleデータベースのエイリアス(「orcl」など)を入力します。 「サーバー名」にはデータベースに接続するホスト名またはIPアドレスを入力します。 「ユーザーID」にデータベースに接続するためのユーザー名を入力し、パスワードに対応するパスワードを入力します。 「接続テスト」ボタンをクリックし、「接続成功」と表示されれば接続成功です。
2. Oracle データベースの使用
C で Oracle データベースを使用するには、oracle ヘッダー ファイルを導入し、関連する設定を行う必要があります。
1. ヘッダー ファイルのインクルード
まず、ヘッダー ファイル oci.h と oci.cpp をインクルードする必要があります。これら 2 つのヘッダー ファイルは、Oracle インストール ディレクトリの OCI/include ディレクトリにあります。 。
2. Oracle ライブラリ ファイルのリンク
oci.lib、ociw32.lib、orannzsbb11.dll などの Oracle ライブラリ ファイルをリンクする必要があります。
3. OCI ハンドルの作成
OCI ハンドルは、Oracle が提供するメモリ管理メカニズムです。 OCI ハンドルは、OCILIB ライブラリと Oracle サービス (SQL 文) の間の接続と対話を管理するために使用されます。
OCI ハンドルを使用する場合は、まずそれを申請し、必要に応じて構成する必要があります。一般的に使用される OCI ハンドルは次のとおりです。
(1) 環境ハンドル: OCIEnv。
(2) サービスハンドル: OCISvcCtx。
(3) セッション ハンドル: OCISession。
(4) ステートメント ハンドル: OCIStmt。
(5) 結果セット・ハンドル: OCIDefine、OCIParam。
次は、OCI 環境ハンドル、サービス ハンドル、セッション ハンドル、およびステートメント ハンドルに適用するコードです:
OCIEnv* envhp; OCIStmt* stmthp; OCIServer* srvhp; OCISession* sesshp; //申请环境句柄 int err = OCIEnvCreate(&envhp, OCI_THREADED|OCI_OBJECT, (dvoid*)0, (dvoid*(*)(dvoid*, size_t))0, (dvoid*(*)(dvoid*, dvoid*, size_t))0, (void(*)(dvoid*, dvoid*))0, (size_t)0, (dvoid**)0); //申请服务句柄 err = OCIHandleAlloc(envhp, (dvoid**)&srvhp, OCI_HTYPE_SERVER, (size_t)0, (dvoid**)0); //申请会话句柄 err = OCIHandleAlloc(envhp, (dvoid**)&sesshp, OCI_HTYPE_SESSION, (size_t)0, (dvoid**)0); //申请语句句柄 err = OCIHandleAlloc(envhp, (dvoid**)&stmthp, OCI_HTYPE_STMT, (size_t)0, (dvoid**)0);
4. Oracle データベースへの接続
次のように設定する必要があります。最初に OCIServer のサービス名を指定し、次に OCILogon2 関数を呼び出して Oracle データベースに接続します。 Oracle データベースに接続するコードは次のとおりです:
//设置服务名称 const char* db_name = "orcl"; err = OCIAttrSet(srvhp, OCI_HTYPE_SERVER, (dvoid*)db_name, strlen(db_name), OCI_ATTR_SERVER_NAME, envhp); //连接数据库 const char* user_name = "scott";//连接的用户名 const char* password = "tiger";//连接的密码 const char* dblink = 0;//连接方式 ub4 dblink_len = 0; err = OCILogon2(envhp, errhp, &sesshp, (CONST OraText*)user_name, strlen(user_name), (CONST OraText*)password, strlen(password), (CONST OraText*)dblink, (ub4)dblink_len, (CONST OraText*)0, 0);
5. SQL 文の実行
SQL 文を実行するには、OCIStmt ハンドルと OCIDefine ハンドルを使用する必要があります。 OCIStmt ハンドルは SQL 文の準備に使用され、OCIDefine ハンドルは出力変数の定義に使用されます。
SQL ステートメントを実行するコードは次のとおりです:
//定义SQL语句 const char* sql = "select empno from emp where empno=:1"; err = OCIStmtPrepare(stmthp, errhp, (CONST OraText*)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT); //绑定输入参数 ub2 empno = 7900; err = OCIBindByPos(stmthp, &bindhp, errhp, 1, &empno, sizeof(empno), SQLT_INT, 0, 0, 0, 0, 0, OCI_DEFAULT); //执行SQL语句 err = OCIStmtExecute(svchp, stmthp, errhp, 1, 0, 0, 0, OCI_DEFAULT); //定义输出变量 ub2 out_empno; ub2 ind; sb2 out_len; ERRCALL(OCIDefineByPos(stmthp, &dfnhp, errhp, 1, (dvoid*)&out_empno, sizeof(out_empno), SQLT_INT, &ind, &out_len, 0, OCI_DEFAULT)); //获取结果 err = OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT);
3. サンプル コード
Oracle データベースに接続して SQL ステートメントを実行するための完全なコードは次のとおりです。 ##
#include<iostream> #include<occi.h> #include<oci.h> using namespace std; using namespace oracle::occi; int main() { OCIEnv *envhp; OCIStmt *stmthp; OCIServer *srvhp; OCISession *sesshp; // 申请OCI环境句柄 int err = OCIEnvCreate(&envhp, OCI_THREADED|OCI_OBJECT, (dvoid*)0, (dvoid*(*)(dvoid*, size_t))0, (dvoid*(*)(dvoid*, dvoid*, size_t))0, (void(*)(dvoid*, dvoid*))0, (size_t)0, (dvoid**)0); // 申请服务句柄 err = OCIHandleAlloc(envhp, (dvoid**)&srvhp, OCI_HTYPE_SERVER, (size_t)0, (dvoid**)0); // 申请会话句柄 err = OCIHandleAlloc(envhp, (dvoid**)&sesshp, OCI_HTYPE_SESSION, (size_t)0, (dvoid**)0); // 申请语句句柄 err = OCIHandleAlloc(envhp, (dvoid**)&stmthp, OCI_HTYPE_STMT, (size_t)0, (dvoid**)0); // 设置服务名称 const char* db_name = "orcl"; err = OCIAttrSet(srvhp, OCI_HTYPE_SERVER, (dvoid*)db_name, strlen(db_name), OCI_ATTR_SERVER_NAME, envhp); // 连接数据库 const char* user_name = "scott";//连接的用户名 const char* password = "tiger";//连接的密码 const char* dblink = 0;//连接方式 ub4 dblink_len = 0; err = OCILogon2(envhp, errhp, &sesshp, (CONST OraText*)user_name, strlen(user_name), (CONST OraText*)password, strlen(password), (CONST OraText*)dblink, (ub4)dblink_len, (CONST OraText*)0, 0); // 执行SQL语句 const char* sql = "select empno from emp where empno=:1"; err = OCIStmtPrepare(stmthp, errhp, (CONST OraText*)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT); ub2 empno = 7900;// 输入的empno OCIBind* bindhp; err = OCIBindByPos(stmthp, &bindhp, errhp, 1, &empno, sizeof(empno), SQLT_INT, 0, 0, 0, 0, 0, OCI_DEFAULT); OCIDefine* dfnhp; ub2 out_empno; ub2 ind; sb2 out_len; ERRCALL(OCIDefineByPos(stmthp, &dfnhp, errhp, 1, (dvoid*)&out_empno, sizeof(out_empno), SQLT_INT, &ind, &out_len, 0, OCI_DEFAULT)); err = OCIStmtExecute(svchp, stmthp, errhp, 1, 0, 0, 0, OCI_DEFAULT); err = OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT); while(err == OCI_SUCCESS) { cout << out_empno << endl; err = OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT); } // 断开连接 OCILogoff(sesshp, envhp); OCIHandleFree(srvhp, OCI_HTYPE_SERVER); OCIHandleFree(sesshp, OCI_HTYPE_SESSION); OCIHandleFree(stmthp, OCI_HTYPE_STMT); OCIHandleFree(envhp, OCI_HTYPE_ENV); return 0; }
以上がC++ での Oracle データベースの使用とそのサンプル コードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。