プライマリ・コンテンツに移動
Oracle® Call Interfaceプログラマーズ・ガイド
12c リリース1 (12.1)
B72465-07
目次へ移動
目次
索引へ移動
索引

前
次

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

この章は、次の項目で構成されています。

OCIの概要

Oracle Call Interface (OCI)はApplication Program Interface (API)の1つで、これを使用すると、関数コールを使用してOracle Databaseにアクセスし、SQL文の実行のすべてのフェーズを制御するアプリケーションを作成できます。OCIでは、C言語とC++言語のデータ型、コール規則、構文およびセマンティックをサポートします。

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

  • システム・メモリーおよびネットワーク接続の効率的な使用によるパフォーマンスと拡張性の向上

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

  • N層認証

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

  • 外部データベースへの接続

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

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

OCIを使用して、Oracle TimesTen In-Memory DatabaseおよびOracle In-Memory Database Cacheにアクセスできます。『Oracle TimesTen In-Memory Database C開発者ガイド』を参照してください

OCIは多くの新機能を備えており、主に次のように分類できます。

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

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

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

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

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

OCIの利点

Oracle Databaseに接続する場合、OCIには次のような他の方法よりも大きな利点があります。

  • アプリケーション設計のあらゆる側面におけるきめ細かい制御

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

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

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

  • 動的SQLのサポート

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

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

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

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

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

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

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

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

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の分類

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

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

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

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

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

  • PL/SQLから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コールの詳細は、「カプセル化されたインタフェース」を参照してください

  • 『Oracle Database概要』

  • Oracle Databaseオブジェクト・リレーショナル開発者ガイド

SQL文

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

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

  • データ定義言語 (DDL)

  • 制御文

    • トランザクション制御

    • セッション制御

    • システム制御

  • データ操作言語 (DML)

  • 問合せ

    注意:

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

データ定義言語

