1 OCI: 概要およびアップグレード

この章には次のトピックが含まれます:

OCIの概要

Oracle Call Interface (OCI)はApplication Program Interface (API)の1つで、これを使用すると、関数コールを使用してOracle Databaseにアクセスし、SQL文の実行のすべてのフェーズを制御するアプリケーションを作成できます。

OCIでは、C言語とC++言語のデータ型、コール規則、構文およびセマンティックをサポートします。

OCIは次の機能を備えています。

  • システム・メモリーおよびネットワーク接続の効率的な使用による高度なパフォーマンスおよびスケーラビリティ

  • 2層クライアント/サーバーまたは複数層環境での動的セッションおよびトランザクション管理に適した一貫性のあるインタフェース

  • N層認証

  • Oracle Databaseオブジェクトを使用したアプリケーション開発の包括的サポート

  • Oracle TimesTen In-Memory DatabaseやOracle In-Memory Database Cacheなどの外部データベースへのアクセス。『Oracle TimesTen In-Memory Database C開発者ガイド』を参照してください。

  • ハードウェアへの追加投資をすることなく、ユーザー数および要求数の増加をサポートするアプリケーション

  • Cプログラミング言語と、実行時にアプリケーションにリンクできる動的ランタイム・ライブラリ(OCIライブラリ)の形式で用意された標準的なデータベース・アクセスおよび検索機能のライブラリを使用して、Oracle Database内のデータおよびスキーマを操作する方法。

  • カプセル化された、または不透明なインタフェース(実装の詳細は見えない)

  • ユーザー認証およびパスワード管理の簡易化

  • アプリケーションのパフォーマンスおよび拡張性を向上させる拡張機能

  • トランザクション管理に適した一貫性のあるインタフェース

  • クライアント側からのOracleオブジェクトに対するアクセスをサポートするOCI拡張機能

  • Oracle Databaseへの他のアクセス方法よりも優れた大きな利点:
    • アプリケーション設計のあらゆる側面におけるきめ細かい制御

    • プログラム実行に対する高度な制御

    • 使い慣れた第三世代言語プログラミング手法およびブラウザやデバッガなどのアプリケーション開発ツールの使用

    • スケーラブルなアプリケーション作成を可能にする接続プーリング、セッション・プーリングおよび文キャッシュ

    • 動的SQLのサポート

    • 様々なオペレーティング・システムに対応したOracleプログラム・インタフェースの可用性

    • コールバックを使用した動的バインドおよび定義

    • サーバー・メタデータのレイヤーを公開する記述機能

    • 登録されたクライアント・アプリケーションへの非同期イベント通知

    • 配列の挿入、更新、削除を行うための高度な配列データ操作言語(DML)機能

    • コミット要求の実行への関連付けによるラウンドトリップ回数の削減

    • 透過的プリフェッチ・バッファを使用した問合せの最適化によるラウンドトリップ回数の削減

    • OCIハンドルに対する相互排他ロック(mutex)を不要にするスレッド・セーフティ

    • 多数のユーザーを安全にサポートできるスケーラブルなマルチスレッド・アプリケーションを設計するためのAPI

    • データベース・アクセスの管理、SQL文の処理およびOracle Databaseから取り出したオブジェクトの操作を行うためのSQLアクセス関数

    • Oracle型のデータ属性を操作するためのデータ型マッピングおよび操作関数

    • SQL文を使用せずにデータベースにデータを直接ロードするためのデータ・ロード関数

    • PL/SQLからC言語のコールバックを書き込むための外部プロシージャ関数

OCIアプリケーションの構築

OCIプログラムは非データベース・アプリケーションと同様の方法でコンパイルおよびリンクできます。前処理またはプリコンパイルを実行する必要はありません。

Oracle Databaseでは、一般的なコンパイラの大部分がサポートされます。OCIプログラムのリンクの詳細は、システムによって異なります。一部のオペレーティング・システムでは、OCIプログラムを正常にリンクさせるために、OCIライブラリに加えて他のライブラリの組込みが必要になる場合があります。オペレーティング・システムでのOCIアプリケーションのコンパイルとリンクの詳細は、使用システムに関するOracle Databaseマニュアルとインストレーション・ガイドを参照してください。

OCIの代替方法

OCIの代替方法について説明します。

Oracle Call Interface (OCI)の使用にかわる方法は、次のとおりです。

  • Oracle Database Programming Interface for C (ODPI-C)

  • Oracle C++ Call Interface(OCCI)

  • Oracle Pro*C/C++プリコンパイラ

Oracle Database Programming Interface for C (ODPI-C)

