目次

OCIの概要

OCIプログラムの処理の流れ

トランザクションのコミットとロールバック

OCI関数リファレンス

OCIの概要

Oracle Call Interface (OCI)とは、リレーショナル・データベース・マネジメント・システムのAPIであり、CまたはC++言語で作成するアプリケーションからデータベース操作を実行することができる。OCIがサポートするRDBMSとして、Oracle DatabaseとOracle TimesTen In-Memory Databaseがある。

ヘッダファイルのインクルード

OCIアプリケーションは、 oci.h ヘッダファイルをインクルードする必要がある。

#include <oci.h>

OCIアプリケーションは、OCIライブラリとリンクする必要がある。

ハンドル

ハンドル とは、OCIライブラリによって割り当てられる記憶領域を指す不透明なポインタである。OCIライブラリは、このハンドルを利用してコンテキストや接続などに関する情報にアクセスする。

OCIのハンドル・タイプを表す識別子がヘッダファイル oci.h で定義されている。OCIのハンドル・タイプを次の表に示す。

OCIのハンドル
ハンドル・タイプ 説明 データ型
OCI_HTYPE_ENV 環境ハンドル OCIEnv *
OCI_HTYPE_ERROR エラー・ハンドル OCIError *
OCI_HTYPE_SVCCTX サービス・コンテキスト・ハンドル OCISvcCtx *
OCI_HTYPE_STMT 文ハンドル OCIStmt *
OCI_HTYPE_BIND バインド・ハンドル OCIBind *
OCI_HTYPE_DEFINE 定義ハンドル OCIDefine *

データ型

OCI関数の戻り値や引数のデータ型がヘッダファイルで定義されている。

OCIのデータ型
データ型 説明
sb2 符号あり2バイト整数
ub2 符号なし2バイト整数
sb4 符号あり4バイト整数
ub4 符号なし4バイト整数
sword 符号ありワード
text 文字
OraText 文字
dvoid void

OCI関数の戻り値とエラー処理

OCI関数の戻り値のデータ型は sword である。OCI関数の戻り値を表す識別子がヘッダファイル oci.h で定義されている。OCI関数の戻り値を次の表に示す。

OCI関数の戻り値
戻り値 意味 診断情報
OCI_SUCCESS 正常に終了した なし
OCI_SUCCESS_WITH_INFO 正常に終了した あり
OCI_NO_DTATA これ以上のデータなし なし
OCI_ERROR 失敗した あり
OCI_INVALID_HANDLE 無効なハンドルがパラメータとして渡された なし
OCI_NEED_DATA アプリケーションからランタイムデータを渡す必要がある なし

診断情報がある場合は、OCIErrorGet関数をコールすることで診断情報を得ることができる。

外部データ型

外部データ型(データベースのデータ型)と、それに対応するプログラム変数のデータ型およびOCI定数との関係を次の表に示す。

外部データ型 プログラム変数 OCI定義の定数
VARCHAR2 char[ n ] SQLT_CHR
NUMBER unsigned char[21] SQLT_NUM
8ビット符号付きINTEGER signed char SQLT_INT
16ビット符号付きINTEGER signed short, signed int SQLT_INT
32ビット符号付きINTEGER signed int, signed long SQLT_INT
FLOAT float, double SQLT_FLT
ヌル文字で終了するSTRING char[ n+1] SQLT_STR

OCIプログラムの処理の流れ

  1. OCI環境の作成
  2. 各ハンドルの割り当て
  3. サーバー接続とセッションの開始
  4. SQL文の発行とデータの処理
  5. セッションの終了とサーバー切断
  6. ハンドルの解放

OCIアプリケーションのサンプル・ソースコードを次に示す。

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

void error_handler(sword ociret, dvoid *hndlp)
{
    sb4 errcode;
    char buf[256];

    switch (ociret) {
    case OCI_SUCCESS:
        break;
    case OCI_SUCCESS_WITH_INFO:
        printf("OCI_SUCCESS_WITH_INFO\n");
        break;
    case OCI_NO_DATA:
        printf("OCI_NO_DATA\n");
        break;
    case OCI_ERROR:
        printf("OCI_ERROR\n");
        OCIErrorGet(hndlp, 1, NULL, &errcode, buf, sizeof(buf), OCI_HTYPE_ERROR);
        printf("%d %s\n", errcode, buf);
        break;
    case OCI_INVALID_HANDLE:
        printf("OCI_INVALID_HANDLE\n");
        break;
    case OCI_NEED_DATA:
        printf("OCI_NEED_DATA\n");
        break;
    default:
        break;
    }
}