データ定義言語(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はプリコンパイラ・プログラムでは混在できます。

関連項目:

『Pro*C/C++プログラマーズ・ガイド』

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を使用したアプリケーションでは、次のような様々な種類のインタフェースを介して、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です。

関連項目:

  • WindowsおよびXAアプリケーションの詳細は、「Oracle XAライブラリ」を参照してください

  • Oracle XAによるアプリケーションの開発の詳細は、『Oracle Database開発ガイド』を参照してください

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

次の各項では、異なるリリースの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のクライアント側ライブラリで動作するためには、再リンクする必要があります。

    関連項目:

    • 互換性およびアップグレードの詳細は、『Oracle Databaseアップグレード・ガイド』 を参照してください

    • 現在サポートされているサーバー・バージョンは、My Oracle Supportのドキュメント207303.1に記載されています

      .

既存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に設定する必要があります。

使用されなくなった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()OCIBindByPos() (注意: 一部のデータ型には追加のバインド・コールが必要です。)

obreak()

OCIBreak()

ocan()

なし

oclose()

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

ocof()、ocon()

OCI_COMMIT_ON_SUCCESSモードでのOCIStmtExecute()

ocom()

OCITransCommit()

odefin()、odefinps()

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

odescr()

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

odessp()

OCIDescribeAny()

oerhms()

OCIErrorGet()

oexec()、oexn()

OCIStmtExecute()

oexfet()

OCIStmtExecute()OCIStmtFetch() (注意: 結果セット行は暗黙的にプリフェッチできます。)

ofen()ofetch()

OCIStmtFetch()

oflng()

なし

ogetpi()

OCIStmtGetPieceInfo()

olog()

OCILogon()

ologof()

OCILogoff()

onbclr()、onbset()、onbtst()

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

oopen()

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

oopt()

なし

oparse()

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

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を使用できます。詳細は、デモおよびhttp://docs.oracle.com/cd/E19205-01/819-5267/bkauj/index.htmlのドキュメントを参照してください。

サポートされない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()を参照してください。

OCI Instant Client

Instant Client機能により、クライアント・マシン上でOracleホームの必要がなくなることで、OCI、OCCI、ODBCおよびJDBC OCIに基づくカスタマ・アプリケーションのデプロイが簡略化されます。Instant Clientモードで実行されるOCIアプリケーションの記憶領域の所要量は、クライアント側の完全インストールで実行される同じアプリケーションに比べて、大幅に少なくなります。Instant Client共有ライブラリは、クライアント側の完全インストールのディスク領域のうち、4分の1のみを使用します。

READMEは、Instant Clientインストールに付属しています。このファイルには、Instant Clientが生成されたバージョン、日時およびオペレーティング・システムが記載されています。

表1-3に、OCIアプリケーションのデプロイに必要なOracle Databaseのクライアント側ファイルを示します。

表1-3 OCI Instant Client共有ライブラリ

LinuxおよびUNIX LinuxおよびUNIXでの説明 Microsoft Windows Microsoft Windowsでの説明

libclntsh.so.12.1

libclntshcore.so.12.1

クライアント・コード・ライブラリ

oci.dll

アプリケーションがリンクする転送機能

libociei.so脚注 1

OCI Instant Clientデータの共有ライブラリ

oraociei12.dll

データとコード

libnnz12.so

セキュリティ・ライブラリ

orannzsbb12.dll

セキュリティ・ライブラリ

libons.so

ONSライブラリ

oraons.dll

OCIによって内部的に使用されるONSライブラリ

NA脚注 2

NA脚注 2

oci.symoraociei12.symorannzsbb12.sym

記号表

脚注 1

Oracle Database 12cリリース1 (12.1)より、libclntshcore.so.12.1libclntsh.so.12.1およびデータ共有ライブラリから分離されました。libclntsh.so.12.1、libclntshcore.so.12.1およびlibociei.soがインスタント・クライアント・モードで動作するようにするには、これらが同じディレクトリ内に存在する必要があります。

脚注 2

NAは適用されないことを意味します。

動的リンク・ライブラリ(DLL)ごとに1つの.symファイルが提供されます。.symがDLLと同じ場所にある場合、WindowsでOCIに障害が発生した際に、関数名を含むスタック・トレースが生成されます。

この表では、Oracle Database 12cリリース1 (12.1)のライブラリ名を使用しています。

Microsoft ODBCおよびOLEDBドライバを使用するには、ociw32.dllORACLE_HOME\binディレクトリからコピーする必要があります。

Instant Clientの利点

Instant Clientを使用するのはなぜか。

  • インストールの際にコピーされるファイルの数が少なくてすみます。

  • Oracle Databaseのクライアント側で必要なファイル数およびディスク領域の合計が、大幅に少なくなります。

  • Instant Clientモードでデプロイされたアプリケーションで、機能またはパフォーマンスが損なわれることはありません。

  • 独立したソフトウェア・ベンダーは、アプリケーションを簡単にパッケージ化できます。

OCI Instant Clientのインストール

Instant Clientライブラリは、Oracle Universal InstallerからInstant Clientオプションを選択するか、次のOracle Technology NetworkのWebサイトのOCIページ(OCIページの下部にあるInstant Clientのリンク)からInstant Clientライブラリをダウンロードしてインストールするかのいずれかでインストールできます。

http://www.oracle.com/technology/tech/oci/instantclient/index.html

Oracle Technology NetworkのWebサイトからInstant Clientライブラリをダウンロードしてインストールするには、次のようにします。

  1. Instant Client共有ライブラリをOracle Database 12cリリース1 (12.1)用の空のディレクトリ(instantclient_12_1など)にダウンロードし、インストールします。基本パッケージを選択します。

  2. オペレーティング・システム共有ライブラリ・パス環境変数を、手順1のディレクトリに設定します。たとえば、LinuxまたはUNIXでは、LD_LIBRARY_PATHinstantclient_12_1ディレクトリに設定します。Windowsでは、PATHinstantclient_12_1ディレクトリに設定します。

  3. 必要ならば、NLS_LANG環境変数を設定して、クライアント・アプリケーションとそのアプリケーションでオープンされたデータベース接続で使用される言語と地域、およびクライアントのキャラクタ・セット(クライアント・プログラムで入力または表示されるデータ用のキャラクタ・セット)を指定します。NLS_LANGは、UNIXプラットフォームでは環境変数として設定され、Windowsプラットフォームではレジストリで設定されます。NLS_LANG環境変数設定の詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。

前述の手順を完了すると、OCIアプリケーションを実行できるようになります。

オペレーティング・システムのライブラリ・パス変数によってOCI共有ライブラリにアクセスできる場合、OCIアプリケーションは、Instant Clientモードで動作します。このモードでは、Oracleホームへの依存性はなく、Oracleホームに指定された他のコードおよびデータファイルは、OCIでは不要です(後で説明するtnsnames.oraファイルを除きます)。

Oracle Universal InstallerからInstant Clientをインストールするには、次のようにします。

  1. Oracle Universal Installerを起動し、Instant Clientオプションを選択します。
  2. Instant Client共有ライブラリをOracle Database 12cリリース1 (12.1)用の空のディレクトリ(instantclient_12_1など)にインストールします。
  3. LD_LIBRARY_PATHをインスタント・クライアント・モードで動作するようにインスタント・クライアント・ディレクトリに設定します。
  4. 必要ならば、NLS_LANG環境変数を設定して、クライアント・アプリケーションとそのアプリケーションでオープンされたデータベース接続で使用される言語と地域、およびクライアントのキャラクタ・セット(クライアント・プログラムで入力または表示されるデータ用のキャラクタ・セット)を指定します。NLS_LANGは、UNIXプラットフォームでは環境変数として設定され、Windowsプラットフォームではレジストリで設定されます。NLS_LANG環境変数設定の詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。

クライアントの完全インストールを行った場合(Oracle Universal InstallerでAdminオプションを選択)、Instant Client共有ライブラリもインストールされます。クライアントの完全インストールにおけるInstant Client共有ライブラリの場所は、次のとおりです。

LinuxまたはUNIXの場合:

libociei.soライブラリは、$ORACLE_HOME/instantclientにあります。

libclntsh.so.12.1libclntshcore.so.12.1およびlibnnz12.soは、$ORACLE_HOME/libにあります。

Windowsの場合:

oraociei12.dllライブラリは、ORACLE_HOME¥instantclientにあります。

oci.dllociw32.dllおよびorannzsbb12.dllは、ORACLE_HOME¥binにあります。

OCIアプリケーションをInstant Clientモードで実行できるようするには、前述のライブラリを別のディレクトリにコピーして、オペレーティング・システム共有ライブラリ・パスをこのディレクトリがある場所に設定します。

注意:

すべてのライブラリを同じOracleホームからコピーして、同じディレクトリに配置する必要があります。Instant Clientライブラリへのsymlinkの関連付けは、ライブラリの物理的な関連付けに代わるものではありません。

オペレーティング・システムのLibrary Path変数に存在するOracleライブラリは1セットのみである必要があります。つまり、Instant Clientライブラリを含むディレクトリが複数ある場合、それらのディレクトリの1つのみをオペレーティング・システムのLibrary Path上に記載する必要があります。

同様に、Oracleホームベースのインストールを同じシステムに行う場合、オペレーティング・システムのLibrary PathにORACLE_HOME/libとInstant Clientディレクトリの両方を記載しないでください(Library Path上での順序も無関係です)。つまり、オペレーティング・システムのLibrary Path変数には、ORACLE_HOME/libディレクトリ(非Instant Clientモードで操作する場合)またはInstant Clientディレクトリ(Instant Clientモードで操作する場合)のいずれかを記載します。

OCCIやJDBC OCIなどのその他の機能を有効にするには、いくつかの追加ファイルをコピーする必要があります。OCCIを有効にするには、OCCIライブラリ(LinuxまたはUNIXではlibocci.so.12.1、Windowsではoraocci12.dll)をInstant Clientディレクトリにインストールする必要があります。JDBC OCIドライバの場合、3つのOCI共有ライブラリ以外に、OCI JDBCライブラリ(LinuxまたはUNIXではlibocijdbc12.so、Windowsではocijdbc12.dllなど)もダウンロードする必要があります。すべてのライブラリをInstant Clientディレクトリに配置します。

注意:

Sparc64などのハイブリッド・プラットフォームでは、JDBC OCIドライバをInstant Clientモードで動作させるために、libociei.soライブラリをORACLE_HOME/instantclient32ディレクトリからInstant Clientディレクトリにコピーします。JDBC OCI Instant Clientに必要なその他すべてのSparc64ライブラリを、ORACLE_HOME/lib32ディレクトリからInstant Clientディレクトリにコピーします。

Instant Clientを使用する場合

Instant Clientは、デプロイメントの選択対象であり、本番アプリケーションの実行に使用できます。

一般的に、Instant Clientがクライアント側の動作専用でないかぎり、Instant Clientを使用して実行されているアプリケーションではすべてのOCI機能を使用できます。したがって、サーバー側の外部プロシージャは、Instant Clientライブラリを使用できません。

開発には、Instant Client SDKを使用することもできます。

LinuxまたはUNIXでのInstant Client共有ライブラリへのパッチの適用について

Instant Clientはデプロイメント用の機能であるため、OCIアプリケーションの実行に必要なファイルの数およびサイズ(クライアント・フットプリント)が減らされました。

したがって、Instant Client共有ライブラリにパッチを適用するために必要なファイルは、Instant Clientのデプロイメントですべて入手できるわけではありません。パッチの適用には、Oracleホームをベースとした完全なクライアント・インストールが必要です。パッチを適用するには、opatchユーティリティを使用します。

Oracleホーム環境にパッチを適用した後、「OCI Instant Clientのインストール」の説明に従って、OCI Instant ClientにリストされているファイルをInstant Clientディレクトリにコピーします。

個々のファイルをコピーするかわりに、「データ共有ライブラリ、zipおよびRPMファイルの再生成」の説明に従って、OCIとOCCI、JDBCおよびSQL*Plus用のInstant Client zipおよびRPMファイルを生成できます。次に、「OCI Instant Clientのインストール」の説明に従って、zipおよびRPMファイルをターゲット・システムにコピーして解凍できます。

opatchユーティリティによって、ORACLE_HOMEインストールのパッチ適用情報がlibclntsh.soに格納されます。この情報を取り出すには、次のコマンドを使用します。

genezi -v

Instant Clientのデプロイメント・システムにgeneziユーティリティがない場合、ORACLE_HOME/binディレクトリからそれをコピーできます。

注意:

opatchユーティリティは、Windowsでは使用できません。

データ共有ライブラリ、zipおよびRPMファイルの再生成

データ共有ライブラリとzipおよびRPMファイルを再生成するプロセスは、Oracle Database 12cリリース1 (12.1)以上用に変わりました。データ共有ライブラリ、zipおおよびRPMファイルを作成するために、別々のターゲットが個々にまたは一度に追加されます。以前のリリースでは、データ共有ライブラリ、zipおよびRPMファイルの作成のために、1つのターゲットilibocieiが提供されました。ilibocieiでは、zipおよびRPMファイルのみが作成されるようになりました。データ共有ライブラリの再生成には、コンパイラとリンカーの両方が必要で、これらはすべてのインストールで使用可能というわけではありません。したがって、データ共有ライブラリの再生成のために、別々のターゲットが追加されています。

注意:

再生成されたInstant Clientバイナリには、再生成を行ったOracle Client AdministratorホームでインストールされたInstant Clientファイルのみが含まれます。そのため、再生成環境に存在するエラー・メッセージ、キャラクタ・セット・エンコーディングおよびタイムゾーン・ファイルは、データ共有ライブラリにパッケージされているもののみです。エラー・メッセージ、キャラクタセット・エンコーディングおよびタイムゾーン・ファイルは、Oracle Client Administratorホームのインストールで選択された各国語に依存します。

データ共有ライブラリlibociei.soの再生成

OCI Instant Clientデータ共有ライブラリ(libociei.so)は、ORACLE_HOMEの管理者インストールで次のコマンドを使用することで再生成できます。

cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk igenlibociei

新しく再生成されたlibociei.soは、ORACLE_HOME/instantclientディレクトリに置かれます。同じディレクトリにある元の既存のlibociei.soは、libociei.so0に名前が変更されます。

データ共有ライブラリlibociicus.soの再生成

Instant Client Lightデータ共有ライブラリ(libociicus.so)を再生成するには、次のコマンドを使用します。

mkdir -p $ORACLE_HOME/rdbms/install/instantclient/light
cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk igenlibociicus

新しく再生成されたlibociicus.soは、ORACLE_HOME/instantclient/lightディレクトリに置かれます。同じディレクトリにある元の既存のlibociicus.soは、libociicus.so0に名前が変更されます。

データ共有ライブラリlibociei.soおよびlibociicus.soの同時再生成

データ共有ライブラリlibociei.soとlibociicus.soを再生成するには、次のコマンドを使用します。

mkdir -p $ORACLE_HOME/rdbms/install/instantclient/light
cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk igenliboci

新しく再生成されたlibociei.soは、ORACLE_HOME/instantclientディレクトリに置かれます。同じディレクトリにある元の既存のlibociei.soは、libociei.so0に名前が変更されます。

新しく再生成されたlibociicus.soは、ORACLE_HOME/instantclient/lightディレクトリに置かれます。同じディレクトリにある元の既存のlibociicus.soは、libociicus.so0に名前が変更されます。

基本パッケージ用のzipおよびRPMファイルの再生成

基本パッケージ用にzipおよびRPMファイルを再生成するには、次のコマンドを使用します。

cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk ic_basic_zip

基本軽量パッケージ用のzipおよびRPMファイルの再生成

基本軽量パッケージ用にzipおよびRPMファイルを再生成するには、次のコマンドを使用します。

cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk ic_basiclite_zip

JDBCパッケージ用のzipおよびRPMファイルの再生成

JDBCパッケージ用にzipおよびRPMファイルを再生成するには、次のコマンドを使用します。

cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk ic_jdbc_zip

ODBCパッケージ用のzipおよびRPMファイルの再生成

ODBCパッケージ用にzipおよびRPMファイルを再生成するには、次のコマンドを使用します。

cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk ic_odbc_zip

SQL*Plusパッケージ用のzipおよびRPMファイルの再生成

SQL*Plusパッケージ用にzipおよびRPMファイルを再生成するには、次のコマンドを使用します。

cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk ic_sqlplus_zip

ツール・パッケージ用のzipおよびRPMファイルの再生成

ツール・パッケージ用にzipおよびRPMファイルを再生成するには、次のコマンドを使用します。

cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk ic_tools_zip

全パッケージ用のzipおよびRPMファイルの再生成

全パッケージ用にzipおよびRPMファイルを再生成するには、次のコマンドを使用します。

cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk ilibociei

新しいzipおよびRPMファイルが次のディレクトリに生成されます。

$ORACLE_HOME/rdbms/install/instantclient

データ共有ライブラリ、zipおよびRPMファイルの再生成は、Windowsプラットフォームでは使用できません。

OCI Instant Clientのデータベース接続文字列

OCI Instant Clientからは、通常のSQLクライアントで可能なすべての方法で、リモート・データベースに接続できます。ただし、Instant ClientにはOracleホーム環境およびディレクトリ構造がないため、一部のデータベース・ネーミング・メソッドには追加の構成手順が必要です。

(tnsnames.oraまたはsqlnet.oraなどの構成ファイルを検索するために) ORACLE_HOMEまたはTNS_ADMINを使用する必要のない、すべてのOracle Netネーミング・メソッドは、Instant Clientモードで動作します。特に、OCIServerAttach()コールのconnect_identifierは、次の形式で指定できます。

  • SQL接続URL文字列のフォームは、次のようになります。

    [//]host[:port][/service name]
    

    たとえば、次のようにします。

    //dlsun242:5521/bjava21
    
  • Oracle Net接続記述子。たとえば、次のようにします。

    "(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp) (HOST=dlsun242) (PORT=5521))
    (CONNECT_DATA=(SERVICE_NAME=bjava21)))"
    
  • サイトがLDAPサーバー・ディレクトリ用に構成されているディレクトリ・ネーミングを通じて解決される接続名。

tnsnamesなどのネーミング・メソッドやディレクトリ・ネーミングを使用するには、TNS_ADMIN環境変数を設定する必要があります。

関連項目:

接続記述子の詳細は、『Oracle Database Net Services管理者ガイド』の「ネーミング・メソッドの構成」を参照してください

TNS_ADMIN環境変数が設定されていない場合に、inst1などのTNSNAMESエントリを使用するときは、ORACLE_HOME変数を設定する必要があります。また、構成ファイルは$ORACLE_HOME/network/adminディレクトリに存在する必要があります。

この場合、ORACLE_HOME変数は、Oracle Net構成ファイルの検索のみに使用され、クライアント・コード・ライブラリの他のコンポーネント(OCI、NLSなど)は、ORACLE_HOMEの値を使用しません。

OCIServerAttach()コールで接続文字列としてNULL文字列""を使用する場合、TWO_TASK環境変数をconnect_identifierに設定できます。Windowsオペレーティング・システムでは、TWO_TASKのかわりにLOCAL環境変数を使用します。

同様に、SQL*PlusなどのOCIコマンド・ライン・アプリケーションには、TWO_TASK (WindowsではLOCAL)環境変数をconnect_identifierに設定できます。この環境変数には、通常の接続文字列上で'@'より右側であれば、任意の値を指定できます。

Instant Client接続識別子の例

SQL*PlusをInstant Clientモードで使用するには、接続識別子を次のように指定します。

Oracle Databaseのlistener.oraファイルに次の記述が含まれる場合:

LISTENER = (ADDRESS_LIST=
 (ADDRESS=(PROTOCOL=tcp)(HOST=server6)(PORT=1573))
)
 
SID_LIST_LISTENER = (SID_LIST= 
 (SID_DESC=(SID_NAME=rdbms3)(GLOBAL_DBNAME=rdbms3.server6.us.alchemy.com)
(ORACLE_HOME=/home/dba/rdbms3/oracle))
)

SQL*Plus接続識別子は次のようになります。

"(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=server6)(PORT=1573))(CONNECT_DATA=
(SERVICE_NAME=rdbms3.server6.us.alchemy.com)))"

