Archive for 3月 30th, 2012

  1. Hello, OCI World!

    Posted on 3月 30th, 2012 by cx20

    OCI

    OCI(Oracle Call Interface)は Oracle Database 用の C API である。
    OCI 7.x とそれ以降では、関数セットが大きく異なっており、現在は、新しい関数セットを用いることが推奨されている。

    旧(7.x) 新(7.x以降) 説明
    opinit() OCIEnvCreate() 環境の作成
    olon() OCILogon() ログイン
    ologof() OCILogoff() ログオフ
    oparse() OCIStmtPrepare() SQL文の準備
    odefin() OCIDefineByPos() 項目と変数の関連付け
    oexec() OCIStmtExecute() SQL実行
    ofetch() OCIStmtFetch2() 結果セットより行を取得
    ocom() OCITransCommit() コミット
    orol() OCITransRollback() ロールバック

    なお、Windows に標準で導入されている Oracle 用のデータベースドライバとして以下のものがあるが、これらは、Oracle クライアントのバージョンとは無関係にOCI 7 API を呼び出す仕様の為、新しい機能を使う場合は、Oracle 社より提供されているドライバを使用する必要がある。

    ファイル 種類 説明
    MSORCL32.DLL ODBC ドライバ Microsoft ODBC for Oracle
    MSDAORA.DLL OLE DB プロバイダ Microsoft OLE DB Provider for Oracle

    ソースコード

    #include <stdio.h>
    #include <string.h>
    #include <oci.h>
     
    int main( int argc, char* argv[] )
    {
        sword status = OCI_SUCCESS;
        OCIEnv* envhp;
        OCIError* errhp;
        OCISvcCtx* svchp;
        OCIStmt* stmtp;
        OCIBind* bindp;
        OCIDefine* dfnp;
        char* username = "scott";
        char* password = "tiger";
        char* dbname = "orcl";
        char* stmt = "SELECT 'Hello, OCI World!' AS Message FROM DUAL";
        char message[64];
     
        OCIEnvCreate(&envhp, OCI_DEFAULT, 0, 0, 0, 0, 0, 0);
        OCIHandleAlloc(envhp, &errhp, OCI_HTYPE_ERROR, 0, 0);
        OCILogon(envhp, errhp, &svchp, username, strlen(username),
            password, strlen(password), dbname, strlen(dbname));
        OCIHandleAlloc(envhp, &stmtp, OCI_HTYPE_STMT, 0, 0);
        OCIStmtPrepare(stmtp, errhp, stmt, strlen(stmt), OCI_NTV_SYNTAX, OCI_DEFAULT);
        OCIDefineByPos(stmtp, &dfnp, errhp, 1, message, sizeof(message), SQLT_STR, 0, 0, 0, OCI_DEFAULT);
        OCIStmtExecute(svchp, stmtp, errhp, 1, 0, NULL, NULL, OCI_DEFAULT);
     
        while ( status == OCI_SUCCESS )
        {
            printf("%sn", message);
            status = OCIStmtFetch2(stmtp, errhp, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT);
        }
     
        OCIHandleFree(stmtp, OCI_HTYPE_STMT);
        OCILogoff(svchp, errhp);
        OCIHandleFree(errhp, OCI_HTYPE_ERROR);
     
        return 0;
    }

    コンパイル&リンク方法(Visua C++)

    C:¥> SET INCLUDE=ORACLE_BASEORACLE_HOMEociinclude;%INCLUDE%
    C:¥> SET LIB=ORACLE_BASEORACLE_HOMEocilibmsvc;%LIB%
    C:¥> cl hello.c /link oci.lib

    実行結果

    Hello, OCI World!