int main()
{
    sword ociret;
    OCIEnv *envhp;
    OCIError *errhp;
    OCISvcCtx *svchp;
    OCIStmt *stmtp;
    OCIBind *bindp;
    OCIDefine *dfnp1, *dfnp2;
    char *username = "scott";
    char *password = "tiger";
    char *db_name = "XE";
    char *stmt = "SELECT empno, ename FROM emp WHERE deptno = :1";
    int empno, deptno = 3;
    char ename[64];

    /* 環境の作成 */
    ociret = OCIEnvCreate(&envhp, OCI_DEFAULT, 0, 0, 0, 0, 0, 0);
    error_handler(ociret, envhp);

    /* エラー・ハンドルの割り当て */
    ociret = OCIHandleAlloc(envhp, &errhp, OCI_HTYPE_ERROR, 0, 0);
    error_handler(ociret, errhp);

    /* ログイン・セッションの作成 */
    ociret = OCILogon(envhp, errhp, &svchp, username, strlen(username),
        password, strlen(password), db_name, strlen(db_name));
    error_handler(ociret, errhp);

    /* 文ハンドルの割り当て */
    ociret = OCIHandleAlloc(envhp, &stmtp, OCI_HTYPE_STMT, 0, 0);
    error_handler(ociret, errhp);

    /* SQL文の準備 */
    ociret = OCIStmtPrepare(stmtp, errhp, stmt, strlen(stmt),
        OCI_NTV_SYNTAX, OCI_DEFAULT);
    error_handler(ociret, errhp);

    /* プレースホルダのバインド */
    ociret = OCIBindByPos(stmtp, &bindp, errhp, 1, &deptno, sizeof(deptno),
        SQLT_INT, 0, 0, 0, 0, 0, OCI_DEFAULT);
    error_handler(ociret, errhp);

    /* 出力変数の定義 */
    ociret = OCIDefineByPos(stmtp, &dfnp1, errhp, 1, &empno, sizeof(empno),
        SQLT_INT, 0, 0, 0, OCI_DEFAULT);
    error_handler(ociret, errhp);

    /* 出力変数の定義 */
    ociret = OCIDefineByPos(stmtp, &dfnp2, errhp, 2, ename, sizeof(ename),
        SQLT_CHR, 0, 0, 0, OCI_DEFAULT);
    error_handler(ociret, errhp);

    /* 準備済みのSQL文を実行 */
    ociret = OCIStmtExecute(svchp, stmtp, errhp, 1, 0, NULL, NULL, OCI_DEFAULT);
    error_handler(ociret, errhp);

    while (OCI_SUCCESS == ociret) {
        printf("%d %s\n", empno, ename);

        /* 結果セットから行をフェッチ */
        ociret = OCIStmtFetch2(stmtp, errhp, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT);
        error_handler(ociret, errhp);
    }

    /* 文ハンドルの解放 */
    ociret = OCIHandleFree(stmtp, OCI_HTYPE_STMT);
    error_handler(ociret, errhp);

    /* ログイン・セッションの解放 */
    ociret = OCILogoff(svchp, errhp);
    error_handler(ociret, errhp);

    /* エラー・ハンドルの解放 */
    ociret = OCIHandleFree(errhp, OCI_HTYPE_ERROR);
    error_handler(ociret, errhp);
}

OCI環境の作成

OCI環境を利用するプログラムは、まずOCI環境を作成して環境ハンドルを得る必要がある。OCI環境を作成するには、OCIEnvCreate関数をコールする。

ハンドルの割り当て

OCIには様々な種類のハンドルが存在する。これらのハンドルを割り当てるには、OCIHandleAlloc関数をコールする。ただし、環境ハンドルだけは OCIHandleAlloc 関数ではなく、OCIEnvCreate関数で割り当てる。