接続識別子は次のように指定することもできます。

"//server6:1573/rdbms3.server6.us.alchemy.com"

または、TWO_TASK環境変数を任意の以前の接続識別子に設定し、接続識別子を新規に指定せずに接続することもできます。たとえば、次のようにします。

setenv TWO_TASK "(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=server6)(PORT=1573))
(CONNECT_DATA=(SERVICE_NAME=rdbms3.server6.us.alchemy.com)))"

TWO_TASK環境変数を次のように指定することもできます。

setenv TWO_TASK //server6:1573/rdbms3.server6.us.alchemy.com

その後、空の接続識別子でSQL*Plusを起動できます(パスワードの入力を求められます)。

sqlplus user

接続記述子は、tnsnames.oraファイルにも指定できます。たとえば、tnsnames.oraファイルに次の接続記述子が記載され、

conn_str = (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=server6)(PORT=1573))(CONNECT_DATA=
(SERVICE_NAME=rdbms3.server6.us.alchemy.com)))

tnsnames.oraファイルが/home/webuser/instantclientディレクトリにある場合、変数TNS_ADMIN (WindowsではLOCAL)を次のように設定できます。

setenv TNS_ADMIN /home/webuser/instantclient

その後、接続識別子conn_strを使用して、SQL*Plusを起動するか、OCI接続を行うことができます。

注意:

TNS_ADMINには、tnsnames.oraファイルを配置するディレクトリを指定します。TNS_ADMINtnsnames.oraファイルのフル・パスではありません。

前述のtnsnames.oraファイルがインストールが行われたOracleホームの、/network/server6/home/dba/oracle/network/adminディレクトリにある場合、ORACLE_HOME環境変数を次のように設定して、前と同様にSQL*Plusを識別子conn_strを使用して起動できます。

setenv ORACLE_HOME /network/server6/home/dba/oracle

最後に、tnsnames.oraTNS_ADMINまたはORACLE_HOMEにあれば、TWO_TASK環境変数を次のように設定して、接続識別子なしでSQL*Plusを起動できます。

setenv TWO_TASK conn_str

OCI Instant Clientの環境変数

ORACLE_HOME環境変数は、NLS、COREおよびエラー・メッセージ・ファイルの場所を決定しなくなりました。OCI専用アプリケーションでは、ORACLE_HOMEを設定しないでください。ただし、設定されていても、OCIには影響はありません。OCIは、データ共有ライブラリからデータを常に取得します。データ共有ライブラリが使用できない場合のみORACLE_HOMEが使用され、クライアントの完全インストールとみなされます。ORACLE_HOMEを設定する必要がなくても、設定する場合には、ディレクトリを識別する有効なオペレーティング・システム・パス名に設定する必要があります。

動的ユーザー・コールバック・ライブラリをロードする場合は、このマニュアルで指定されているように、ORACLE_HOME/lib (WindowsではORACLE_HOME¥bin)にコールバック・パッケージが存在する必要があります。この場合、ORACLE_HOMEを設定します。

Instant Clientモードでは、環境変数ORA_NLS10およびORA_NLS_PROFILE33は無視されます。

Instant Clientモードでは、ORA_TZFILE変数が設定されていない場合、データ共有ライブラリのより大きいデフォルトのtimezlrg_n.datファイルが使用されます。データ共有ライブラリのより小さいtimezone_n.datファイルが使用される場合は、絶対パス名または相対パス名を使用せずに、ORA_TZFILE環境変数をファイルの名前に設定します。ファイルは、Instant Clientディレクトリのサブディレクトリoracore/zoneinfo (UNIX/LINUXの場合)またはoracore\zoneinfo (Microsoft Windowsの場合)にコピーする必要があります。geneziユーティリティに-vオプションを指定して使用すると、タイム・ゾーン・ファイルおよび配置が有効かどうかを検証、またはSQL*Plusを実行できます。

LinuxまたはUNIXの場合:

setenv ORA_TZFILE timezone_n.dat

Windowsの場合:

set ORA_TZFILE=timezone_n.dat

これらの場合、nはタイムゾーン・データ・ファイルのバージョン番号です。

Instant Clientデータ共有ライブラリにパッケージされている大小のタイムゾーン・ファイルのバージョンを特定するには、次のコマンドを入力して、geneziユーティリティを実行します。

genezi -v

(データ共有ライブラリが使用できないために) OCIがInstant Clientモードで動作していない場合、以前のOracle Databaseのリリースと同様に、ORA_TZFILE変数(設定されている場合)は、完全なパス名を付けます。

TNSNAMESエントリが使用されている場合は、前述したように、TNS_ADMINディレクトリにはTNSNAMES構成ファイルを含める必要があります。TNS_ADMINが設定されていない場合は、ORACLE_HOME/network/adminディレクトリにOracle Net Services構成ファイルを含める必要があります。

Instant Client Light(English)

Instant ClientのInstant Client Light (English)バージョンでは、クライアントのインストールに必要なディスク領域が削減されています。英語以外の言語のエラー・メッセージ・ファイルを削除し、サポートされるキャラクタ・セット定義を約250の中からわずかな数のみ残すことで、ライブラリのサイズが削減されました。

このInstant Client Lightバージョンは、US7ASCII、WE8DEC、WE8ISO8859P1、WE8MSWIN1252またはUnicodeキャラクタ・セットのいずれかを使用するアプリケーション向けです。NLS_LANG設定のLANGUAGEおよびTERRITORYフィールドに制限がないため、Instant Client Lightはあらゆる言語および地域設定で動作します。Instant Client Lightでは英語のエラー・メッセージのみ提供されているため、NLS_LANGAMERICAN以外の言語に設定されている場合でも、Net接続エラーなどのクライアント側で生成されたエラー・メッセージは常に英語でレポートされます。データベース・インスタンスのOracleホームに適切な翻訳済メッセージ・ファイルがインストールされている場合、SQL文の構文エラーなどのデータベース側で生成されたエラー・メッセージは、選択した言語となります。

グローバリゼーション設定

Instant Client Lightでサポートされるキャラクタ・セットについて説明します。

Instant Client Lightは、次のクライアント・キャラクタ・セットをサポートします。

シングルバイト

  • US7ASCII

  • WE8DEC

  • WE8MSWIN1252

  • WE8ISO8859P1

Unicode

  • UTF8

  • AL16UTF16

  • AL32UTF8

Instant Client Lightは、次のいずれかのデータベース・キャラクタ・セットを使用するデータベースに接続できます。

  • US7ASCII

  • WE8DEC

  • WE8MSWIN1252

  • WE8ISO8859P1

  • WE8EBCDIC37C

  • WE8EBCDIC1047

  • UTF8

  • AL32UTF8

Instant Client Lightは、前述のリストにないキャラクタ・セットがクライアントまたはデータベースのキャラクタ・セットとして使用された場合に、エラーを戻します。

Instant Client Lightは、OCI_UTF16モードで作成されたOCI環境ハンドルを使用しても動作できます。

関連項目:

各国語サポート(NLS)の設定の詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください

Instant Client Lightの動作

OCIアプリケーションは、デフォルトで、OCIデータ共有ライブラリlibociei.so (WindowsではOraociei12.dll)をLD_LIBRARY_PATH (WindowsではPATH)から検索し、アプリケーションがInstant Clientモードで動作するかどうかを判断します。このライブラリが見つからない場合、OCIではInstant Client Lightデータ共有ライブラリ(表1-4を参照)libociicus.so(WindowsではOraociicus12.dll)のロードを試みます。Instant Client Lightのライブラリが見つかった場合、アプリケーションはInstant Client Lightモードで動作します。それ以外の場合は、Oracleホームでの完全インストールが想定されます。

表1-4 OCI Instant Client Light共有ライブラリ

LinuxおよびUNIX LinuxおよびUNIXでの説明 Windows Windowsでの説明

libclntsh.so.12.1