ODPI-Cは、Oracle Databaseドライバおよびユーザー・アプリケーション用の一般的なOracle Call Interface (OCI)機能の使用を容易にするCコードのオープン・ソース・ライブラリです。ODPI-Cは、OCIの上層に位置し、Oracleクライアント・ライブラリを必要とします。ODPI-Cの特徴は次のとおりです。

  • ニッチで特殊なケースのOCI機能を必要としないドライバ・ライターを対象とする簡易な用途に向いています。

  • コードが大幅に少なくなり、ドライバを早く実装できます。Oracle機能がユーザーに対して迅速かつ一貫した方法で公開されます。

  • 変数のバインドとフェッチのためのメモリー管理が簡略化されます。

  • バインドと定義(フェッチ用)が自動的にネイティブなC型に変換されるため、追加のコールを作成する必要がありません。これは、特に数値と日付に便利です。LONGおよびLOB列を文字列やバッファとして取得できる機能も利点となります。

  • リソース・ハンドルを検証する、より安全なAPIが提供されます。キャストは必要ありません。参照のカウント・メカニズムにより、アプリケーションによる使用中のOCIリソースの破壊を抑えることにより、復元力が高まります。

  • 接続およびリソース管理を簡略化するAPIが提供されます。たとえば、高可用性を確保するためにセッション・プールのpingが自動的に実行されます。

  • 属性処理のために複数のgetterおよびsetterモデルを使用するOCIから、代替プログラミング方法が提供されます。

  • 共有ライブラリとしてODPI-CをビルドするサンプルのMakefileが提供されます。または、ODPI-Cのソース・コードをプロジェクトに含め、OCIアプリケーションを構築するようにビルドできます。

関連項目:

Oracle C++ Call Interface(OCCI)

Oracle C++ Call Interface (OCCI)は、C++で記述されたアプリケーションが1台以上のOracle Databaseサーバーと対話するためのアプリケーション・プログラミング・インタフェース(API)です。OCCIによって、SQL文の処理やオブジェクトの操作を含めて、Oracle Databaseサーバーで可能なデータベース操作全体をプログラムから利用できるようになります。

関連項目:

『Oracle C++ Call Interfaceプログラマーズ・ガイド』OCCIの概要に関する項

Oracle Pro*C/C++プリコンパイラ

Oracle Pro*C/C++プリコンパイラとは、高水準ソース・プログラムで埋込みSQL文を使用可能にするプログラミング・ツールです。プリコンパイラは、ソース・プログラムを入力として受け入れ、埋込みSQL文を標準Oracleランタイム・ライブラリ・コールに変換して、通常の方法でコンパイル、リンクおよび実行できる変更済ソース・プログラムを生成します。

関連項目:

『Pro*C/C++プログラマーズ・ガイド』のOracle Pro*C/C++プリコンパイラの概要に関する項

手続き型および非手続き型要素

OCIを使用すると、SQLの非手続き型データ・アクセス機能と、CやC++言語の手続き型機能をあわせ持つ複数層アーキテクチャ上で、スケーラブルなマルチスレッド・アプリケーションを開発できます。

  • 非手続き型言語のプログラムでは、操作対象となる一連のデータが指定されますが、実行する操作の種類や操作の方法は指定されません。SQLは非手続き型であるため、データベース・トランザクションの実行用として簡単に覚えやすく使用しやすい言語です。また、最新のリレーショナル・データベース・システムおよびオブジェクト・リレーショナル・データベース・システムにおけるデータのアクセスおよび操作に使用される標準言語でもあります。

  • 手続き型言語のプログラムでは、大部分の文の実行は、前または後続の文、およびループや条件ブランチなどSQLでは利用できない制御構造に依存しています。手続き型という性質上、このような言語はSQLよりも複雑ですが、柔軟性に富み、非常に強力です。

OCIプログラムでは、非手続き型言語と手続き型言語の要素が組み合されているため、構造化プログラミング環境でOracle Databaseに容易に接続できます。

OCIでは、Oracle Databaseを通じて使用可能なSQLのデータ定義、データ操作、問合せおよびトランザクション制御の機能をすべてサポートしています。たとえば、OCIプログラムでは、Oracle Databaseに対する問合せを実行できます。問合せ文では、次の例のように、入力(バインド)変数を使用して、データベースにデータを渡すようにプログラムに対して指示できます。

SELECT name FROM employees WHERE empno = :empnumber;

前述のSQL文の:empnumberは、アプリケーションが指定する値に対するプレースホルダです。

また、Oracleが開発したSQLの手続き型拡張要素であるPL/SQLも利用できます。PL/SQLにより、SQLのみで作成されたアプリケーションよりも、さらに強力で柔軟性のあるアプリケーションを開発できます。OCIは、データベース内のオブジェクトに対するアクセスおよび操作のための機能も提供します。

オブジェクトのサポート

OCIには、オブジェクト型 オブジェクトを処理する機能があります。

オブジェクト型は、ユーザー定義のデータ構造体で、現実社会の実体を抽象的に表します。たとえば、データベースにperson (個人)というオブジェクトの定義が含まれているとします。このオブジェクトは、個人を識別するための特徴を表した属性first_namelast_nameおよびageを持つことができます。

オブジェクト型の定義は、オブジェクト型のインスタンスを表すオブジェクトの作成の基礎となり、オブジェクト型を構造的な定義として使用することで、personオブジェクトを属性値 'John'、'Bonivento'および'30'で作成できます。オブジェクト型には、メソッド、つまりそのオブジェクト型の動作を表すプログラム関数を含めることもできます。

OCIには、Oracle Database内のオブジェクト処理用にOCIの機能を拡張した関数が組み込まれています。これらの機能には次のものが含まれます。

  • オブジェクト・データとスキーマ情報を操作するSQL文の実行

  • SQL文の入力変数としてオブジェクト参照およびオブジェクトのインスタンスを渡す機能

  • SQL文の出力を受け取る変数として、オブジェクト参照およびオブジェクトのインスタンスの宣言

  • データベースからオブジェクト参照およびオブジェクトのインスタンスのフェッチ

  • オブジェクトのインスタンスと参照を戻すSQL文のプロパティの記述

  • オブジェクト・パラメータまたは結果を指定したPL/SQLプロシージャまたはファンクションの記述

  • オブジェクトとリレーショナル機能を同期化するための、コミット・コールとロールバック・コールの拡張

関連項目:

SQL文

OCIアプリケーションの主なタスクの1つは、SQL文を処理することです。

SQL文の種類が異なると、プログラムでは異なる処理ステップが必要になります。OCIアプリケーションをコーディングする際には、そのことを考慮に入れることが重要です。Oracle Databaseでは、次の種類のSQL文を認識します。

  • データ定義言語 (DDL)

  • 制御文

    • トランザクション制御

    • セッション制御

    • システム制御

  • データ操作言語 (DML)

  • 問合せ

    ノート:

    多くの場合、問合せはDML文として分類されますが、OCIアプリケーションでは異なる方法で問合せを処理するため、ここでは両者を別個に考慮しています。

関連項目:

OCIでのSQL文の使用

データ定義言語

データ定義言語(DDL)文は、データベース内のスキーマ・オブジェクトを管理します。

DDL文は、新規の表を作成し、古い表を削除し、その他のスキーマ・オブジェクトを設定します。また、スキーマ・オブジェクトに対するアクセスを制御します。

表を作成し、その表へのアクセスを指定する例を次に示します。

CREATE TABLE employees
    (name       VARCHAR2(20),
     ssn        VARCHAR2(12),
     empno      NUMBER(6),
     mgr        NUMBER(6),
     salary     NUMBER(6));

GRANT UPDATE, INSERT, DELETE ON employees TO donna;
REVOKE UPDATE ON employees FROM jamie;

DDL文によって、オブジェクト表を作成する次の一連の文のように、Oracle Database内のオブジェクトを操作することもできます。

CREATE TYPE person_t AS OBJECT (
    name     VARCHAR2(30),
    ssn      VARCHAR2(12),
    address  VARCHAR2(50));

CREATE TABLE person_tab OF person_t;
制御文

OCIアプリケーションでは、トランザクション制御文、セッション制御文およびシステム制御文を、それらがDML文であるかのように処理します。

関連項目:

これらの種類の文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください

データ操作言語

データ操作言語(DML)文は、データベース表にあるデータを変更できます。

たとえば、DML文を使用して次の処理を実行します。

  • 表に新しい行を挿入します。

  • 既存の行の列値を更新します。

  • 表から行を削除します。

  • データベース内の表をロックします。

  • SQL文の実行計画を説明します。

  • 入力(バインド)変数を使用して、データベースにデータを渡すようにアプリケーションに対して指示します。

    関連項目:

    入力バインド変数の詳細は、「OCIのプレースホルダのバインドについて」を参照してください

また、DML文ではOracle Database内のオブジェクトを操作でき、次の例では、person_t型のインスタンスがオブジェクト表person_tabに挿入されています。

INSERT INTO person_tab
    VALUES (person_t('Steve May','987-65-4320','146 Winfield Street'));
問合せ

問合せは、データベースからデータを取り出すための文です。

1つの問合せで、0、1行および複数行のデータを戻すことができます。すべての問合せは、次の例のように、SQLキーワードSELECTで始まります。

SELECT dname FROM dept
     WHERE deptno = 42;

問合せは、表の中のデータにアクセスするため、多くの場合DML文として分類されます。ただし、OCIアプリケーションでは問合せの処理方法が異なるため、このマニュアルでは問合せを別個のものとして扱います。

問合せ文では入力(バインド)変数を使用して、データベースにデータを渡すようにプログラムに指示できます。たとえば次のとおりです。

SELECT name 
    FROM employees
    WHERE empno = :empnumber;

前述のSQL文の:empnumberは、アプリケーションが指定する値に対するプレースホルダです。

問合せを処理する際、OCIアプリケーションでは、戻される結果を受け取るための出力変数も定義する必要があります。前述の文では、問合せから戻されるnameの値を受け取るために出力変数を定義する必要があります。

関連項目:

PL/SQL

PL/SQLは、Oracleが開発したSQL言語の手続き型拡張機能です。

PL/SQLは、単純な問合せやSQLデータ操作言語文よりも複雑なタスクを処理します。PL/SQLを使用すると、いくつかの構文を単一のブロックにグループ化し、1つの単位として実行できます。これらには次のものが含まれます。

  • 1つまたは複数のSQL文

  • 変数宣言

  • 代入文

  • プロシージャ型制御文(IF...THEN...ELSE文とループ)

  • 例外処理

OCIプログラムでPL/SQLブロックを使用すると、次の処理を実行できます。

  • Oracle Databaseストアド・プロシージャおよびストアド・ファンクションのコール

  • 手続き型制御文を複数のSQL文と結合し、1つの単位として実行

  • レコード、表、カーソルFORループ、例外処理などの特殊なPL/SQL機能へのアクセス

  • カーソル変数の使用

  • 暗黙的な結果セットを戻す既存のストアド・プロシージャ設計の再利用を可能にする暗黙的な結果セット機能の利用

  • Oracle Database内のオブジェクトへのアクセスおよび操作

次のPL/SQL例では、特定の従業員番号をキーにして、従業員表から値を取り出すSQL文が発行されます。この例は、PL/SQL文でのプレースホルダの使用方法も示しています。

BEGIN
    SELECT ename, sal, comm INTO :emp_name, :salary, :commission
    FROM emp
    WHERE empno = :emp_number;
END;

この文のプレースホルダは、PL/SQL変数ではないことに注意してください。これらは、文の処理時に、データベースに渡される入力値を示しています。これらのプレースホルダは、プログラム内でC言語変数にバインドする必要があります。

関連項目:

埋込みSQL

OCIは、アプリケーションが実行時にデータベースに渡すテキスト文字列としてSQL文を処理します。

Oracleプリコンパイラ(Pro*C/C++、Pro*COBOL、Pro*FORTRAN)を使用することによって、SQL文をアプリケーション・コードに直接埋め込むことができます。その後、実行可能なアプリケーションを生成するために別個のプリコンパイル・ステップが必要です。

OCIコールと埋込みSQLはプリコンパイラ・プログラムでは混在できます。

SQL用のOCIの特殊用語

このマニュアルでは、SQL文の様々な部分を参照するために特殊な用語を使用しています。

たとえば、次のSQL文があるとします。

SELECT customer, address
FROM customers
WHERE bus_type = 'SOFTWARE'
AND sales_volume = :sales;

ここには次の要素があります。

  • SQLコマンド - SELECT

  • 2つの選択リスト項目 - customerおよびaddress

  • FROM句内の表名 - customers

  • WHERE句内の2つの列名 - bus_typeおよびsales_volume

  • WHERE句内のリテラル入力値 - 'SOFTWARE'

  • WHERE句内の入力変数のプレースホルダ - :sales

OCIアプリケーションを開発する際は、プログラムの入出力変数のアドレス(位置)をOracle Databaseに指定しているルーチンをコールします。このマニュアルでは、データ入力用のプレースホルダ変数のアドレスを指定することをバインド操作と呼びます。また、選択リスト項目を受け取るための変数のアドレスを指定することを定義操作と呼びます。

PL/SQLでは、入力の指定も出力の指定もバインド操作と呼びます。

関連項目:

カプセル化されたインタフェース

OCIコールで使用されるすべてのデータ構造は、ハンドルと呼ばれる不透明なインタフェースの形にカプセル化されます。

ハンドルとは、OCIライブラリによって割り当てられる記憶領域を指す不透明なポインタで、SQL文またはPL/SQL文のコンテキスト情報、接続情報、エラー情報またはバインド情報を格納します。クライアントでは、特定の種類のハンドルを割り当て、正しく定義されたインタフェースを通じて1つ以上のハンドルを移入し、それらのハンドルを使用してサーバーに要求を送信します。その結果、アプリケーションは、アクセッサ関数を使用してそのハンドルに含まれている特定の情報にアクセスできます。

OCIライブラリでは、ハンドルの階層が管理されます。これらのハンドルを使用してOCIインタフェースをカプセル化することには、アプリケーション開発者にとって次のような利点があります。

  • 保持する必要があるサーバー側の状態情報が少なくなり、サーバー側のメモリー使用量を削減できます。

  • グローバル変数を使用する必要がなくなること、エラー・レポートを作成しやすくなること、OCI変数のアクセスおよび使用方法に一貫性を保てることにより、生産性が向上します。

  • アプリケーションに影響を与えずに基礎となる構造を変更できます。

ユーザー認証およびパスワード管理の簡易化

OCIでは、アプリケーション開発者が簡易化されたユーザー認証およびパスワード管理を実行できます。

これは次のいくつかの方法でサポートされています。

  • 単一のOCIアプリケーションで、複数のユーザーを認証およびメンテナンスできます。

  • OCIアプリケーションで、ユーザーのパスワードを更新でき、認証の処理でパスワード期限切れのメッセージが戻された場合に特に役立ちます。

OCIでは、次の2種類のログイン・セッションをサポートします。

  • シングル・ユーザーがログイン名とパスワードを使用してデータベースに接続するセッションのための、簡易ログイン関数。

  • ログイン・セッション(ユーザーがOracle Databaseにログインするときに作成されるセッション)をユーザー・セッション(ユーザーが作成したその他すべてのセッション)から分離することにより、単一のOCIアプリケーションで複数のセッションの認証とメンテナンスを行うメカニズム。

SYSDBASYSOPERなどの特権接続もサポートされます。

アプリケーションのパフォーマンスおよび拡張性を向上させる機能

OCIには、アプリケーションのパフォーマンスおよび拡張性を改善する、いくつかの拡張機能があります。

クライアントとサーバー間のラウンドトリップ回数を減らすことにより、アプリケーションのパフォーマンスが改善され、さらにサーバー側で保持する必要がある状態情報の量を減らすことにより拡張性も向上しています。これらの機能には、次のものがあります。

  • 何度も使用される実行可能文をキャッシュすることによってパフォーマンスを向上させる文キャッシュ

  • データベース・サーバーへのラウンドトリップ回数を制限するクライアント結果キャッシュ

  • 記述のラウンドトリップをなくし、ラウンドトリップ回数およびメモリー使用量を削減する、SELECT文結果セットの暗黙的なプリフェッチ

  • オープン・カーソルとクローズ・カーソルのラウンドトリップの排除

  • マルチスレッド環境のサポート

  • 接続上のセッション多重化

  • 標準の2層クライアント/サーバー構成、サーバー/サーバー・トランザクション調整、3層トランザクション処理(TP)モニター構成など、様々な構成に対する一貫したサポート

  • XAインタフェースのTM_JOIN操作のサポートを含む、ローカル・トランザクションおよびグローバル・トランザクションに対する一貫したサポート

  • 接続中のユーザー接続、処理およびセッションを集結する機能を提供し、グローバル・トランザクションのブランチごとに個別のセッションを作成する必要性をなくしたことによる、拡張性の向上

  • アプリケーションによる複数のユーザーの認証、および複数のユーザーのためのトランザクションの開始

OCIによるオブジェクトのサポート

OCIは、Oracle Databaseのオブジェクト機能を使用するプログラマに、包括的なアプリケーション・プログラミング・インタフェースを提供します。

その機能は、次の主要なカテゴリに分類できます。

クライアント側のオブジェクト・キャッシュ

オブジェクト・キャッシュは、オブジェクトの参照とメモリー管理をサポートするクライアント側のメモリー・バッファです。

オブジェクト・キャッシュは、OCIアプリケーションがサーバーからクライアント側にフェッチしたオブジェクト・インスタンスを格納し、追跡します。オブジェクト・キャッシュは、OCI環境を初期化するときに作成されます。同じサーバーに対して複数のアプリケーションを実行する際には、それぞれに専用のオブジェクト・キャッシュがあります。オブジェクト・キャッシュは、メモリーに現在あるオブジェクトの追跡、オブジェクトへの参照のメンテナンス、自動オブジェクト・スワッピングの管理、オブジェクトのメタ属性または型情報の追跡を行います。また、オブジェクト・キャッシュには、OCIアプリケーションに対する次の機能が備えられています。

  • オブジェクトのフェッチおよび操作に必要なクライアント/サーバー間のラウンドトリップ回数の削減によるアプリケーションのパフォーマンスの改善

  • クライアント側のキャッシュからのオブジェクト・スワッピングのサポートによる拡張性の向上

  • オブジェクト・レベルのロックのサポートによる同時実行性の向上

アソシエイティブ・インタフェースおよびナビゲーショナル・インタフェース

OCIアプリケーションからオブジェクトにアクセスする際に使用できる様々なタイプのインタフェースについて説明します。

OCIを使用したアプリケーションでは、次のような様々な種類のインタフェースを介して、Oracle Database内のオブジェクトにアクセスできます。

  • SQLのSELECT文、INSERT文およびUPDATE文の使用

  • 対応するスマート・ポインタまたはREFを横断することによりクライアント側のキャッシュ内のオブジェクトにアクセスする、Cスタイルのポインタ追跡スキームの使用

OCIは、SQLのSELECTINSERTおよびUPDATE文を使用したオブジェクトの操作をサポートするための一連の拡張子付き関数を提供します。Oracle Databaseオブジェクトにアクセスする場合、これらのSQL文では、リレーショナル表にアクセスするような一貫した一連のステップが使用されます。また、OCIには、オブジェクトにアクセスするのに必要な次の関数セットも用意されています。

  • オブジェクト型のインスタンスと参照をSQL文の入出力変数としてバインドおよび定義します。

  • オブジェクト型のインスタンスと参照を含むSQL文を実行します。

  • オブジェクト型のインスタンスと参照をフェッチします。

  • Oracleオブジェクト型の選択リスト項目を記述します。

OCIでは、対応するスマート・ポインタまたはREFを横断することにより、クライアント側のキャッシュ内にフェッチされているオブジェクトに、Cスタイルのポインタ追跡スキームを使用してアクセスする一連の関数も提供しています。このナビゲーショナル・インタフェースでは、関数が次の目的で使用されます。

  • 参照可能な永続オブジェクト(つまり、クライアント側のキャッシュ内のオブジェクトIDを持つ永続オブジェクト)のコピーをスマート・ポインタまたはREF確保することによりインスタンス化します。

  • あるオブジェクトから別のオブジェクトを指し示すREFを横断することにより、お互いに接続されているオブジェクトの順序を横断します。

  • オブジェクト属性の値を動的に取得し、設定します。

オブジェクト用のOCIランタイム環境

OCIでは、Oracle Databaseオブジェクトのクライアント側での使用方法を管理するオブジェクト用の関数を提供します。

これらの関数は、次の目的で使用されます。

  • セッションの初期化、データベース・サーバーへのログイン、接続の登録などのオブジェクト機能にアクセスするための、Oracle Databaseサーバーへの接続

  • クライアント側のオブジェクト・キャッシュの設定およびそのパラメータのチューニング

  • エラーおよび警告メッセージの取得

  • データベース内のオブジェクトにアクセスするトランザクションの制御

  • SQLによるオブジェクトへの結合アクセス

  • パラメータまたは結果がOracle型であるPL/SQLプロシージャまたはファンクションの記述

型管理: マッピングおよび操作関数

OCIでは、Oracle Databaseオブジェクトを操作するための2つの関数セットを提供します。

  • 型マッピング関数を使用すると、アプリケーションで、Oracle内部データ型としてサーバーで表されているOracleスキーマの属性を、対応するホスト言語型にマップできます。

  • 型操作関数を使用すると、ホスト言語のアプリケーションで、Oracleスキーマの個別の属性を操作できます。属性の値を設定および取得したりサーバーにフラッシュできます。

また、OCIDescribeAny()関数を使用すると、データベース内に格納されたオブジェクトの情報を取得できます。

Object Type Translator

Object Type Translator (OTT)ユーティリティは、Oracleオブジェクト型に関するスキーマ情報を、ホスト言語変数のクライアント側言語バインディングに翻訳します(構造など)。

OTTは、Oracleスキーマ・オブジェクトに関するメタデータ情報を含むintypeファイルを入力として使用します。また、outtypeファイル、ヘッダー・ファイルおよび実装ファイルを生成します。これらは、オブジェクト・スキーマに対して実行されるC言語アプリケーションに含まれている必要があります。OCIアプリケーションとPro*C/C++プリコンパイラ・アプリケーションの両方に、OTTが生成したコードが含まれている場合があります。次の理由により、OTTは非常に便利です。

  • アプリケーション開発者の生産性が向上します。OTTを使用すると、アプリケーション開発者はスキーマ・オブジェクトに対応するホスト言語変数をコーディングする必要がなくなります。

  • SQLを、選択したデータ定義言語としてメンテナンスします。OTTでは、SQLを使用して作成したOracleスキーマ・オブジェクトをホスト言語変数に自動的にマップできるため、SQLがデータ定義言語として使用しやすくなります。その結果、Oracle Databaseによって、データの一貫したモデルをサポートできます。

  • オブジェクト型のスキーマ展開を容易にします。OTTでは、スキーマが変更されたときにインクルードされたヘッダー・ファイルを再生成できるため、Oracleアプリケーションでスキーマ展開をサポートできます。

通常、OTTは、コマンドラインからintypeファイル、outtypeファイルおよび特定のデータベース接続を指定することにより起動されます。Oracle Databaseでは、OTTにより、OCIプログラムとPro*C/C++プリコンパイラ・プログラムのどちらでも使用できるC構造体のみを生成できます。

OCIでのOracle Streams Advanced Queuingのサポート

OCIでは、Oracle Streams Advanced Queuing (Streams AQ)機能へのインタフェースを提供します。

Streams AQは、Oracle Databaseと統合されたメッセージ・キューイングです。Streams AQでは、キューイング・システムをデータベースに統合することによりこの機能を実現しており、その結果メッセージ対応データベースが作成されます。Streams AQでは、統合されたソリューションを提供することにより、開発者がメッセージ交換インフラストラクチャを構築する必要をなくし、特定のビジネス・ロジックに専念できるようにします。

XAライブラリ・サポート

OCIは、Oracle XAライブラリをサポートしています。

xa.hヘッダー・ファイルは、他のすべてのOCIヘッダー・ファイルと同じ場所にあります。LinuxまたはUNIXの場合、パスは$ORACLE_HOME/rdbms/publicです。LinuxまたはUNIXでdemo_rdbms.mkファイルを使用しているユーザーが影響を受けないのは、$ORACLE_HOME/rdbms/publicディレクトリがすでにこのMakefileに記載されているためです。

Windowsの場合、パスはORACLE_BASE\ORACLE_HOME\oci\includeです。

関連項目:

互換性およびアップグレードについて

OCIクライアントとサーバーの異なるリリース間の互換性に関する問題について説明します。OCIライブラリ・ルーチンの変更点について説明します。リリース7から現行リリースにアップグレードする際の懸念事項について説明します。

次の各項では、異なるリリースのOCIクライアントとサーバー間での互換性の問題、OCIライブラリ・ルーチンの変更点およびOCIリリース7.xからこのリリースのOCIへのアプリケーションのアップグレードについて説明します。

静的にリンクされたアプリケーションと動的にリンクされたアプリケーションのバージョンの互換性

新規リリースで再リンクする場合の規則について説明します。

次に、新規リリースで再リンクする場合の規則を示します。

  • 静的にリンクされたOCIアプリケーションの場合:

    静的にリンクされたOCIアプリケーションが、メジャー・リリース番号とマイナー・リリース番号の両方について再リンクする必要があるのは、Oracle Databaseのクライアント側のライブラリ・コードが、アップグレードされたOracleホーム内のエラー・メッセージと互換性がないためです。たとえば、エラー・メッセージが追加パラメータで更新された場合、そのエラー・メッセージは、静的にリンクされたコードとは互換性がなくなります。

  • 動的にリンクされたOCIアプリケーションの場合:

    Oracle Database 10g以降のリリースの動的にリンクされたOCIアプリケーションは、再リンクする必要はありません。つまり、Oracle Databaseのクライアント側の動的ライブラリには、以前のバージョンのライブラリに対して上位互換性があります。Oracle Universal Installerによって前のバージョンのライブラリへのシンボリック・リンクが作成され、このシンボリック・リンクが現行バージョンのライブラリに解決されます。したがって、以前のバージョンのOracle Databaseのクライアント側動的ライブラリと動的にリンクされたアプリケーションは、現行バージョンのOracle Databaseのクライアント側ライブラリで動作するために再リンクする必要はありません。

    ノート:

    アプリケーションがランタイム・ライブラリ検索パス(Linuxの-rpathなど)とリンクされている場合、アプリケーションはリンクされているOracle Databaseのクライアント側ライブラリのバージョンでまだ動作する可能性があります。現行バージョンのOracle Databaseのクライアント側ライブラリで動作するためには、再リンクする必要があります。

    関連項目:

既存のOCIリリース7アプリケーションのアップグレードについて

OCIでは、OCIリリース7以降の多くの機能が大幅に改善されました。

OCIリリース7.3 APIを使用していたアプリケーションは、現行リリースのOracle Databaseに対して通常どおり動作します。これらのアプリケーションは、現行のクライアント・ライブラリにリンクする必要があります。ただし、OCIリリース7.3 APIは非推奨となり、このオプションはOracleの今後のリリースでは使用できなくなりました。

OCIリリース7.xおよびこのリリースのOCIのコールは、同じ文の実行で混在させないかぎり、同一アプリケーションおよび同一トランザクション内で使用できます。このため、既存のOCIバージョン7のアプリケーションを移行する場合は、次の2つの方法があります。

  • 現行のOCIクライアントにアップグレードしますが、アプリケーションは修正しません。Oracleリリース7 OCIクライアントから現行リリースのOCIクライアントにアップグレードする場合は、新規バージョンのOCIライブラリにリンクするだけでよく、アプリケーションを再コンパイルする必要はありません。再リンクしたOracle Databaseリリース7のOCIアプリケーションは、現行Oracle Databaseに対して通常どおり動作します。このオプションは非推奨となり、Oracleの今後のリリースでは使用できなくなりました。

  • 現行のOCIクライアントにアップグレードして、アプリケーションを修正します。ただし、新しいOCIで提供されるパフォーマンスと拡張性の利点を活用するには、新しいOCIプログラミング・パラダイムを使用できるように既存のアプリケーションを修正し、そのアプリケーションを再作成して現行のOCIライブラリに再リンクし、現行リリースのOracle Databaseに対して実行する必要があります。

現行リリースのOracle Databaseのオブジェクト機能を使用する必要がある場合は、クライアントを現行リリースのOCIにアップグレードする必要があります。

ノート:

デフォルトでは、バージョン7のAPIを使用するアプリケーションをOracle Database 12cに接続できなくなります。このアプリケーションをOracle Database 12cに接続するには、sqlnet.allowed_logon_version8に設定する必要があります。

Oracle Database 12cリリース2 (12.2)では、Oracle Databaseによってサポートされる識別子の長さが、30バイトから128バイトに増加しました。このデータベースの変更に伴い、非推奨のV7 API odessp()を使用するOCIアプリケーションは、状況に応じて変更する必要があります。odessp()の引数argnamで、アプリケーションは、長さ128バイト(以前は30バイト)の識別子を格納できる2次元配列を渡す必要があります。

UPI API upidpr()を使用するアプリケーションも、Oracle Database 12cリリース2 (12.2)の長い識別子に基づき、状況に応じて変更する必要があります。upidpr()の引数argument_nameで、アプリケーションは、長さ128バイト(以前は30バイト)の識別子を格納できる2次元配列を渡す必要があります。

関連項目:

「Oracle 7ドキュメント」のOracle7 Server Call Interfaceプログラマーズ・ガイド。

使用されなくなったOCIルーチン

OCIリリース8.0では、リリース7.3で利用できなかった新しい関数セットを導入しました。

パフォーマンスを向上し、機能性を高めるために、新しいアプリケーションで新しいコールを使用することをお薦めします。Oracleの今後のリリースでは、リリース7.3のAPIはサポートされません。

表1-1は、リリース7.xのOCIコールおよび以降のリリースでの等価コールのリストです。OCIコールの詳細は、このマニュアルの関数の説明を参照してください。リリース7.xコールの詳細は、『Oracle Call Interfaceプログラマーズ・ガイド リリース7.3』を参照してください。

ノート:

多くの場合、新規または現行のOCIルーチンはリリース7.xのルーチンに直接マッピングを行わないため、関数コールとパラメータ・リストを単純に別のものに置き換えることがほとんどできない場合があります。この場合、新規または現行のコールを作成する前後に、追加のプログラム・ロジックが必要になります。詳細は、このマニュアルの残りの章、特に「OCIプログラミングの基本」を参照してください。

表1-1 使用されなくなったOCI関数

7.xのOCIルーチン 以降のリリースでの等価または類似のOCIルーチン

obindps()、obndra()、obndrn()、obndrv()

OCIBindByName()またはOCIBindByName2()OCIBindByPos()またはOCIBindByPos2() (ノート: 一部のデータ型には追加のバインド・コールが必要です)

obreak()

OCIBreak()

ocan()

なし

oclose()

ノート: リリース8.x以降では、カーソルは使用されていません。

ocof()、ocon()

OCI_COMMIT_ON_SUCCESSモードでのOCIStmtExecute()

ocom()

OCITransCommit()

odefin()、odefinps()

OCIDefineByPos()またはOCIDefineByPos2() (ノート: 一部のデータ型には追加の定義コールが必要です)

odescr()

ノート: スキーマ・オブジェクトはOCIDescribeAny()で記述されます。通常、記述は、リリース7.xで使用されているように、SQL文の実行後にOCIAttrGet()を文ハンドルでコールすることにより行われます。

odessp()

OCIDescribeAny()

oerhms()

OCIErrorGet()

oexec()、oexn()

OCIStmtExecute()

oexfet()

OCIStmtExecute()OCIStmtFetch2() (ノート: 結果セット行は暗黙的にプリフェッチできます)

ofen()ofetch()

OCIStmtFetch2()

oflng()

なし

ogetpi()

OCIStmtGetPieceInfo()

olog()

OCILogon()またはOCILogon2()

ologof()

OCILogoff()

onbclr()、onbset()、onbtst()

ノート: 非ブロック化モードは、OCIAttrSet()またはOCIAttrGet()をサーバー・コンテキスト・ハンドルまたはサービス・コンテキスト・ハンドルでコールすることにより、設定またはチェックすることができます。

oopen()

ノート: リリース8.x以上では、カーソルは使用されていません。

oopt()

なし

oparse()

OCIStmtPrepare2()。ただし、すべてローカル

opinit()

OCIEnvCreate()

orol()

OCITransRollback()

osetpi()

OCIStmtSetPieceInfo()

sqlld2()

SQLSvcCtxGetまたはSQLEnvGet

sqllda()

SQLSvcCtxGetまたはSQLEnvGet

odsc()

ノート: 前述のodescr()を参照してください。

oermsg()

OCIErrorGet()

olon()

OCILogon()

orlon()

OCILogon()

oname()

ノート: 前述のodescr()を参照してください。

osql3()

ノート: 前述のoparse()を参照してください。

ノート:

size_tを使用してOCI 7コールに渡されるホスト領域(hda)を定義するアプリケーションは、一部のプラットフォームで不揃いのデータのためにクラッシュする場合があります。その場合は、size_tのかわりにHda_Defを使用する必要があります。アプリケーションを修正できない場合は、SPARCプラットフォームでコンパイラとリンカー・フラグのmisalignを使用できます。詳細は、デモおよびSun Studio 12: C++ユーザーズ・ガイドのA.2.53 -misalignを参照してください。

関連項目:

  • 新規または現行のコールの実行前後に必要になる場合がある追加のプログラム・ロジックの詳細は、「OCIプログラミングの基本」を参照してください。

サポートされないOCIルーチン

OCIの以前のバージョンで使用可能だったOCIルーチンの一部は、現行リリースではサポートされません。

それらは表1-2に記載されています。

表1-2 サポートされないOCI関数

OCIルーチン 以降のリリースでの等価または類似のOCIルーチン

obind()

OCIBindByName()OCIBindByPos() (ノート: 一部のデータ型には追加のバインド・コールが必要です。)

obindn()

OCIBindByName()OCIBindByPos() (ノート: 一部のデータ型には追加のバインド・コールが必要です。)

odfinn()

OCIDefineByPos() (ノート: 一部のデータ型には追加の定義コールが必要です。)

odsrbn()

ノート: 表1-1odescr()を参照してください。

ologon()

OCILogon()

osql()

ノート: 表1-1oparse()を参照してください。