プログラムにおいてどのようなハンドルが必要になるかはコールするOCI関数によって異なるが、絶対必要な環境ハンドルに加えて、エラー・ハンドルやサービス・コンテキスト・ハンドルはほぼ必須となるだろう。

サーバー接続とセッションの開始

サーバー接続とセッションの確立を行なうには、複数の方法がある。

単一ユーザーで単一の接続を確立

あるデータベース接続に対して、ひとつのユーザー・セッションしか必要ない場合、OCILogon関数をコールする。

複数セッションで複数の接続を確立

ひとつのデータベースに対して複数のユーザー・セッションが接続する必要がある場合、OCIServerAttachおよび OCISessionBegin 関数をコールする。

SQL文の発行とデータの処理

SQL文を発行してデータの処理を行なう基本的な手順を次に示す。

  1. SQL文の準備
  2. プレースホルダのバインド(省略可能)
  3. SQL文の実行
  4. 選択リスト項目の記述(省略可能)
  5. 出力変数の定義(省略可能)
  6. データのフェッチと処理(省略可能)

SQL文の準備

SQL文を実行する前に、SQL文の準備を行なう必要がある。SQL文の準備を行なうには、OCIStmtPrepare関数をコールする。

プレースホルダのバインド

OCIアプリケーションから変数の値をSQL文へ渡す場合、プレースホルダのバインドを行なう必要がある。

バインド とは、プログラム変数のアドレスとSQL文(またはPL/SQLブロック内)のプレースホルダを関連付けることである。プレースホルダのバインドを行なうには、次の5種類のOCI関数のうちいずれかをコールする。

OCIアプリケーションから変数の値をSQL文に渡さない場合、プレースホルダのバインドは行わない。

出力変数の定義

問い合せ文はデータベースのデータをアプリケーションに戻す。SELECT文などの問い合わせを処理するときには、データを検索する各選択リスト項目について、それぞれ出力変数を定義する必要がある。

出力変数を定義するには、次のOCI関数のうちいずれかをコールする。

SQL文の実行

準備済みのSQL文を実行するには、OCIStmtExecute関数をコールする。

データのフェッチと処理

SQL文の実行で問い合わせを行なった場合、続けて結果セットのフェッチ(取り出し)を行なう。フェッチを行なうにはOCIStmtFetch2関数をコールする。

セッションの終了とサーバー切断

OCILogon によりログイン・セッションを作成した場合は、OCILogoff関数をコールしてログイン・セッションを解放する。

ハンドルの解放

割り当てたハンドルを解放するには、OCIHandleFree関数をコールする。

トランザクションのコミットとロールバック

OCIでトランザクションのコミットやロールバックを行なう場合、 COMMITROLLBACK などのSQL文を発行するのではなく、専用のOCI関数をコールする。

コミットおよびロールバックに関するOCI関数を次に示す。

OCI関数 説明
OCITransCommit トランザクションをコミットする。
OCITransRollback トランザクションをロールバックする。

OCI関数リファレンス

OCIBindByName

プログラム変数とSQL文のプレースホルダを名前によって関連付ける。

構文

sword OCIBindByName (
    OCIStmt    *stmtp,
    OCIBind    **bindpp,
    OCIError   *errhp,
    CONST text *placeholder,
    sb4        placeh_len,
    dvoid      *valuep,
    sb4        value_sz,
    ub2        dty,
    dvoid      *indp,
    ub2        *alenp,
    ub2        *rcodep,
    ub4        maxarr_len,
    ub4        *curelep,
    ub4        mode,
);

パラメータ

stmtp (入力/出力)
文ハンドル
bindpp (入力/出力)
バインド・ハンドルを格納する領域のポインタ。バインド領域を確保して、バインド・ハンドルを戻す。
errhp (入力/出力)
エラー・ハンドル
palceholder (入力)
プレースホルダの名前
palceh_len (入力)
palceholder パラメータに指定した名前の長さ(バイト数)
valuep (入力/出力)
データ値のアドレス。プレースホルダの内容により、プレースホルダへの入力データかプレースホルダからの出力データかが決まる。
value_sz (入力)
データ値のサイズ
dty (入力)
バインドされる値のデータ型。指定できるOCI定数は外部データ型を参照。
mode (入力)
OCI_DEFAULTを指定。

サンプル・ソースコード

sword ociret;
OCIError *errhp;
OCIStmt *stmtp;
OCIBind *bindp;
char *stmt = "SELECT empno, ename FROM emp WHERE deptno = :dept_no";
int deptno = 3;
char *placeholder = "dept_no";

/* 中略 */

ociret = OCIBindByName(stmtp, &bindp, errhp, placeholder, strlen(placeholder),
    &deptno, sizeof(deptno), SQLT_INT, 0, 0, 0, 0, 0, OCI_DEFAULT);

OCIBindByPos

プログラム変数とSQL文(またはPL/SQLブロック内)のプレースホルダを位置によって関連付ける。

構文

sword OCIBindByPos (
    OCIStmt  *stmtp,
    OCIBind  **bindpp,
    OCIError *errhp,
    ub4      position,
    dvoid    *valuep,
    sb4      value_sz,
    ub2      dty,
    dvoid    *indp,
    ub2      *alenp,
    ub2      *rcodep,
    ub4      maxarr_len,
    ub4      *curelep,
    ub4      mode,
);

パラメータ

stmtp (入力/出力)
文ハンドル
bindpp (入力/出力)
バインド・ハンドルを格納する領域のポインタ。バインド領域を確保して、バインド・ハンドルを戻す。
errhp (入力/出力)
エラー・ハンドル
position (入力)
プレースホルダの位置(1から始まる整数)
valuep (入力/出力)
データ値のアドレス。プレースホルダの内容により、プレースホルダへの入力データかプレースホルダからの出力データかが決まる。
value_sz (入力)
データ値のサイズ
dty (入力)
バインドされる値のデータ型。指定できるOCI定数は外部データ型を参照。
mode (入力)
OCI_DEFAULTを指定。

サンプル・ソースコード

sword ociret;
OCIError *errhp;
OCIStmt *stmtp;
OCIBind *bindp;
char *stmt = "SELECT empno, ename FROM emp WHERE deptno = :1";
int deptno = 3;

/* 中略 */

ociret = OCIBindByPos(stmtp, &bindp, errhp, 1, &deptno, sizeof(deptno),
    SQLT_INT, 0, 0, 0, 0, 0, OCI_DEFAULT);

OCIDefineByPos

選択リスト内の項目を型と出力データ・バッファに関連付ける。

構文

sword OCIDefineByPos (
    OCIStmt   *stmtp,
    OCIDefine **dfnpp,
    OCIError  *errhp,
    ub4       position,
    dvoid     *valuep,
    sb4       value_sz,
    ub2       dty,
    dvoid     *indp,
    ub2       *rlenp,
    ub2       *rcodep,
    ub4       mode
);

パラメータ

stmtp (入力/出力)
文ハンドル
defnpp (入力/出力)
定義ハンドルを格納する領域のポインタ。定義領域を確保して、定義ハンドルを戻す。
errhp (入力/出力)
エラー・ハンドル
position (入力)
選択リスト内での項目の位置(1から始まる整数)。たとえば、次のSELECT文では empno の位置が1、 ename の位置が2となる。
SELECT empno, ename FROM emp;
valuep (入力/出力)
出力データを格納する領域へのポインタ
value_sz (入力)
出力データを格納する領域のサイズ(バイト単位)
dty (入力)
出力データのデータ型。指定できるOCI定数は外部データ型を参照。
mode (入力)
OCI_DEFAULT

サンプル・ソースコード

sword ociret;
OCIError *errhp;
OCIStmt *stmtp;
OCIDefine *dfnp1, *dfnp2;
int empno;
char ename[64];

/* 中略 */

ociret = OCIDefineByPos(stmtp, &dfnp1, errhp, 1, &empno, sizeof(empno),
    SQLT_INT, 0, 0, 0, OCI_DEFAULT);
ociret = OCIDefineByPos(stmtp, &dfnp2, errhp, 2, ename, sizeof(ename),
    SQLT_CHR, 0, 0, 0, OCI_DEFAULT);

OCIEnvCreate

OCI環境を作成する。

構文

sword OCIEnvCreate (
    OCIEnv      **envhpp,
    ub4         mode,
    CONST dvoid *ctxp,
    CONST dvoid *(*malocfp)(dvoid *ctxp, size_t size),
    CONST dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),
    CONST void  (*mfreefp)(dvoid *ctxp, dvoid *memptr),
    size_t      *tramemsz,
    dvoid       **usermempp
);

パラメータ

envhpp (出力)
環境ハンドルを格納する領域のポインタ。環境領域を確保して、環境ハンドルを戻す。
mode (入力)
モード
OCIEnvCreate()mode 引数
説明
OCI_DEFAULT デフォルト値
OCI_THREADED マルチスレッド環境アプリケーションで使用する
OCI_OBJECT オブジェクト機能を使用する

前提条件

他のすべてのOCI関数に先立って最初にコールする必要がある。

サンプル・ソースコード

sword ociret;
OCIEnv *envhp;

ociret = OCIEnvCreate(&envhp, OCI_DEFAULT, 0, 0, 0, 0, 0, 0);

OCIErrorGet

エラー・メッセージとOracleエラーを戻す。

構文

sword OCIErrorGet (
    dvoid *hndlp,
    ub4   recordno,
    text  *sqlstate,
    sb4   *errcodep,
    text  *bufp,
    ub4   bufsiz,
    ub4   type
);

パラメータ

hndlp (入力)
OCIEnvCreateおよびOCIHandleAllocの診断情報を得る場合には環境ハンドル。その他のOCI関数の診断情報を得る場合はエラー・ハンドル。
recordno (入力)
検索先の状態レコード(1から始まる)
sqlstate (出力)
サポートされていない
errcodep (出力)
戻されたエラー・コード
bufp (出力)
戻されたエラー・メッセージ・テキスト
bufsize (入力)
エラー・メッセージの取得に使用するバッファのサイズ(バイト単位)
type (入力)
ハンドルのタイプ
OCIErrorGet()type 引数
説明
OCI_HTYPE_ENV 環境ハンドル
OCI_HTYPE_ERROR エラー・ハンドル

前提条件

あらかじめ他のOCI関数をコールしておく必要がある。

サンプル・ソースコード

sword ociret;
OCIError *errhp;
sb4 errcode;
char buf[256];

/* 中略 */

switch (ociret) {
  case OCI_ERROR:
    OCIErrorGet(errhp, 1, NULL, &errcode, buf, sizeof(buf), OCI_HTYPE_ERROR);
    break;
}

OCIHandleAlloc

各種ハンドルを割り当てる(環境ハンドルを除く)。

構文

sword OCIHandleAlloc (
    CONST dvoid *parenth,
    dvoid       **hndlpp,
    ub4         type,
    size_t      *tramem_sz,
    dvoid       **usrmempp
);

パラメータ

parenth (入力)
環境ハンドル
hndlpp (出力)
ハンドルを格納する領域のポインタ
type (入力)
割り当てるハンドルの種類
OCIHandleAlloc()type 引数
type 説明 データ型
OCI_HTYPE_ERROR エラー・ハンドル OCIError
OCI_HTYPE_SERVER サーバー・ハンドル OCIServer
OCI_HTYPE_STMT 文ハンドル OCIStmt
OCI_HTYPE_SVCCTX サービス・コンテキスト・ハンドル OCISvcCtx

前提条件

あらかじめOCIEnvCreate関数をコールして環境ハンドルを得ておく必要がある。

サンプル・ソースコード

sword ociret;
OCIEnv *envhp;
OCIError *errhp;

/* 中略 */

ociret = OCIHandleAlloc(envhp, &errhp, OCI_HTYPE_ERROR, 0, 0);

OCIHandleFree

ハンドルの割り当てを明示的に解放する。

構文

sword OCIHandleFree (
    dvoid *hndlp,
    ub4   type
);

パラメータ

hndlp (入力)
解放するハンドル
type (入力)
解放するハンドルの種類
OCIHandleFree()type 引数
説明
OCI_HTYPE_ENV 環境ハンドル
OCI_HTYPE_ERROR エラー・ハンドル
OCI_HTYPE_SERVER サーバー・ハンドル
OCI_HTYPE_STMT 文ハンドル
OCI_HTYPE_SVCCTX サービス・コンテキスト・ハンドル

サンプル・ソースコード

sword ociret;
OCIError *errhp;

/* 中略 */

ociret = OCIHandleFree(errhp, OCI_HTYPE_ERROR);

OCILogoff

OCILogonを使用して作成したログイン・セッションを解放する。

構文

sword OCILogoff (
    OCISvcCtx *svchp,
    OCLError *errhp
);

パラメータ

svchp (入力)
サービス・コンテキスト・ハンドル
errhp (入力/出力)
エラー・ハンドル

前提条件

あらかじめOCILogon関数をコールしてログイン・セッションを作成しておく必要がある。

サンプル・ソースコード

sword ociret;
OCIError *errhp;
OCISvcCtx *svchp;

/* 中略 */

ociret = OCILogoff(svchp, errhp);

OCILogon

ログイン・セッションを作成する。

構文

sword OCILogon (
    OCIEnv        *envhp,
    OCIError      *errhp,
    OCISvcCtx     **svchp,
    CONST OraText *username
    ub4           uname_len,
    CONST OraText *password,
    ub4           passwd_len,
    CONST OraText *dbname,
    ub4           dbname_len
);

パラメータ

envhp (入力)
環境ハンドル
errhp (入力/出力)
エラー・ハンドル
svchp (入力/出力)
サービス・コンテキスト・ハンドルを格納する領域のポインタ。サービス・コンテキスト領域を確保して、サービス・コンテキスト・ハンドルを戻す。
username (入力)
ユーザー名
uname_len (入力)
username の長さ(バイト単位)
password (入力)
ユーザーのパスワード
passwd_len (入力)
password の長さ(バイト単位)
dbname (入力)
接続先のデータベース名。 NULL を指定した場合、デフォルトのデータベースに接続する。
dbname_len (入力)
dbname の長さ(バイト単位)。 dbname パラメータにNULLを指定した場合は0を指定する。

前提条件

あらかじめOCIEnvCreate関数をコールして環境ハンドルを得ておく必要がある。

あらかじめOCIHandleAlloc関数をコールしてエラー・ハンドルを得ておく必要がある。

サンプル・ソースコード

sword ociret;
OCIEnv *envhp;
OCIError *errhp;
OCISvcCtx *svchp;
char *username = "scott";
char *password = "tiger";
char *db_name = "XE"

/* 中略 */

ociret = OCILogon(envhp, errhp, &svchp, username, strlen(username),
    password, strlen(password), db_name, strlen(db_name));

OCIServerAttach

データ・ソースへのアクセス・パスを作成する。

構文

sword OCIServerAttach (
    OCIServer  *srvhp,
    OCLError   *errhp,
    CONST text *dblink,
    sb4        dblink_len,
    ub4        mode
);
srvhp (入力/出力)
サーバー・ハンドル
errhp (入力/出力)
エラー・ハンドル
dblink (入力)
使用するデータベース・サーバー。接続文字列またはサービス・ポイントを指定する文字列。
dblink_len (入力)
dblinkが指し示す文字列の長さ
mode (入力)
操作モード
OCIServerAttach()mode 引数
意味
OCI_DEFAULT デフォルト
OCI_CPOOL 接続プーリングを使用する

OCIStmtExecute

準備済みのSQL文を実行する。

構文

sword OCIStmtExecute (
    OCISvcCtx         *svchp,
    OCIStmt           *stmtp,
    OCLError          *errhp,
    ub4               iters,
    ub4               rowoff,
    CONST OCISnapShot *snap_in,
    OCISnapShot       *snap_out,
    ub4               mode
);

パラメータ

svchp (入力/出力)
サービス・コンテキスト・ハンドル
stmtp (入力/出力)
文ハンドル
errhp (入力/出力)
エラー・ハンドル
iters (入力)
SELECT文以外の場合、この分が実行される回数は iters - rowoff の場合と同じとなる。
rowoff (入力)
この複数行実行に関連する配列バインドのデータが始まる開始索引
mode (入力)
OCI_DEFAULT

前提条件

あらかじめOCIStmtPrepare関数をコールしてSQL文を準備しておく必要がある。

サンプル・ソースコード

sword ociret;
OCIError *errhp;
OCISvcCtx *svchp;
OCIStmt *stmtp;

/* 中略 */

ociret = OCIStmtExecute(svchp, stmtp, errhp, 1, 0, NULL, NULL, OCI_DEFAULT);

OCIStmtFetch2

結果セットから行をフェッチする。

構文

sword OCIStmtFetch2 (
    OCIStmt  *stmtp,
    OCLError *errhp,
    ub4      nrows,
    ub2      orientation,
    sb4      fetchOffset,
    ub4      mode
);

パラメータ

stmtp (入力/出力)
文ハンドル
errhp (入力/出力)
エラー・ハンドル
nrows (入力)
現在の位置からフェッチする行数
orientation (入力)
フェッチ方向
OCIStmtFetch2()orientation 引数
意味
OCI_DEFAULT OCI_FETCH_NEXTと同じ
OCI_FETCH_CURRENT 現在行を取得
OCI_FETCH_NEXT 現在位置の次の行を取得
OCI_FETCH_PRIOR 現在行の前の行を取得
OCI_FETCH_FIRST 結果セットの最初の行を取得
OCI_FETCH_LAST 結果セットの最後の行を取得
OCI_FETCH_ABSOLUTE 結果セットの行番号を絶対値で指定して取得
OCI_FETCH_RELATIVE 結果セットの行番号を相対値で指定して取得

orientation 引数に OCI_FETCH_ABSOLUTE または OCI_FETCH_RELATIVE を指定した場合、 fetchOffset パラメータでオフセットを指定する。

fetchOffset (入力)
現在位置を変更するために orientation パラメータと併用するオフセット
mode (入力)
OCI_DEFAULTを指定する。

サンプル・ソースコード

sword ociret;
OCIError *errhp;
OCIStmt *stmtp;

/* 中略 */

while (OCI_SUCCESS == ociret) {
    ociret = OCIStmtFetch2(stmtp, errhp, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT);
}

OCIStmtPrepare

実行するSQL文またはPL/SQL文を準備する。

構文

sword OCIStmtPrepare (
    OCIStmt    *stmtp,
    OCLError   *errhp,
    CONST text *stmt,
    ub4        stmt_len,
    ub4        language,
    ub4        mode
);

パラメータ

OCILogonの引数
Parameter I/O Description
stmtp I 文ハンドル
errhp I エラーハンドル
stmt I 実行されるSQL文またはPL/SQL文
stmt_len I 文の長さ。エンコーディングにより文字数またはバイト数の単位になる。
language I OCI_NTV_SYNTAXを指定する。
mode I OCI_DEFAULTを指定する。

前提条件

あらかじめOCIHandleAlloc関数をコールして、文ハンドルおよびエラー・ハンドルを得ておく必要がある。

サンプル・ソースコード

OCIBindByPosでプレースホルダをバインドする場合の例

sword ociret;
OCIError *errhp;
OCIStmt *stmtp;
char *stmt = "SELECT empno, ename FROM emp WHERE deptno = :1";

/* 中略 */

ociret = OCIStmtPrepare(stmtp, errhp, stmt, strlen(stmt),
    OCI_NTV_SYNTAX, OCI_DEFAULT);

OCIBindByNameでプレースホルダをバインドする場合の例

sword ociret;
OCIError *errhp;
OCIStmt *stmtp;
char *stmt = "SELECT empno, ename FROM emp WHERE deptno = :dept_no";

/* 中略 */

ociret = OCIStmtPrepare(stmtp, errhp, stmt, strlen(stmt),
    OCI_NTV_SYNTAX, OCI_DEFAULT);

OCITransCommit

トランザクションを明示的にコミットする。

構文

sword OCITransCommit (
    OCISvcCtx *svchp,
    OCIError  *errhp,
    ub4       flags
);

パラメータ

svchp (入力)
サービス・コンテキスト・ハンドル
errhp (入力)
エラー・ハンドル
flags (入力)

OCITransRollback

トランザクションをロールバックする。

構文

sword OCITransRollback (
    dvoid    *svchp,
    OCIError *errhp,
    ub4      flags
);