ホームページ > データベース > Oracle > C言語を使用してOracleデータベースのストアドプロシージャを呼び出す方法

C言語を使用してOracleデータベースのストアドプロシージャを呼び出す方法

PHPz
リリース: 2023-04-04 09:51:45
オリジナル
930 人が閲覧しました

ソフトウェアを開発する際、データベースの操作が必要になることがよくあります。 Oracle データベースのストアド プロシージャは非常に重要な機能の 1 つであり、ストアド プロシージャを通じて、いくつかの一般的なビジネス ロジックを再利用可能なコード ライブラリにカプセル化し、コードの開発とメンテナンスを簡素化できます。この記事では、C言語を使ってOracleデータベースのストアドプロシージャを呼び出す方法を紹介します。

  1. 準備

C プログラムの作成を開始する前に、Oracle データベースと Oracle クライアントをインストールする必要があります。 Oracle クライアントをすでにインストールしている場合は、この手順をスキップできます。

Oracle クライアントをインストールする前に、Oracle データベースをインストールし、テスト用のデータベース ユーザーを作成する必要があります。 Oracle クライアントは Oracle の公式 Web サイトからダウンロードし、オペレーティング システムのバージョンに一致するバージョンを選択してインストールできます。

  1. C コードの記述

次は、C 言語を使用して Oracle ストアド プロシージャを呼び出し、ユーザー テーブル内の指定されたレコードをクエリするサンプル コードです。

#include <stdio.h>
#include <stdlib.h>
#include <oci.h>

void report_error(OCIError *errhp) {
    text msgbuf[512];
    sb4 errcode = 0;
    OCIErrorGet((dvoid *) errhp, (ub4) 1, (text *) NULL, &errcode, msgbuf, (ub4) sizeof (msgbuf), OCI_HTYPE_ERROR);
    fprintf(stderr, "Error code %d, msg: %s\n", errcode, msgbuf);
    exit(EXIT_FAILURE);
}

int main() {
    OCIEnv *envhp;
    OCIError *errhp;
    OCIServer *srvhp;
    OCISession *authp;
    OCIStmt *stmthp;
    OCIParam *paramhp;
    OCIParam *paramhp2;
    OCIParam *paramhp3;
    ub4 pos = 0;
    text *username = (text *) "YOUR_USERNAME";
    text *password = (text *) "YOUR_PASSWORD";
    text *db = (text *) "YOUR_DATABASE";
    text *proc_name = (text *) "YOUR_PROC_NAME";
    int user_id = 1;
    text *name = (text *) malloc(512 * sizeof (text));
    sb4 name_len = 0;

    OCIInitialize((ub4) OCI_DEFAULT, (dvoid *)0,  (dvoid * (*)(dvoid *, size_t))0,
                      (dvoid * (*)(dvoid *, dvoid *, size_t))0,  (void (*)(dvoid *, dvoid *))0 );

    OCIEnvInit((OCIEnv **)&envhp, OCI_DEFAULT, (size_t) 0, (dvoid **) 0);

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

    OCIHandleAlloc((dvoid *) envhp, (dvoid **) &srvhp, OCI_HTYPE_SERVER,      (size_t) 0, (dvoid **) 0);

    OCIHandleAlloc((dvoid *) envhp, (dvoid **)&authp, OCI_HTYPE_SESSION,     (size_t) 0, (dvoid **) 0);

    OCIHandleAlloc((dvoid *) envhp, (dvoid **) &stmthp, OCI_HTYPE_STMT,       (size_t) 0, (dvoid **) 0);

    OCIAttrSet((dvoid *) srvhp, OCI_HTYPE_SERVER, (dvoid *) db, (ub4) strlen((char *) db), OCI_ATTR_SERVER, errhp);

    OCIServerAttach(srvhp, errhp, (text *) 0, (sb4) 0, OCI_DEFAULT);

    OCIAttrSet((dvoid *) authp, OCI_HTYPE_SESSION, (dvoid *) username, (ub4) strlen((char *) username), OCI_ATTR_USERNAME, errhp);

    OCIAttrSet((dvoid *) authp, OCI_HTYPE_SESSION, (dvoid *) password, (ub4) strlen((char *) password), OCI_ATTR_PASSWORD, errhp);

    OCISessionBegin(srvhp, errhp, authp, OCI_CRED_RDBMS, OCI_DEFAULT);

    OCIAttrSet((dvoid *) stmthp, OCI_HTYPE_STMT, (dvoid *) proc_name, (ub4) strlen((char *) proc_name), OCI_ATTR_PROCEDURE_NAME, errhp);

    OCIStmtPrepare(stmthp, errhp, (text *) "begin YOUR_PACKAGE.YOUR_PROC(:1,:2,:3); end;", (ub4) strlen("begin YOUR_PACKAGE.YOUR_PROC(:1,:2,:3); end;"), OCI_NTV_SYNTAX, OCI_DEFAULT);

    OCIParamGet(stmthp, OCI_HTYPE_STMT, errhp, (dvoid **)&paramhp, (ub4)1);

    OCIDefineByPos(stmthp, &paramhp3, errhp, 3, (dvoid *)&name, (sb4) sizeof(name), SQLT_STR, (dvoid *)&name_len, NULL, OCI_DEFAULT);

    OCIParamGet(stmthp, OCI_HTYPE_STMT, errhp, (dvoid **)&paramhp2, (ub4)2);

    OCIBindByPos(stmthp, &paramhp2, errhp, 2, (dvoid*)&user_id, (sb4)sizeof(user_id), SQLT_INT, (dvoid *)0, (ub2 *)0, (ub2 *)0, 0, (ub4 *)0, OCI_DEFAULT);

    OCIStmtExecute(authp, stmthp, errhp, (ub4) 0, (ub4) 0, (OCISnapshot *)0, (OCISnapshot *)0, OCI_DEFAULT);

    printf("user name: %s\n", name);
    
    OCIHandleFree((dvoid *) stmthp, OCI_HTYPE_STMT);
    OCIHandleFree((dvoid *) authp, OCI_HTYPE_SESSION);
    OCIHandleFree((dvoid *) srvhp, OCI_HTYPE_SERVER);
    OCIHandleFree((dvoid *) errhp, OCI_HTYPE_ERROR);
    OCIHandleFree((dvoid *) envhp, OCI_HTYPE_ENV);

    return 0;
}
ログイン後にコピー
  1. コードの実行

C コードを作成した後、コードをコンパイルして実行し、ストアド プロシージャが正常に呼び出せるかどうかをテストする必要があります。

C コードをコンパイルするコマンドは次のとおりです。

gcc -o demo demo.c -I$ORACLE_HOME/include -L$ORACLE_HOME/lib -lclntsh
ログイン後にコピー

ここで、$ORACLE_HOME は Oracle クライアントのインストール パスです。

Windows プラットフォームでコンパイルするには、-lclntsh-locci に変更する必要があります。

    #結論
この記事では、C 言語を使用して Oracle データベースのストアド プロシージャを呼び出す方法を紹介します。 Oracle クライアントのインストール パスを設定する必要があり、C プログラムのコンパイルでは正しいライブラリ ファイルにリンクする必要があることに注意してください。実際の開発作業ではストアドプロシージャの記述やセキュリティ処理にも注意が必要です。

以上がC言語を使用してOracleデータベースのストアドプロシージャを呼び出す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート