ヘッダーをスキップ
Oracle Call Interfaceプログラマーズ・ガイド
11g リリース1(11.1)
E05677-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

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

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

OCIの概要

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


関連項目:



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

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

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

OCIの利点

Oracleデータベースに接続する場合、OCIには次のような大きな利点があります。

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

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

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

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

  • 動的SQLのサポート

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

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

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

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

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

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

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

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

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

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

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

OCIの分類

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

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

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

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

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

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

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

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

  • 非手続き型言語のプログラムでは、操作対象となる一連のデータが指定されますが、実行する操作の種類や操作の方法は指定されません。SQLは非手続き型という性質上、習得しやすく、データベース・トランザクションを実行しやすい言語です。また、SQLは、先進のリレーショナル・データベース・システムおよびオブジェクト・リレーショナル・データベース・システムのデータに対するアクセスや操作に使用する標準言語となっています。

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

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

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

SELECT name FROM employees WHERE empno = :empnumber;

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

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

オブジェクトのサポート

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

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


関連項目:

  • 『Oracle Database概要』

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


OCIには、Oracleデータベース・サーバー内のオブジェクト処理用にOCIの機能を拡張した関数が組み込まれています。具体的には、次の機能がOCIに追加されました。

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

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

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

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

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

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

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

その他のOCIコールは、SQL文を通してアクセスされた後、オブジェクトの操作をサポートするために提供されます。拡張機能および新機能の詳細は、「カプセル化されたインタフェース」を参照してください。

SQL文

OCIアプリケーションの主なタスクの1つは、SQL文を処理することです。SQL文の種類が異なると、プログラムでは異なる処理ステップが必要になります。OCIアプリケーションをコーディングする際には、そのことを考慮に入れることが重要です。次の種類の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データベース内のオブジェクトを操作することもできます。次の例は、オブジェクト表を作成する一連の文です。

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データベース内のオブジェクトを操作できます。次の例では、person_t型のインスタンスがオブジェクト表person_tabに挿入されます。

INSERT INTO person_tab
    VALUES (person_t('Steve May','123-45-6789','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ストアド・プロシージャおよびストアド・ファンクションのコール

  • 複数のSQL文を指定したプロシージャ型制御文を結合し、1つの単位として実行

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

  • カーソル変数の使用

  • Oracleデータベース・サーバー内のオブジェクトへのアクセスおよび操作

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

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

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


関連項目:

  • PL/SQLブロックのコーディングの詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください。

  • PL/SQLでのプレースホルダの使用方法の詳細は、「PL/SQLのプレースホルダのバインド」を参照してください。


埋込みSQL

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

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


関連項目:


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

OCI/SQLの特殊用語

このマニュアルでは、SQL文の様々な部分を参照するために特殊な用語を使用しています。たとえば次のようなSQL文があります。

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

このSQL文は、次の部分で構成されています。

  • SQLコマンド: SELECT

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

  • FROM句内の表名 −customers

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

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

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

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

PL/SQLでは、入力の指定も出力の指定もバインド操作と呼びます。これらの用語や操作については、第4章「OCIでのSQL文の使用」を参照してください。

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

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

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

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

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

  • OCI構造をハンドルの形にカプセル化することによりOCI構造が不透明になるため、アプリケーションに影響を与えずに基礎となる構造を変更できます。

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

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

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

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

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

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

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

アプリケーションのパフォーマンスおよび拡張性を改善する拡張機能

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

  • クライアント側の処理の増加、およびサーバー側の問合せ要求の削減

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

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

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

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

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

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

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

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

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

OCIは、Oracleサーバーのオブジェクト機能を使用するプログラマに、包括的なApplication Program Interface(API)を提供します。その機能は、次の6つの主要なカテゴリに分類できます。

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

  • オブジェクトへのアクセスおよび操作のためのアソシエイティブ・インタフェースおよびナビゲーショナル・インタフェース

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

  • Oracleデータベース内のオブジェクト型の情報にアクセスするための型管理関数

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

  • Oracle内部スキーマ情報をクライアント側の言語バインド変数にマッピングするObject Type Translator(OTT)ユーティリティ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 互いを指すREFを横断することにより、相互に接続されている一連のオブジェクトを横断します。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Object Type Translator

Object Type Translator(OTT)ユーティリティは、Oracleオブジェクト型のスキーマ情報を、構造体などのホスト言語変数のクライアント側言語バインドに変換します。OTTは、Oracleスキーマ・オブジェクトのメタデータ情報が含まれるintypeファイルを入力として使用します。OTTは、次にouttypeファイルおよび必要なヘッダー・ファイルと実装ファイルを生成します。このヘッダー・ファイルと実装ファイルは、オブジェクト・スキーマに対して実行するCアプリケーションに組み込む必要があります。OCIアプリケーションおよびPro*C/C++プリコンパイラ・アプリケーションには、OTTで生成したコードを組み込むことができます。OTTには次のような多くの利点があります。

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

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

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

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

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

OCIでは、Oracle Streams Advanced Queuing(Streams AQ)機能へのインタフェースを提供します。Streams AQは、Oracleサーバーと統合されたメッセージ・キューイングです。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はすでにこのファイルに記載済のためです。

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


関連項目:

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

  • 『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』の「Oracle XAによるアプリケーションの開発」


互換性およびアップグレード

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

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

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

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

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

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

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


    注意:


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


    関連項目:

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

    • 現在サポートされているサーバー・バージョンは、ノート207303.1のOracle iSupportに記載されています。URLhttp://metalink.oracle.com/を参照してください。


既存OCIリリース7アプリケーションのアップグレードの簡易化

OCIでは、多くの機能が大幅に改善されました。OCIリリース7.xのクライアントとこのリリースのサーバー、およびこのリリースのクライアントとOracle7サーバーにはそれぞれ相互運用性があるため、OCIリリース7.xを使用するように作成したアプリケーションは、このリリースのOCIに容易に移行できます。

具体的には次のとおりです。

  • OCIリリース7.3 APIを使用していたアプリケーションは、このリリースのサーバーに対して通常どおり動作します。これらのアプリケーションは、現行のクライアント・ライブラリにリンクする必要があります。

  • OCIリリース7.xおよびこのリリースのOCIのコールは、同じ文の実行で混在させないかぎり、同一アプリケーションおよび同一トランザクション内で使用できます。

このため、既存のOCIバージョン7のアプリケーションを移行する場合は、次の2つの方法があります。

  • 現行のOCIクライアントにアップグレードしますが、アプリケーションは修正しません。Oracle7 OCIクライアントから現行リリースのOCIクライアントにアップグレードする場合は、新しいバージョンのOCIライブラリのリンクのみを実行します。アプリケーションを再コンパイルする必要はありません。再リンクしたOracle7 OCIアプリケーションは、現行サーバーに対して通常どおり動作します。

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

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

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

OCIリリース8.0では、リリース7.3で利用できなかった新しい関数セットを導入しました。このリリース7.3の関数は、引き続きサポートされています。以前のリリース7.xコールの多くを使用できますが、パフォーマンスを向上し、機能性を高めるために、新しいアプリケーションで新しいコールを使用することをお薦めします。

表1-1「使用されなくなったOCI関数」は、リリース7.xのOCIコールおよび以降のリリースでの等価コールのリストです。OCIコールの詳細は、このマニュアルの関数の説明を参照してください。リリース7.xコールの詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。これらのリリース7.xコールは廃止されています。つまり、OCIではこれらが新しいコールで置き換えられています。廃止されたコールはこの時点ではサポートされていますが、OCIの将来のバージョンではサポートされない可能性があります。


注意:


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

表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()を参照してください。


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

OCIの以前のバージョンで使用可能だったOCIルーチンの一部は、以降のリリースではサポートされません。それらのルーチンのリストを、表1-2「サポートされないOCI関数」に示します。

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

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

obind()

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

obindn()

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

odfinn()

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

odsrbn()

注意: 表1-1odescr()を参照してください。

ologon()

OCILogon()

osql()

注意: 表1-1oparse()を参照してください。


異なるリリースのOCIおよびサーバー間の互換性

この項では、異なるリリースのOCIおよびOracleサーバー間の互換性について説明します。

リリース7.x以上の新しいコールを使用していない既存の7.xアプリケーションは、新しいクライアント側ライブラリに再リンクする必要があります。

このアプリケーションでは、Oracle8i 以上のオブジェクト機能が使用できません。また、これらのOCIリリースで提供されるパフォーマンスや拡張性も利用できません。

OCIのアップグレード

プログラマがリリース7.x以上の機能を既存のOCIアプリケーションに取り込む場合は、次の2つの選択肢があります。

  • アプリケーションを完全にリライトして、新しいOCIコールのみを使用(推奨)

  • リリース7.x以上の新しいOCIコールをアプリケーションに取り込む一方で、一部の操作にはリリース7.xコールを使用

このマニュアルでは、既存のアプリケーションをリライトして新しいOCIコールのみを使用するために必要な情報を提供しています。

リリース7.x以上のOCIコールのリリース7.xアプリケーションへの追加

次のガイドラインは、プログラマが新しいOCIコールを使用して新しいOracleのデータ型および機能を取り込む一方で、一部の操作にはリリース7.xコールを使用する場合に適用されます。

  • 既存のログインを変更して、olog()(または他のログイン・コール)のかわりにOCILogon()を使用します。サービス・コンテキスト・ハンドルは、新しいOCIコールで使用できます。または、リリース7.xのOCIコールで使用されるLda_Defに変換できます。


    関連項目:


    複数のセッションをメンテナンスしているアプリケーションに必要なログイン・コールの詳細は、OCIServerAttach()およびOCISessionBegin()の説明を参照してください。




  • サーバー・コンテキスト・ハンドルを初期化した後は、リリース7.x以上のOCIコールで使用できます。

  • リリース7 OCIコールを使用するには、OCISvcCtxToLda()を使用してサーバー・コンテキスト・ハンドルをLda_Defに変換し、結果のLda_Defをリリース7.xコールに渡します。

 

注意:


同じサーバー・ハンドルを共有する複数のサービス・コンテキストがある場合、Oracleバージョン7モードでは常に1つのサービス・コンテキストのみ可能です。




  • リリース7.x以上のOCIコールの使用を再開する場合は、アプリケーションでOCILdaToSvcCtx()を使用してLda_Defをサーバー・コンテキスト・ハンドルに変換しなおす必要があります。

  • アプリケーションでは、必要に応じて、Lda_Defとサーバー・コンテキストを切り替えることができます。

このアプローチを行うと、アプリケーションで、単一の接続で2つの異なるAPIを使用して異なるタスクを達成できます。

リリース7.xのOCIコールとリリース7.x以上のOCIコールを混在させることは、トランザクション内では可能ですが、文内ではできません。これにより、あるSQL文またはPL/SQL文をリリース7.xのOCIコールで実行し、そのトランザクション内で、次のSQL文またはPL/SQL文を7.x以上のOCIコールで実行できます。


注意:


カーソルをオープンして、リリース7.xのOCIコールで解析し、次にリリース7.x以上のOCIコールで文を実行することはできません。

OCI Instant Client

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

READMEファイルが含まれています。このファイルは、バージョン、日時および生成されたオペレーティング・システムについて説明しています。

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

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

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

libclntsh.so.11.1

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

oci.dll

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

libociei.so

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

oraociei11.dll

データとコード

libnnz11.so

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

orannzsbb11.dll

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



oci.symoraociei11.symorannzsbb11.sym

記号表


DLLごとに.symファイルが提供されており、DLLと同じ場所に置いた場合、WindowsでOCIに障害が発生した際に、関数名を含むスタック・トレースが生成されます。

この表では、Oracle Database 11g リリース1のライブラリ名を使用しています。

Microsoft ODBCおよびOLEDBドライバを使用するには、ORACLE_HOME\binからociw32.dllもコピーする必要があります。

Instant Clientの利点

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

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

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

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

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

OCI Instant Clientのインストール・プロセス

Instant Clientライブラリは、Oracle Universal InstallerからInstant Clientオプションを選択した場合にもインストールされます。Instant Clientライブラリは、次に示すOTN(Oracle Technology Network)のWebサイトからダウンロードすることもできます。

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

次に示すように、インストール・プロセスは簡単です。

  1. Instant Client共有ライブラリを、instantclient_11_1などのディレクトリにダウンロードしてインストールします。基本パッケージを選択します。

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

  3. 必要に応じて、NLS_LANGを使用して、クライアント・システムの言語、地域およびキャラクタ・セットをリセットします。

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

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

Instant Clientライブラリは、Oracle Universal InstallerからInstant Clientオプションを選択することでインストールできます。インストール先は空のディレクトリである必要があります。Instant Clientモードで操作できるようにするには、OTNのインストールと同様に、LD_LIBRARY_PATHをInstant Clientディレクトリに設定する必要があります。

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

LinuxまたはUNIXの場合:

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

libclntsh.so.11.1およびlibnnz11.soは、$ORACLE_HOME/libにあります。

Windowsの場合:

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

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

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


注意:


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

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

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


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


注意:


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

OCCIでは、OCCIライブラリ(LinuxまたはUNIXではlibocci.so.11.1、Windowsではoraocci11.dll)は、Instant Clientディレクトリにインストールする必要があります。

Instant Clientを使用する場合

Instant Clientはデプロイメント用の機能であるため、本番アプリケーションの実行に使用する必要があります。通常、すべてのOCI機能は、Instant Clientモードで実行されるアプリケーションに使用できます。ただし、Instant Clientモードは、クライアント側の操作でのみ使用される機能です。したがって、サーバー側の外部プロシージャは、Instant Clientモードでは動作しません。

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

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

Instant Clientはデプロイメント用の機能であるため、OCIアプリケーションの実行に必要なファイル(クライアント・フットプリント)の数およびサイズを減らすことが重視されています。したがって、Instant Client共有ライブラリにパッチを適用するために必要なファイルは、Instant Clientによるデプロイメントですべて入手できるわけではありません。Instant Client共有ライブラリにパッチを適用するには、ORACLE_HOMEベースのクライアントの完全インストールが必要です。opatchユーティリティで、Instant Client共有ライブラリにパッチを適用します。

ORACLE_HOME環境にパッチを適用した後、「OCI Instant Clientのインストール・プロセス」の説明に従って、表1-3「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システムのORACLE_HOME/binディレクトリからそれをコピーする必要があります。


注意:


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

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

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

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

新たに生成されたlibociei.soはORACLE_HOME/instantclientディレクトリに入れられますが、この同じディレクトリにある元の既存libociei.soは、libociei.so0という名前に変更されます。

ハイブリッド・プラットフォームでの32ビット・モードの手順:

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

前述の手順で、OCI/OCCI、JDBCおよびSQL*Plus用のInstant Client zipファイルおよびRPMファイルも生成されます。

新しいzipおよびRPMファイルは下記に生成されます。

64ビット・モードは$ORACLE_HOME/rdbms/install/instantclient、32ビット・モードは$ORACLE_HOME/rdbms/install/instantclient32

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


注意:

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


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

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

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データベース・サーバーの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)))"

または

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_HOMEベースのインストールで/network/server6/home/dba/oracle/network/adminディレクトリに配置されている場合、ORACLE_HOME環境変数は次のように設定できます。

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

また、前述のように識別子conn_strを使用して、SQL*Plusを起動できます。

最後に、tnsnames.oraTNS_ADMINまたはORACLE_HOMEで位置を特定できる場合、TWO_TASKを次のように設定できます。

setenv TWO_TASK conn_str

その後、接続識別子なしでSQL*Plusを起動できます。

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変数が設定されていない場合、データ共有ライブラリにある、より小さいデフォルトのtimezone.datファイルが使用されます。データ共有ライブラリにある、より大きいtimezlrg.datファイルが使用される場合は、絶対パス名または相対パス名を使用せずに、ORA_TZFILE環境変数をファイルの名前に設定します。つまり、LinuxまたはUNIXの場合、次のようにします。

setenv ORA_TZFILE timezlrg.dat

Windowsの場合:

set ORA_TZFILE=timezlrg.dat

(データ共有ライブラリが使用できないために)OCIがInstant Clientモードで動作していない場合、以前のOracleリリースと同様に、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は、次のクライアント・キャラクタ・セットをサポートします。

シングルバイト

  • 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ではOraociei11.dll)をLD_LIBRARY_PATH(WindowsではPATH)から検索し、アプリケーションがInstant Clientモードで動作するかどうかを判断します。このライブラリが見つからない場合、OCIはInstant Client Lightデータ共有ライブラリlibociicus.so(WindowsではOraociicus11.dll)のロードを試みます。Instant Client Lightのライブラリが見つかった場合、アプリケーションはInstant Client Lightモードで動作します。その他の場合は、ORACLE_HOMEベースの完全インストールが想定されます。

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

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

libclntsh.so.11.1

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

oci.dll

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

libociicus.so

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

oraociicus11.dll

データとコード

libnnz11.so

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

orannzsbb11.dll

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



oci.symoraociicus11.symorannzsbb11.sym

記号表


Instant Client Lightのインストール

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

  1. OTNから

    Instant ClientのURLにアクセスします。

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

    Instant Client Lightの場合、basic.zipパッケージをダウンロードして展開するかわりに、basiclite.zipパッケージをダウンロードして解凍します。Instant Client Lightライブラリの解凍先となるinstantclient_11_1ディレクトリは、解凍前は空である必要があります。

  2. インストールされたクライアント(管理者)から

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

  3. Oracle Universal Installerから

    Oracle Universal Installer(OUI)でInstant Clientオプションを選択した場合、libociei.so(WindowsではOraociei11.dll)は、LD_LIBRARY_PATH(WidowsではPATH)に記載されている、その環境のベース・ディレクトリにインストールされます。これは、Instant Client Lightがデフォルトで有効化されないようにするためです。Instant Light Clientデータ共有ライブラリlibociicus.so(WindowsではOraociicus11.dll)は、ベース・ディレクトリのlightサブディレクトリにインストールされます。したがって、Instant Client Lightモードを使用するには、OCIデータ共有ライブラリlibociei.so(WindowsではOraociei11.dll)を削除するか名前を変更し、Instant Client Lightのライブラリをその環境のlightサブディレクトリからベース・ディレクトリにコピーする必要があります。

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

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

    注意:


    すべてのInstant Clientファイルは、空のディレクトリにコピーし、インストールします。これは、環境に互換性のないバイナリ・ファイルが存在しないようにするためです。

Instant Client SDK

SDKは、Instant ClientのWebページからダウンロードできます。

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が提供されています。アプリケーションをリンクする前に、instantclient_11_1ディレクトリがLD_LIBRARY_PATHに記載されている必要があります。 OCIおよびOCCIプログラムでは、libclntsh.soおよびlibocci.soシンボリック・リンクがinstantclient_11_1ディレクトリに存在する必要があります。 demo.mkは、リンク・ステップの前にこれらを作成します。これらのシンボリック・リンクは、シェルでも作成できます。

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