libclntshcore.so.12.1

クライアント・コード・ライブラリ

oci.dll

アプリケーションがリンクする転送機能

libociicus.so

OCI Instant Client Lightデータの共有ライブラリ

oraociicus12.dll

データとコード

libnnz12.so

セキュリティ・ライブラリ

orannzsbb12.dll

セキュリティ・ライブラリ

該当なし

該当なし

oci.symoraociicus12.symorannzsbb12.sym

記号表

Instant Client Lightのインストール

Instant Client Lightのインストールは、次のいずれかの方法で行うことができます。

  • OTNから

    Oracle Technology Network WebサイトのOCI URL(OCIページの下部にあるInstant Clientのリンク)からInstant Clientリンクに移動します。

    http://www.oracle.com/technology/software/tech/oci/instantclient/

    Instant Client Lightの場合、basiclite.zipパッケージを空のinstantclient_12_1ディレクトリにダウンロードし、解凍します。

  • クライアントの完全(Adminオプション)インストールから

    ORACLE_HOME/instantclient/lightサブディレクトリから、libociicus.so (WindowsではOraociicus12.dll)をコピーします。LD_LIBRARY_PATH (WindowsではPATH)のInstant Clientディレクトリに、サイズの大きいOCI Instant Clientデータ共有ライブラリlibociicus.so (WindowsではOraociicus12.dll)のかわりに、Instant Client Lightデータ共有ライブラリlibociei.so (WindowsではOraociei12.dll)を格納します。

  • Oracle Universal Installerから

    Oracle Universal InstallerでInstant Clientオプションを選択した場合、libociei.so (WindowsではOraociei12.dll)はインストールのベース・ディレクトリにインストールされ、これらのファイルがLD_LIBRARY_PATH (WidowsではPATH)に置かれることになります。

    Instant Light Clientデータ共有ライブラリlibociicus.so (WindowsではOraociicus12.dll)は、ベース・ディレクトリのlightサブディレクトリにインストールされ、デフォルトでは無効です。したがって、Instant Client Lightモードを使用するには、OCIデータ共有ライブラリlibociei.so (WindowsではOraociei12.dll)を削除するか名前を変更し、Instant Client Lightのライブラリをその環境のlightサブディレクトリからベース・ディレクトリにコピーする必要があります。

    たとえば、Oracle Universal InstallerでInstant ClientをLD_LIBRARY_PATH (WindowsではPATH)のmy_oraic_12_1ディレクトリにインストールした場合、Instant Client Lightモードを使用するには、次を実行する必要があります。

    cd my_oraic_12_1
    rm libociei.so
    mv light/libociicus.so .

    注意:

    インストールに互換性のないバイナリが存在しないように、常に空のディレクトリにInstant Clientのファイルをコピーしインストールしてください。

Instant Client SDK

SDKは、次のOracle Technology Network WebサイトのOCI URL上のInstant Clientリンク(Instant ClientリンクはOCIページの下部にあります)からダウンロードできます。

http://www.oracle.com/technology/tech/oci/instantclient/
  • Instant Client SDKパッケージには、CおよびC++のヘッダー・ファイルと、Instant Client環境でOCIおよびOCCIアプリケーションを開発するためのMakefileが含まれています。開発したアプリケーションは、あらゆるクライアント環境にデプロイできます。

  • SDKには、CおよびC++のデモ・プログラムが含まれています。

  • Windowsの場合、OCIまたはOCCIアプリケーションをリンクするために必要なライブラリも含まれています。デモをビルドするための、Make.batが提供されています。

  • UNIXまたはLinuxの場合、デモをビルドするにはmakefile demo.mkを指定します。アプリケーションをリンクする前に、LD_LIBRARY_PATHinstantclient_12_1ディレクトリを必ず定義します。OCIおよびOCCIプログラムでは、instantclient_12_1ディレクトリにシンボリック・リンクlibclntsh.soおよびlibocci.soを配置する必要があります。リンク・ステップの前に、demo.mkによりこれらのリンクが作成されます。これらのシンボリック・リンクは、シェルで作成することもできます。

    cd instantclient_12_1
    ln -s libclntsh.so.12.1 libclntsh.so
    ln -s libocci.so.12.1 libocci.so
    
  • また、SDKには、アプリケーション・ヘッダー・ファイルを生成するための、Object Type Translator (OTT)ユーティリティとそのクラスが含まれます。