ヘッダーをスキップ
Oracle Databaseアドバンスト・アプリケーション開発者ガイド
11gリリース1(11.1)
E05687-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

1 Oracleプログラム環境の概要

内容は次のとおりです。

Oracleアプリケーション開発の概要

アプリケーション開発者がOracle Databaseと対話するためのプログラムを作成する場合、次のような多くの選択肢があります。

クライアント/サーバー・モデル

従来のクライアント/サーバー・プログラムでは、アプリケーションのコードはデータベース・サーバー以外のシステムである、クライアント・システム上で実行されます。データベース・コールは、クライアント・システムからデータベース・サーバーに送信されます。挿入および更新操作時には、データがクライアントからサーバーに送信され、問合せ操作時には、データがサーバーからクライアントに戻されます。データは、クライアント・システム上で処理されます。クライアント/サーバー・プログラムは、通常、プリコンパイラを使用して作成されますが、SQL文はC、C++、COBOLなどの別の言語のコードに埋め込まれています。

サーバー側のコーディング

データベースで変更が発生した場合に自動的に実行されるトリガー、または明示的に起動されるストアド・サブプログラムを使用して、完全にデータベース内に常駐するアプリケーション・ロジックを開発できます。アプリケーションから作業をオフロードすると、検証およびクリーン・アップの実行に使用されるコードを再利用できたり、様々なクライアントからのデータベース処理を制御できます。たとえば、Webサーバーを介したストアド・サブプログラムの起動を可能にすることで、クライアント/サーバー・アプリケーションと同じ機能を実行するWebベースのユーザー・インタフェースを構成できます。

2層モデルと3層モデル

クライアント/サーバー・コンピューティングは、2層モデルと呼ばれることがあります。このモデルでは、アプリケーションはデータベース・サーバーと直接通信します。3層モデルでは、別個のアプリケーション・サーバーが要求を処理します。アプリケーション・サーバーには、基本的なWebサーバーや、キャッシュやロード・バランスなどの拡張機能を実行するサーバーがあります。この中間層の処理能力を向上させると、クライアント・システムに必要なリソースを少なくできるため、Thinクライアント構成になります。この構成では、クライアント・システムが必要とするのはWebブラウザか、またはTCP/IPやHTTPプロトコルを介して要求を送信する他の手段のみです。

ユーザー・インタフェース

ユーザー・インタフェースとは、アプリケーションがエンド・ユーザーに対して表示するものです。これはそのアプリケーションの背後にあるテクノロジおよびユーザー自身のニーズによって異なります。経験豊富なユーザーの場合は、データベースに渡すSQL文を入力できます。初心者ユーザーの場合は、クライアント・システム(Windows、X-Windowなど)のグラフィック・ライブラリを使用したGraphical User Interface(GUI)を表示できます。また、これらの従来のユーザー・インタフェースは、HTMLおよびJavaを使用してWebブラウザで提供することもできます。

ステートフル・ユーザー・インタフェースとステートレス・ユーザー・インタフェース

従来のクライアント/サーバー・アプリケーションでは、アプリケーションはユーザーのアクションを記録し、この情報を1つ以上のセッションで使用できます。たとえば、前に選択した項目を再入力する必要がないように、その項目をメニュー内に表示できます。アプリケーションがこの方法で情報を保存できる場合、そのアプリケーションはステートフルであるといいます。

WebアプリケーションまたはThinクライアント・アプリケーションは、ステートレスであると開発が容易です。ステートレス・アプリケーションは、必要なすべての情報を収集し、データベースを使用してその情報を処理し、ユーザーが変わるとそれらの操作を再実行します。これは、顧客登録などの単一画面要求を処理する一般的な方法です。

デフォルトでステートレスであるWebアプリケーションにステートフルのアクションを追加する方法は、数多くあります。たとえば、Webページ上のエントリ・フォームから次のWebページに情報が渡されるように、複数の異なる手順を通してユーザーの選択内容を記憶するウィザードのようなインタフェースを構成できます。Cookieを使用してクライアント・システムに関する少量の情報項目を格納でき、ユーザーがWebサイトに再度アクセスしたときはそれらの項目を取得できます。また、サーブレットを使用して、データベース・セッションを開いたままにし、同じクライアントからの要求間で、変数の格納もできます。

PL/SQLの概要

内容は次のとおりです。

PL/SQLの概要

PL/SQLは、Oracleが提供する標準データベース・アクセス言語であるSQLの手続き型拡張言語です。これは拡張4GL(第四世代プログラミング言語)、つまりアプリケーション固有の言語です。PL/SQLとSQLには、リレーショナル・データベース・ドメインの処理が組み込まれています。

PL/SQLを使用すると、SQL文でデータを操作したり、LOOPなどのプロシージャ構造でプログラム・フローを制御できます。さらに次のこともできます。

  • 定数および変数の宣言

  • サブプログラムの定義

  • コレクションおよびオブジェクト型の使用

  • ランタイム・エラーのトラップ

Oracle Databaseのプログラム・インタフェースのいずれかを使用して作成したアプリケーションであれば、PL/SQLストアド・サブプログラムを起動したり、PL/SQLコードのブロックをOracle Databaseに送信して実行できます。3GLのアプリケーションでは、ホスト変数および暗黙的データ型変換を使用して、PL/SQLのスカラー・データ型およびコンポジット・データ型にアクセスできます。3GL言語は、アセンブラ言語に比べて理解しやすく、名前付き変数などの機能が含まれています。4GLとは異なり、アプリケーション・ドメイン固有ではありません。

例1-1に、単純なPL/SQLサブプログラムの例を示します。debit_accountプロシージャは、銀行口座からの出金処理を行います。このプロシージャは、口座番号および金額をパラメータとして受け入れます。口座番号を使用して、データベースから口座残高が取得されます。次に、新規残高が計算されます。新規残高が0(ゼロ)より小さい場合はエラー・ルーチンが実行され、それ以外の場合は銀行口座が更新されます。

例1-1 単純なPL/SQLの例

PROCEDURE debit_account (p_acct_id INTEGER, p_debit_amount REAL)
IS
   v_old_balance  REAL;
   v_new_balance  REAL;
   e_overdrawn    EXCEPTION;
BEGIN
   SELECT bal
     INTO v_old_balance
   FROM accts
   WHERE acct_no = p_acct_id;
   v_new_balance := v_old_balance - p_debit_amount;
   IF v_new_balance < 0 THEN
      RAISE e_overdrawn;
   ELSE
      UPDATE accts SET bal = v_new_balance
         WHERE acct_no = p_acct_id;
   END IF;
   COMMIT;
EXCEPTION
   WHEN e_overdrawn THEN
      -- handle the error
END debit_account;

関連項目:

  • 『Oracle Database PL/SQL言語リファレンス』

  • 『Oracle Database SQL言語リファレンス』


PL/SQLのメリット

PL/SQLは、移植可能な高性能トランザクション処理言語で、次のようなメリットがあります。

Oracle Databaseとの統合

PL/SQLでは、Oracle DatabaseのSQLのデータ操作、カーソル制御およびトランザクション制御文をすべて使用できます。また、SQL関数、演算子および疑似列もサポートします。このため、Oracle Databaseのデータを柔軟かつ安全に操作できます。

PL/SQLはすべてのSQLデータ型をサポートします。SQLが提供する直接アクセスと組み合せると、これらの共有データ型によってPL/SQLとOracle Databaseデータ・ディクショナリが統合されます。

PL/SQLは、実行時にSQL文をその場で作成および処理できるプログラミング手法である動的SQLをサポートします。この手法によって、PL/SQLにPERL、Kornシェル、Tclなどのスクリプト言語と同等の柔軟性が得られます。

%TYPEおよび%ROWTYPE属性を使用すると、コードを表定義の変更に対応させることができます。たとえば、%TYPE属性を使用すると、データベースの列の型を基に変数を宣言できます。列のデータ型が変更されると、変数は実行時に正しい型を使用します。これによってデータの独立性が提供され、メンテナンスのコストが減少します。

パフォーマンスの向上

データベース集中型のアプリケーションの場合は、SQL文をOracle Databaseに送信して実行する前に、PL/SQLブロックを使用してSQL文をグループ化できます。このコーディング方法によって、アプリケーションとOracle Database間の通信オーバーヘッドが大幅に軽減されます。

PL/SQLストアド・サブプログラムは、1回のコンパイルで実行可能形式に格納されるため、サブプログラム・コールを迅速かつ効率的に行うことができます。1回のコールで計算集中型のストアド・サブプログラムを起動できるため、ネットワーク通信量が軽減され、往復の応答時間も短縮されます。実行可能コードは自動的にキャッシュされ、複数のユーザーが共有します。このため、必要なメモリー量およびコールによるオーバーヘッドが減少します。

生産性の向上

PL/SQLによって、Oracle FormsおよびOracle Reportsなどのプロシージャ機能を追加できます。たとえば、Oracle Formsのトリガーに1つのPL/SQLブロック全体を使用できます。複数のトリガー・ステップ、マクロまたはユーザー・イグジットを使用する必要はありません。

さらに、PL/SQLはどの環境でも同等に使用できます。Oracle Databaseのあるツール製品でPL/SQLを使用できるようになると、この知識を他のツール製品にも応用できるため、生産性が向上します。たとえば、あるツール製品で作成したスクリプトは、他のツール製品でも使用できます。

スケーラビリティ

PL/SQLストアド・サブプログラムは、アプリケーション処理がサーバー上で集中化されているため、スケーラビリティが増大します。また、ストアド・プロシージャの依存性を自動的にトラッキングできるため、スケーラブルなアプリケーション開発が容易になります。

共有サーバーの共有メモリー機能によって、Oracle Databaseは、単一ノード上で何千もの同時ユーザーをサポートできます。さらにスケーラビリティを向上させる場合は、Oracle Connection Managerを使用してネットワーク接続を多重化できます。

管理性

PL/SQLストアド・サブプログラムは、妥当性チェックを実施した後は、どのアプリケーションでも使用できます。PL/SQLストアド・サブプログラムの定義が変更された場合、変更はそのサブプログラムに対してのみ影響し、サブプログラムを起動するアプリケーションには影響しません。このため、メンテナンスおよび拡張が簡単になります。また、様々なクライアント・システム上の多数のコピーをメンテナンスするよりも、Oracle Database上の1つのサブプログラムをメンテナンスする方が簡単です。

オブジェクト指向プログラミングのサポート

PL/SQLは、次のものをオブジェクト指向プログラミングでサポートします。

オブジェクト型

オブジェクト型とは、データ構造、およびデータの操作に必要なサブプログラムをカプセル化したユーザー定義のコンポジット・データ型です。データ構造の変数を、属性といいます。オブジェクト型のアクションを特徴付けるサブプログラムをメソッドといい、PL/SQLで実装できます。

オブジェクト型は理想的なオブジェクト指向モデリング・ツールであり、これを使用して、複雑なアプリケーションの作成に必要なコストおよび時間を節約できます。オブジェクト型を使用すると、モジュール方式で、メンテナンス性が高く、再利用が可能なソフトウェア・コンポーネントを作成できるのみでなく、様々なプログラマ・チームが同時にソフトウェア・コンポーネントを開発できます。

コレクション

コレクションとは、型が同じで順序付けられた要素で構成されるグループです(たとえば、1クラス内の生徒の成績など)。各要素は、コレクション内でのその要素の位置を決定する一意のサブスクリプトを持っています。PL/SQLでは、連想配列(索引付き表)、ネストした表、可変サイズ配列(VARRAY)という3種類のコレクションが提供されます。

コレクションは、ほとんどの3GLプログラミング言語のセット、キュー、スタックおよびハッシュ表データ構造と同様に機能します。また、コレクションは、オブジェクト型のインスタンスを格納でき、オブジェクト型の属性にもなります。コレクションをパラメータとして渡すこともできます。このため、コレクションを使用して、データベースの表に(または表から)データ列を移動したり、クライアント側アプリケーションとストアド・サブプログラム間でデータ列を移動することができます。また、PL/SQLパッケージ内にコレクション型を定義することで、多くのアプリケーション間で同じ型を使用できます。

移植性

PL/SQLで作成したアプリケーションは、Oracle Databaseが実行されている場合は、どのオペレーティング・システムおよびハードウェア・プラットフォーム上でも実行できます。そのため、移植可能なプログラム・ライブラリを作成して、それを様々な環境で再利用できます。

セキュリティ

PL/SQLストアド・サブプログラムを使用すると、クライアント/サーバー間でアプリケーション・ロジックを分割し、機密性の高いOracle Databaseデータをクライアント・アプリケーションからは操作できないようにすることができます。PL/SQLで作成したデータベース・トリガーを使用すると、アプリケーションによる指定の更新を防ぎ、ユーザーからの問合せを監査できます。

また、ユーザーによるOracle Databaseデータの操作を、制限付きの一連の権限を持つストアド・サブプログラムを通してのみ行えるようにすることで、ユーザーからOracle Databaseデータへのアクセスを制限できます。たとえば、表を更新するサブプログラムへのアクセスは許可し、表自体へのアクセスを禁止できます。


関連項目:

データベース・セキュリティ機能の詳細は、『Oracle Databaseセキュリティ・ガイド』を参照してください。

パッケージ

パッケージとは、データベースに格納されている関連プログラム・オブジェクトがカプセル化されたコレクションです。プログラム・オブジェクトには、サブプログラム、変数、定数、カーソルおよび例外などがあります。組込みパッケージの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

PL/SQL Web開発ツール

Oracle Databaseには、PL/SQLアプリケーションをWeb上にデプロイするための組込みツールとテクノロジが用意されています。これにより、PL/SQLはCGIなどのWebアプリケーション・フレームワークの代替として機能します。

PL/SQL Web Toolkitは、Webクライアントから起動可能なストアド・プロシージャの開発に使用できる一連のPL/SQLパッケージです。このテクノロジを主に利用するのは、PL/SQLゲートウェイと埋込みPL/SQLゲートウェイの2つです。PL/SQLゲートウェイを使用すると、HTTPクライアントはOracle HTTP Serverのプラグインであるmod_plsqlを介してPL/SQLストアド・プロシージャを起動できます。このモジュールにより次のアクションが実行されます。

  1. ブラウザ・クライアントから渡されたURLが変換されます。

  2. URL内のパラメータを使用してOracle Databaseストアド・サブプログラムが起動されます。

  3. クライアントに出力(通常はHTML)が戻されます。

埋込みPL/SQLゲートウェイは、Oracle Database自体のXML DB Listenerを使用してHTTPリクエストを処理するPL/SQLゲートウェイです。この方法では、Oracle HTTP Serverおよびmod_plsqlのインストールや管理を行わずにWebアプリケーションを開発できます。

埋込みPL/SQLゲートウェイは、Oracle Database自体のXML DB Listenerを使用してHTTPリクエストを処理するPL/SQLゲートウェイです。この方法では、Oracle HTTP Serverおよびmod_plsqlのインストールや管理を行わずにWebアプリケーションを開発できます。


関連項目:

Web開発にPL/SQLを使用する方法の詳細は、第10章「PL/SQL Webアプリケーションの開発」を参照してください。

データベースに組み込まれたJavaサポートの概要

この項では、Javaアプリケーションをサポートする組込みデータベース機能の概要を説明します。データベースには、java.langjava.ioなどのコアJDKライブラリが含まれています。データベースでは、JDBCおよびSQLJなどのクライアント側Java標準がサポートされています。また、データベース内でデータ処理集中型のJavaコードを実行可能な、サーバー側のJDBCおよびSQLJドライバが提供されています。

内容は次のとおりです。


関連項目:

  • 『Oracle Database Java開発者ガイド』

  • 『Oracle Database JDBC開発者ガイドおよびリファレンス』

  • 『Oracle Database JPublisherユーザーズ・ガイド』


Oracle JVMの概要

Oracle Databaseとともに提供されるOracle JVM(Java仮想マシン)はJ2SEバージョン1.4.x仕様に準拠しており、データベース・セッション・アーキテクチャをサポートしています。

任意のデータベース・セッションにより、専用JVMをアクティブにできます。すべてのセッションで同じJVMコードおよびJVM静的値を共有しますが、個々のセッション領域では、指定したセッションのプライベート状態が保持され、ガベージが収集されます。

この設計のメリットは次のとおりです。

  • JavaアプリケーションにSQL操作と同じセッションの分離性およびデータの整合性が備わります。

  • データの整合性を保つために別のプロセスでJavaを実行する必要がありません。

  • Oracle JVMはメモリー・フットプリントが小さい堅牢なJVMです。

  • Oracle JVMにはデータベースと同じ線形対称マルチプロセッシング(SMP)スケーラビリティがあるため、何千もの同時Javaセッションをサポートできます。

Oracle JVMは、Oracle Databaseがサポートする全プラットフォームで一貫して動作します。Oracle JVMを使用して開発したJavaアプリケーションは、サポートされるどのプラットフォームにも簡単に移植できます。

Oracle JVMには、デプロイ時のネイティブ・コンパイラが含まれています。このコンパイラでは、Javaコードは1回のコンパイルで実行可能形式で格納され、複数のユーザーがこれを共有できるため、より早く効率的な起動が可能になります。

Oracle JVMでは、データベースのセキュリティ機能も使用できます。Javaクラスをコール可能にする前に、(Oracle JDeveloper、サード・パーティIDE、SQL*Plusまたはloadjavaユーティリティを使用して)データベース・スキーマにロードする必要があります。Javaクラスのコールは、データベース認証とデータベース認可、Java 2セキュリティ、および実行者権限(IR)や定義者権限(DR)を介して、保護および制御されます。

JDBCに対するOracle拡張機能の概要

Java Database Connectivity(JDBC)は、Oracle Databaseなどのオブジェクト・リレーショナル・データベースに対してJavaからSQL文を送信するApplication Program Interface(API)です。

JDBC標準では、次の4種類のJDBCドライバが定義されています。

説明
1 JDBC-ODBCブリッジ。ソフトウェアはクライアント・システム上にインストールする必要があります。
2 ネイティブ・メソッド(CまたはC++をコール)およびJavaメソッド。ソフトウェアはクライアント上にインストールする必要があります。
3 Pure Java。クライアントはソケットを使用してサーバー上のミドルウェアをコールします。
4 最もPure Javaの度合の高いソリューション。Javaソケットを使用してデータベースと直接対話します。

JDBCはX/OpenのSQL Call Level Interfaceに基づき、SQL92エントリ・レベル標準に準拠しています。

動的SQLを実行するにはJDBCを使用します。動的SQLでは、実行される埋込みSQL文が何であるかはアプリケーションが実行されるまでわからず、SQL文の作成に入力を必要とします。

Oracleによって実装されたドライバには、Sun社が定義したJDBC標準機能に対する拡張が含まれています。OracleのJDBCドライバの実装を次に説明します。JDBC標準のOracle Databaseでのサポートおよび様々なレベルでの拡張機能は、「JDBC標準に対するOracle Database拡張機能」を参照してください。

内容は次のとおりです。

JDBC Thinドライバ

JDBC Thinドライバはタイプ4(100% Pure Java)のドライバで、Javaソケットを使用してデータベース・サーバーに直接接続します。このドライバには、独自のTwo-Task Common(TTC)実装(Oracle NetのTCP/IPを軽量小型用に実装したもの)が含まれています。このドライバは、完全にJavaで作成されているため、プラットフォームには依存しません。

Thinドライバでは、クライアント側にOracleソフトウェアは必要ありません。サーバー側にはTCP/IPリスナーが必要です。このドライバは、WebブラウザをダウンロードするJavaアプレット内、またはOracleクライアント・ソフトウェアをインストールしないアプリケーション内で使用します。Thinドライバは自己完結型ですが、Javaソケットをオープンするため、ソケットをサポートするブラウザでのみ実行できます。

JDBC OCIドライバ

JDBC OCIドライバはタイプ2のJDBCドライバです。Cで作成されているOCI(Oracle Call Interface)をコールして、Oracle Databaseと対話します。したがって、ネイティブ・メソッドおよびJavaメソッドの両方を使用します。

OCIドライバを使用すると、Thinドライバより多くの機能(透過的アプリケーション・フェイルオーバー、高度なセキュリティ、高度なLOB操作など)にアクセスできます。

OCIドライバは、異なるOracle Databaseバージョン間の互換性を提供します。また、OCIドライバは、IPC、Named Pipes、TCP/IPおよびIPX/SPXを含むすべてのインストール済Oracle Netアダプタもサポートします。

OCIドライバは、ネイティブ・メソッド(JavaとCの組合せ)を使用するため、プラットフォーム固有のドライバです。Oracle Net、OCIライブラリ、COREライブラリなどのすべての依存ファイルとともに、Oracle8i以降のバージョンをクライアントにインストールする必要があります。OCIドライバは、通常、Thinドライバより実行速度が速くなります。

OCIドライバは、プラットフォーム固有のCライブラリを使用しており、Webブラウザにはダウンロードできないため、Javaアプレット用には適していません。Oracle Application Serverなどの中間層アプリケーション・サーバー内で実行中のJ2EEコンポーネントでは、OCIドライバを使用できます。Oracle Application Serverは、アプリケーションおよびブラウザ間のアクセスをサポートするミドルウェア・サービスおよびツール製品を提供します。

サーバー側JDBC内部ドライバ

サーバー側JDBC内部ドライバは、タイプ2のドライバで、データベース・サーバー内で実行されます。このため、大量データへのアクセスに必要なラウンドトリップの数が削減されます。このドライバと、JavaサーバーVM、データベース、実行速度を最大で10倍に上げるJavaネイティブ・コンパイラ、およびSQLエンジンは、すべて同じアドレス空間内で実行されます。

このドライバは、データベースで使用されるすべてのJavaプログラムのサーバー側サポートを提供します。PL/SQLストアド・サブプログラムおよびトリガーをコールすることもできます。

サーバー側JDBCドライバは、クライアント側ドライバと同じ機能および拡張機能を完全にサポートします。

JDBC標準に対するOracle Database拡張機能

Oracle Databaseには、JDBC 1.22標準に対する次の拡張機能が含まれます。

  • Oracleデータ型のサポート

  • 行のプリフェッチによるパフォーマンス強化

  • バッチ処理の実行によるパフォーマンス強化

  • ラウンドトリップを削減する問合せ列型の指定

  • DatabaseMetaDataコールの制御

Oracle Databaseは、JDBC 2.0標準のすべてのAPI(コアAPI、オプションのパッケージおよび多数の拡張機能を含む)をサポートしています。その拡張機能のいくつかには、データソース、JTAおよび分散トランザクションが含まれます。

Oracle Databaseは、JDBC 3.0標準の次の機能をサポートしています。

  • JDK 1.4のサポート

  • ローカル・トランザクションとグローバル・トランザクション間の切替え

  • トランザクションのセーブポイント

  • 接続プールによってプリコンパイルされたSQL文の再利用

JDBC 2.0のサンプル・プログラム

次の例では、JDBC 2.0のJNDIを使用してデータソースを検索する場合の推奨される方法を示します。

// import the JDBC packages
import java.sql.*;
import javax.sql.*;
import oracle.jdbc.pool.*;
...
   InitialContext ictx = new InitialContext();
   DataSource ds = (DataSource)ictx.lookup("jdbc/OracleDS");
   Connection conn = ds.getConnection();
   Statement stmt = conn.createStatement();
   ResultSet rs = stmt.executeQuery("SELECT last_name FROM employees");
   while ( rs.next() ) {
   out.println( rs.getString("ename") + "<br>");
   }
conn.close();

JDBC 2.0より前のサンプル・プログラム

次のソース・コードは、Oracle JDBC Thinドライバの登録、データベースヘの接続、Statementオブジェクトの作成、問合せの実行および結果セットの処理を行います。

SELECT文は、hr.employees表のlast_name列を取得してその内容をリストします。

import java.sql.*
import java.math.*
import java.io.*
import java.awt.*

class JdbcTest {
  public static void main (String args []) throws SQLException {
    // Load Oracle driver
    DriverManager.registerDriver (new oracle.jdbc.OracleDriver());

    // Connect to the local database
    Connection conn =
      DriverManager.getConnection ("jdbc:oracle:thin:@myhost:1521:orcl",
                                   "hr", "password");

    // Query the employee names
    Statement stmt = conn.createStatement ();
    ResultSet rset = stmt.executeQuery ("SELECT last_name FROM employees");

    // Print the name out
    while (rset.next ())
      System.out.println (rset.getString (1));
    // Close the result set, statement, and the connection
    rset.close();
    stmt.close();
    conn.close();
  }
}

Propertiesオブジェクトを使用するgetConnection()メソッドによって、JDBCドライバに対するOracle Databaseの拡張を実行します。Propertiesオブジェクトを使用すると、ユーザー、パスワードおよびデータベース情報の他に、行プリフェッチおよびバッチ実行を指定できます。

このコード内でOCIドライバを使用するには、Connection文を次のコードで置換します。MyHostStringは、tnsnames.oraファイル内のエントリです。

Connection conn = DriverManager.getConnection ("jdbc:oracle:oci8:@MyHostString",
    "hr", "password");

アプレットを作成する場合のgetConnection()およびregisterDriver()の文字列の指定は異なります。

SQLJアプリケーションでのJDBC

JDBCコードおよびSQLJコード(「Oracle SQLJの概要」を参照)は相互運用が可能なため、JDBCの動的SQL文をSQLJの静的および動的SQL文とともに使用できます。SQLJのイテレータ・クラスが、JDBCの結果セットに対応します。


関連項目:

JDBCの詳細は、『Oracle Database JDBC開発者ガイドおよびリファレンス』を参照してください。

Oracle SQLJの概要

SQLJは、Javaソース・コード内にSQL文を埋め込むためのANSI SQL-1999標準です。SQLJは、JDBCにかわり、Javaからのクライアント側およびサーバー側SQLデータ・アクセスを、より簡単なものにします。

SQLJのソース・ファイルには、SQL文が埋め込まれたJavaソースが含まれています。Oracle SQLJは、動的SQLおよび静的SQLをサポートします。動的SQLのサポートは、SQLJ標準に対するOracleの拡張機能です。


注意:

このマニュアルではSQLJとは、Oracle SQLJ拡張機能を含むOracle SQLJ実装を指します。

Oracle Databaseでは、SQLJをサポートするトランスレータおよびランタイム・ドライバを提供します。SQLJトランスレータは100% Pure Javaで、JDKバージョン1.1以上であれば、どのJVMにでも移植できます。

Oracle SQLJトランスレータは、次の作業を行います。

  • SQLJソースを、SQLJランタイム・ドライバへのコールを持つJavaコードに変換します。SQLJトランスレータは、ソース・コードをPure Javaのソース・コードに変換し、データベース・スキーマに対して静的SQL文の構文およびセマンティクスを確認し、ホスト変数とSQLとで型に互換性があるかどうかを検証します。

  • Javaコンパイラを使用して生成済Javaコードをコンパイルします。

  • ターゲット・データベース用にプロファイルを作成します(オプション)。SQLJで、Oracle Database固有にカスタマイズされたプロファイル・ファイルが生成されます。

Oracle Databaseは、Oracle JVMで実行されるSQLJのストアド・サブプログラムおよびトリガーをサポートします。SQLJは、JDeveloperと統合されています。SQLJに対するソース・レベルのデバッグ・サポートはJDeveloperで使用できます。

次に、単純で実行可能なSQLJ文の例を示します。employee表ではemployee_idが一意であるため、この文は値を1つ戻します。

String name;
#sql  { SELECT first_name INTO :name FROM employees WHERE employee_id=112 };
System.out.println("Name is " + name + ", employee number = " + employee_id);

SQL式に含まれる各ホスト変数(または、修飾名か複雑なJavaホスト式)の前にはコロン(:)が付きます。その他のSQLJ文はJavaの型を宣言します。たとえば、多数の値を取得する問合せのイテレータ(データベース・カーソルに関連する構造体)を宣言できます。

#sql iterator EmpIter (String EmpNam, int EmpNumb);

関連項目:

Oracle SQLJ構文の例および詳細は、『Oracle Database JPublisherユーザーズ・ガイド』を参照してください。

内容は次のとおりです。

SQLJのメリット

Javaに対するOracle SQLJ拡張機能を使用すると、埋込みSQLを介してデータベース操作を実行するアプリケーションを迅速に開発したり、簡単にメンテナンスできます。

特に、Oracle SQLJには次の特長があります。

  • 静的SQLからデータベースにアクセスする簡潔でわかりやすいメカニズムを提供します。アプリケーション内のSQLは、ほとんどの場合静的です。SQLJは、JDBCよりさらに簡潔で、エラーが発生しにくい静的SQL構文を提供します。

  • 変換時に構文およびセマンティクスの検証を行うSQLチェッカー・モジュールを提供します。

  • 柔軟なデプロイメント構成を提供します。これにより、クライアント側、サーバー側または中間層でSQLJを実装できるようになります。

  • ソフトウェア標準をサポートします。SQLJはベンダー・グループの努力の集積であり、携わったすべてのベンダーは、今後、SQLJをサポートしていきます。アプリケーションで複数ベンダーのデータベースにアクセスできます。

  • ソース・コード・レベルの移植性を提供します。各ベンダーのDBMSコードがベンダー固有の機能に依存していない場合は、実行可能ファイルをすべてのベンダーのDBMSで使用できます。

  • クライアントおよびサーバーで統一されたプログラミング・スタイルを施行します。

  • SQLJトランスレータと、グラフィカルな統合開発環境であるOracle JDeveloperを統合します。この開発環境では、SQLJ変換、Javaコンパイル、プロファイルのカスタマイズ、ソース・コード・レベルのデバッグがすべて1つの手順で提供されます。

  • Oracle Databaseデータ型の拡張機能が含まれています。

SQLJとJDBCの比較

JDBCは、Javaからデータベースに対する完全な動的SQLインタフェースを提供します。これにより、開発者はデータベースの操作を完全に制御できるようになります。SQLJを使用すると、Javaデータベース・プログラミングを簡略化して、開発の生産性を向上できます。

JDBCは、Javaからの動的SQL実行を詳細に制御します。SQLJは、特定のデータベース・スキーマ内でのSQL操作に対して、高レベルの静的バインディングを提供します。JDBCとSQLJには、次のような相違点があります。

  • SQLJのソース・コードは同等のJDBCソース・コードより簡潔です。

  • SQLJでは、データベース接続を使用して静的SQLコードの型チェックを行います。JDBCは完全に動的なAPIであるため、型チェックを行いません。

  • SQLJでは、問合せ出力および戻りパラメータに強い型指定を行えるため、コール時に型チェックを実行できます。JDBCは、SQLとの間でやりとりされる値についてコンパイル時の型チェックを行いません。

  • SQLJプログラムでは、SQL文の中にJavaバインド式を直接埋め込むことができます。JDBCでは、各バインド変数ごとに取得するか、設定用の文が個別に必要になるため、バインドは位置番号によって指定されます。

  • SQLJは、SQLストアド・サブプログラムのコールに関して簡潔な規則を提供します。たとえば、次のJDBCからの引用句では、ストアド・サブプログラム(この場合はfun)に対する汎用コールに次の構文を使用する必要があります。(この例では、SQL92構文およびOracle JDBC構文を示します。)

    prepStmt.prepareCall("{call fun(?,?)}");       //stored procedure SQL92
    prepStmt.prepareCall("{? = call fun(?,?)}");   //stored function SQL92
    prepStmt.prepareCall("begin fun(:1,:2);end;"); //stored procedure Oracle
    prepStmt.prepareCall("begin :1 := fun(:2,:3);end;");//stored func Oracle
    

    次に、相当するSQLJでの操作を示します。

    #sql {call fun(param_list) };  //Stored procedure
    // Declare x
    ...
    #sql x = {VALUES(fun(param_list)) };  // Stored function
    // where VALUES is the SQL construct
    

次に、SQLJおよびJDBCに共通するメリットを示します。

  • SQLJソース・ファイルにはJDBCコールを含めることができます。SQLJおよびJDBCは相互運用が可能です。

  • Oracle JPublisherはカスタムJavaクラスを生成します。このクラスは、SQLJまたはJDBCのアプリケーションでOracle Databaseオブジェクト型およびコレクション型にマップできます。

  • JavaとPL/SQLのストアド・サブプログラムは完全に互換性があります。

サーバー内のSQLJストアド・サブプログラム

SQLJアプリケーションは、次の方法でサーバーに格納して実行できます。

  • SQLJソース・コードをクライアント上で変換、コンパイルおよびカスタマイズ後に、loadjavaユーティリティを使用して、生成済のクラスおよびリソースをサーバーにロードします。通常、クラスはJavaアーカイブ(.jar)ファイルに格納されます。

  • または、loadjavaを使用してSQLJソース・コードをサーバーにロードし、サーバーの埋込みトランスレータを使用してこのコードを変換およびコンパイルします。


    関連項目:

    Oracle SQLJとともにストアド・サブプログラムを使用する方法の詳細は、『Oracle Database JPublisherユーザーズ・ガイド』を参照してください。

Oracle JPublisherの概要

Oracle JPublisherは、データベース中心のJavaクラスを手動で作成するプロセスを自動化するコード・ジェネレータです。Oracle JPublisherはクライアント側ユーティリティであり、データベース・システムに組み込まれています。Oracle JPublisherはコマンドラインから実行できます。また、Oracle JDeveloper IDEからは直接実行できます。

Oracle JPublisherでは、PL/SQLパッケージ、およびSQLオブジェクト型、VARRAY型やネストした表の型などのデータベース・オブジェクト型の検査後、対応するフィールドおよびメソッドを持つPL/SQLパッケージのラッパーであるJavaクラスを生成します。

生成されたJavaクラスをJavaクライアントまたはJ2EEコンポーネントに組み込んで使用し、オブジェクト型インスタンスとデータベース間で透過的に交換および転送できます。


関連項目:

『Oracle Database JPublisherユーザーズ・ガイド』

Javaストアド・サブプログラムの概要

Javaストアド・サブプログラムを使用すると、中間層で実行するプログラムから独立した、データベース・サーバーで実行するプログラムを実装できます。この方法でアプリケーションを構造化すると複雑にならず、再利用率、セキュリティ、パフォーマンスおよびスケーラビリティが向上します。

たとえば、永続性のあるデータが必要な操作を実行するJavaストアド・サブプログラム、およびプレゼンテーションやビジネス・ロジック操作を実行する別のプログラムを作成できます。

SQLを使用したJavaストアド・サブプログラム・インタフェースでは、PL/SQLと類似した実行モデルを使用します。


関連項目:

『Oracle Database Java開発者ガイド』

Oracle Database Webサービスの概要

Webサービスは、Javaアプリケーション開発用の分散コンピューティング・パラダイムを提供します。これは、JDBCなどの初期のJavaプロトコルのかわりとなり、アプリケーションがXMLおよびWebプロトコルを介して相互作用できるようにします。たとえば、電子部品のベンダーは、在庫管理のためにWebベースのプログラム・インタフェースを仕入先に提供できます。ベンダーは、プログラムの一部としてWebサービスを起動し、戻されたデータに基づいて新規の在庫を自動的に発注できます。

Webサービスで使用される主要なテクノロジは次のとおりです。

  • Webサービス記述言語(WSDL): XML文書作成のための標準書式。WSDLでは、Webサービスで実行できる操作、Webサービスの位置および起動方法が記述されます。特に、Webサービスが提供する操作およびパラメータ(パラメータ型を含む)が記述されます。また、WSDL文書には、Webサービスの位置、転送プロトコルおよび起動スタイルも記述されます。

  • Simple Object Access Protocol(SOAP)メッセージ: Webサービスで使用するXMLベースのメッセージ・プロトコル。SOAPでは、HTTP、FTP、SMTPまたはJMSなどの特定の転送メカニズムは指定しませんが、ほとんどのWebサービスはHTTPまたはHTTPSを使用するメッセージを受信します。

  • Universal Description, Discovery, and Integration(UDDI)ビジネス・レジストリ: Webサービスをインターネット上でリスト表示するディレクトリ。UDDIレジストリはよく電話帳と比較されます。たとえば、一意の識別子のリスト表示(ホワイト・ページ)、ビジネス・カテゴリのリスト表示(イエロー・ページ)およびサービス・プロトコルへのバインド指示(グリーン・ページ)という具合です。

Webサービスでは、様々な方法およびプロトコルを使用できます。次に例を示します。

  • 同期ディスパッチ(通常)または非同期ディスパッチが可能です。

  • Webサービスは、引数が送信されて応答が戻されるRPCスタイルの操作、または一方向のSOAP文書交換などのメッセージ・スタイルで起動できます。

  • 様々なエンコーディング・ルール(リテラルまたはエンコード)を使用できます。

Webサービスは、必要な情報が事前にすべてわかっている場合は静的に起動でき、操作およびトランスポート・エンドポイントをその場で検出できる場合は動的に起動できます。

Oracle Databaseは、Webサービス・プロバイダまたはWebサービス・コンシューマのいずれかとして機能できます。プロバイダとしてデータベースを使用すると、ストアド・サブプログラム、データ、メタデータ、およびキューイング・システムやメッセージング・システムなどのデータベース・リソースに対するアクセスを共有および切断できます。

Webサービス・プロバイダとしてOracle Databaseを使用すると、次のような非接続環境および異機種間環境が提供されます。

  • 作成に使用された言語に依存しないストアド・サブプログラムの公開

  • SQL問合せおよびXQueryの公開

Javaでのサブプログラムの作成の概要

サブプログラムは、一連の文をカプセル化する名前付きブロックです。これらは、モジュール方式でメンテナンス性の高いアプリケーションの構成に使用できるという点で構築ブロックに似ています。このような名前付きブロックを作成し、次に、loadjavaコマンド、SQLのCREATE FUNCTIONCREATE PROCEDUREまたはCREATE PACKAGE文を使用してブロックを定義します。これらのJavaメソッドは引数を受け入れ、次のものからコールできます。

  • SQLのCALL

  • 埋込みSQLのCALL

  • PL/SQLのブロック、サブプログラムおよびパッケージ

  • DML文

  • OCI、Pro*C/C++およびOracle DeveloperなどのOracle開発ツール

  • JDBC、SQLJ文、CORBA、Enterprise JavaBeansなどのOracle Javaインタフェース

  • オブジェクト型からのメソッドのコール

内容は次のとおりです。

Javaでのデータベース・トリガーの作成の概要

データベース・トリガーとは、DML操作で特定の表が変更された場合など、特定のイベントが発生した場合に、Oracle Databaseが自動的に開始(起動)するストアド・プロシージャです。トリガーを使用すると、ビジネス・ルールを徹底し、無効な値の格納を防ぐことができます。また、各アプリケーションでチェックおよびクリーン・アップ操作を実行する必要性が減少します。

ストアド・サブプログラムおよびトリガーにJavaを使用する理由

  • ストアド・サブプログラムおよびトリガーは1回コンパイルするのみで簡単に使用でき、メンテナンス性が高く、必要なメモリーおよび計算オーバーヘッドが少なくて済みます。

  • ネットワークのボトルネックが回避され、応答時間が短縮されます。分散アプリケーションの作成および使用がより容易になります。

  • 計算集中型のサブプログラムは、サーバーで実行する方が高速に実行されます。

  • 実行者権限ではなく、定義者権限によって実行するストアド・サブプログラムおよびトリガーのみをユーザーに対して使用可能にすることで、データ・アクセスを制御できます。

  • PL/SQLおよびJavaのストアド・サブプログラムが相互に起動できます。

  • サーバー内のJavaはJava言語仕様(JLS)に従ってSQLJ標準を使用できるため、Oracle Database以外のデータベースもサポートされます。

  • ストアド・サブプログラムおよびトリガーは、場所が異なるサイトおよび様々なアプリケーション内で再利用できます。

Pro*C/C++の概要

Pro*C/C++プリコンパイラは、プログラマがCまたはC++のソース・ファイル内にSQL文を埋め込むことができるようにするためのソフトウェア・ツールです。Pro*C/C++はソース・ファイルを入力として読み込み、CまたはC++のソース・ファイルを出力します。この出力ソース・ファイルで埋込みSQL文がOracle Databaseランタイム・ライブラリ・コールによって置き換えられ、CまたはC++コンパイラによってコンパイルされます。

プリコンパイル中またはその後のコンパイル中にエラーが検出された場合は、プリコンパイラの入力ファイルを変更して、プリコンパイルおよびコンパイルの2つの手順を再実行します。

内容は次のとおりです。

Pro*C/C++アプリケーションの実装

次に、スキーマhr内のemployees表を問い合せるCソース・ファイル内の単純なコード部分を示します。

...
#define  UNAME_LEN   10
...
int   emp_number;
/* Define a host structure for the output values of a SELECT statement. */
/* No declare section needed if precompiler option MODE=ORACLE          */
struct {
    VARCHAR  last_name[UNAME_LEN];
    float    salary;
    float    commission_pct;
} emprec;
/* Define an indicator structure to correspond to the host output structure. */
struct {
    short emp_name_ind;
    short sal_ind;
    short comm_ind;
} emprec_ind;
...
/* Select columns last_name, salary, and commission_pct given the user's input
/* for employee_id. */
    EXEC SQL SELECT last_name, salary, commission_pct
        INTO :emprec INDICATOR :emprec_ind
        FROM employees
        WHERE employee_id = :emp_number;
...

埋込みSELECT文と対話型(SQL*Plus)のSELECT文との違いはごくわずかです。すべての埋込みSQL文はEXEC SQLで始まります。コロン(:)がすべてのホスト(C)変数の前に付きます。データおよび(データ値がNULLの場合または文字列が切り捨てられたときに設定される)インジケータの戻り値は、(前述のコード部分にあるような)構造体、配列または構造体配列の中に格納できます。結果セットの値が複数の場合でも、前述の例(社員番号が一意のため結果が1つのみ)と同様の方法で簡単に処理されます。埋込みSQLでは、列および表の実際の名前を使用します。

プリコンパイラ・オプションのデフォルト値を使用することも、リソースの使用方法、エラーの通知方法、出力形式およびカーソル(特定の接続またはSQL文に対応するカーソル)の管理方法を制御するための値を入力することもできます。カーソルは、結果セットの値が複数の場合に使用します。

オプションは、構成ファイル内に入力するか、コマンドラインに入力するか、またはEXEC ORACLEで始まる特殊な文でソース・コード内に直接入力します。エラーが見つからなかった場合は、次に、Cプログラムの場合と同じように出力ソース・ファイルをコンパイルおよびリンクして実行します。

クライアントからのサーバー・データベース・アクセスを様々なプラットフォーム上に配置できるように作成するには、プリコンパイラを使用します。Pro*C/C++を使用すると、独自のユーザー・インタフェースを自由に設計し、既存のアプリケーションに自由にデータベース・アクセスを追加できます。

埋込みSQL文を作成する前に、SQL*Plusで対話型SQLをテストし、その後、少し変更を加えることで、埋込みSQLアプリケーションのテストを開始できます。

Pro*C/C++機能の特長

Pro*C/C++の機能のいくつかを次に簡単に説明します。機能全体の詳細は、『Pro*C/C++プログラマーズ・ガイド』を参照してください。

  • アプリケーションは、CまたはC++のいずれでも作成できます。

  • スレッド・パッケージをサポートしているプラットフォームの場合は、マルチスレッド・プログラムを作成できます。同時接続は、シングル・スレッド・アプリケーションでもマルチスレッド・アプリケーションでもサポートされます。

  • PL/SQLブロックを埋め込むことによって、パフォーマンスを向上できます。PL/SQLブロックは、ユーザーが独自に作成したか、またはOracle Databaseパッケージで提供されている、JavaやPL/SQLのサブプログラムを起動できます。

  • プリコンパイラ・オプションを使用すると、プリコンパイル時のみでなく、実行時にもSQL文またはPL/SQL文の構文およびセマンティクスを確認できます。

  • PL/SQLおよびJavaのストアド・サブプログラムを起動できます。COBOLまたはCで作成したモジュールは、Pro*C/C++から起動できます。共有ライブラリ内の外部Cサブプログラムは、プログラムから起動できます。

  • 様々な環境で実行できるように、条件付きでコード・セクションをプリコンパイルできます。

  • パフォーマンスを向上させるには、コード内で配列、構造体または構造体配列をホスト変数およびインジケータ変数として使用します。

  • エラーおよび警告を処理してデータの整合性を保証することができます。エラーをどのように処理するかは、プログラマが制御します。

  • プログラムで内部データ型からC言語データ型(またはその逆)に変換できます。

  • 低レベルのCインタフェースおよびC++インタフェースであるOracle Call Interface(OCI)およびOracle C++ Call Interface(OCCI)は、プリコンパイラ・ソース内で使用できます。

  • Pro*C/C++は、動的SQL(変数の値および文の構文をユーザーが入力できる手法)をサポートします。

  • Pro*C/C++で、特殊なSQL文を使用してユーザー定義のオブジェクト型を含む表を操作できます。Object Type Translator(OTT)で、データベース内のオブジェクト型および名前付きコレクション型を、ソースに含める構造体およびヘッダーにマップします。

  • ネストした表およびVARRAYという2種類のコレクション型が一連のSQL文でサポートされています。これによって、データを高度に制御できます。

  • ラージ・オブジェクトは、別の一連のSQL文によってアクセスされます。

  • 動的SQLのための新しいANSI SQL標準が新しいアプリケーション用にサポートされ、様々なホスト変数を使用してSQL文を実行できます。動的SQLのための従来の手法も、既存のアプリケーションで使用できます。

  • グローバリゼーション・サポートによって、マルチバイト・キャラクタおよびUCS2 Unicodeデータを使用できます。

  • スクロール可能カーソルを使用して、結果セット内を移動できます。たとえば、結果セットの最終行のフェッチ、または結果セット内の絶対位置または相対位置へのジャンプが可能です。

  • 接続プールは、いくつかの名前付き接続で共有されているデータベースへの物理接続のグループです。接続プールのオプションを有効化すると、Pro*C/C++アプリケーションのパフォーマンスを最適化できます。接続プールのオプションは、デフォルトでは無効になっています。

Pro*COBOLの概要

Pro*COBOLプリコンパイラは、プログラマがCOBOLのソース・コード・ファイル内にSQL文を埋め込めるようにするためのソフトウェア・ツールです。Pro*COBOLはソース・ファイルを入力として読み取り、COBOLソース・ファイルを出力します。この出力ソース・ファイルでは埋込みSQL文がOracle Databaseランタイム・ライブラリ・コールによって置き換えられ、COBOLコンパイラによってコンパイルされます。

プリコンパイル中またはその後のコンパイル中にエラーが検出された場合は、プリコンパイラの入力ファイルを変更して、プリコンパイルおよびコンパイルの2つの手順を再実行します。

内容は次のとおりです。

Pro*COBOLアプリケーションの実装

次に、スキーマhr内のemployees表を問い合せるソース・ファイル内の単純なコード部分を示します。

...
 WORKING-STORAGE SECTION.
*
* DEFINE HOST INPUT AND OUTPUT HOST AND INDICATOR VARIABLES.
* NO DECLARE SECTION NEEDED IF MODE=ORACLE.
*
 01  EMP-REC-VARS.
     05  EMP-NAME    PIC X(10) VARYING.
     05  EMP-NUMBER  PIC S9(4) COMP VALUE ZERO.
     05  SALARY      PIC S9(5)V99 COMP-3 VALUE ZERO.
     05  COMMISSION  PIC S9(5)V99 COMP-3 VALUE ZERO.
     05  COMM-IND    PIC S9(4) COMP VALUE ZERO.
...
 PROCEDURE DIVISION.
...
     EXEC SQL
         SELECT last_name, salary, commission_pct
         INTO :EMP-NAME, :SALARY, :COMMISSION:COMM-IND
         FROM employees
         WHERE employee_id = :EMP-NUMBER
     END-EXEC.
...

埋込みSELECT文と対話型(SQL*Plus)のSELECT文との違いはごくわずかです。すべての埋込みSQL文はEXEC SQLで始まります。コロン(:)がすべてのホスト(COBOL)変数の前に付きます。SQL文はEND-EXECによって終了します。データおよび(データ値がNULLの場合または文字列が切り捨てられたときに設定される)インジケータの戻り値は、(前述のコード部分にあるような)グループ項目、表、またはグループ項目の表に格納できます。結果セットの値が複数の場合でも、前述の例(社員番号が一意のため結果が1つのみ)と同様の方法で簡単に処理されます。埋込みSQLでは、列および表の実際の名前を使用します。

プリコンパイラ・オプションのデフォルト値を使用することも、リソースの使用方法、エラーの通知方法、出力形式およびカーソル(特定の接続またはSQL文に対応するカーソル)の管理方法を制御するための値を入力することもできます。

オプションは、構成ファイル内に入力するか、コマンドラインに入力するか、またはEXEC ORACLEで始まる特殊な文でソース・コード内に直接入力します。エラーが見つからなかった場合は、COBOLプログラムの場合と同じように出力ソース・ファイルをコンパイルおよびリンクして実行できます。

クライアントからのサーバー・データベース・アクセスを様々なプラットフォーム上に配置できるように作成するには、プリコンパイラを使用します。Pro*COBOLを使用すると、独自のユーザー・インタフェースを自由に設計し、既存のCOBOLアプリケーションに自由にデータベース・アクセスを追加できます。

使用できる埋込みSQL文はANSI規格に準拠しているため、Oracle Net経由で多数のデータベースのデータにアクセスできます。

埋込みSQL文を作成する前に、SQL*Plusで対話型SQLをテストし、その後、少し変更を加えることで、埋込みSQLアプリケーションのテストを開始できます。

Pro*COBOL機能の特長

次に、Pro*COBOLの機能のいくつかを簡単に説明します。

  • PL/SQLまたはJavaのストアド・サブプログラムを起動できます。PL/SQLブロックを埋め込むことによって、パフォーマンスを向上できます。PL/SQLブロックでは、独自に作成したか、またはOracle Databaseパッケージで提供されているサブプログラムを起動できます。

  • プリコンパイラ・オプションを使用すると、カーソル、エラー、構文検査、ファイル形式などの処理方法を定義できます。

  • プリコンパイラ・オプションを使用すると、プリコンパイル時のみでなく、実行時にもSQL文またはPL/SQL文の構文およびセマンティクスを確認できます。

  • 様々な環境で実行できるように、条件付きでコード・セクションをプリコンパイルできます。

  • パフォーマンスを向上させるには、コード内で表、グループ項目またはグループ項目の表をホスト変数またはインジケータ変数として使用します。

  • エラーおよび警告の処理方法をプログラミングし、データの整合性を保証できます。

  • Pro*COBOLは、動的SQL(変数の値および文の構文をユーザーが入力できる手法)をサポートします。


    関連項目:

    詳細は、『Pro*COBOLプログラマーズ・ガイド』を参照してください。

OCIおよびOCCIの概要

Oracle Call Interface(OCI)およびOracle C++ Call Interface(OCCI)は、APIです。これらによって、3GL固有のサブプログラム起動を使用して、Oracle Databaseにアクセスしたり、SQL文実行のすべての過程を制御するアプリケーションを作成できます。これらのAPIは次のものを提供します。

OCIを使用すると、データベース内のデータおよびスキーマをC言語のようなホスト・プログラミング言語を使用して操作できます。OCCIは、C++言語との使用に適したオブジェクト指向インタフェースです。これらのAPIは、標準的なデータベース・アクセス関数および検索関数のライブラリを、実行時にアプリケーション内にリンクされる動的ランタイム・ライブラリ(OCILIB)の形式で提供します。これによって、SQLまたはPL/SQLを3GLプログラムに埋め込む必要がなくなります。


関連項目:

OCIおよびOCCIコールの詳細は、次を参照してください。
  • 『Oracle Call Interfaceプログラマーズ・ガイド』

  • 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

  • 『Oracle Streamsアドバンスト・キューイング・ユーザーズ・ガイド』

  • 『Oracle Databaseグローバリゼーション・サポート・ガイド』

  • 『Oracle Databaseデータ・カートリッジ開発者ガイド』


内容は次のとおりです。

OCIおよびOCCIのメリット

OCIおよびOCCIは、Oracle Databaseに対する他のアクセス方法に比べて、次のような優れたメリットがあります。

  • アプリケーション設計のすべての面に対する細かな制御

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

  • 使い慣れた3GLプログラム手法およびアプリケーション開発ツール(ブラウザやデバッガなど)の使用

  • 動的SQL、メソッド4のサポート

  • 様々なプラットフォームにおいて、すべてのOracle Databaseのプログラム・インタフェースが使用可能

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

  • サーバー・メタデータ層を表す記述機能

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

  • 配列のデータ操作言語(DML)の機能拡張

  • コミット要求を実行に対応付けてラウンドトリップを減らす機能

  • 透過的プリフェッチ・バッファを使用して問合せを最適化し、ラウンドトリップを減らす機能

  • OCIおよびOCCIハンドルに対する相互排他(mutex)ロックの実装が不要になるスレッド・セーフティ

  • 非ブロック化モードでのサーバー接続コールが実行中か、または完了できない場合、制御がOCIコードまたはOCCIコードに戻る機能

OCIおよびOCCI関数

OCIとOCCIの両方とも、次の種類の関数があります。

関数の種類 目的
リレーショナル データベース・アクセスを管理し、SQL文を処理します。
ナビゲーション データベースから取得したオブジェクトを操作します。
データベースのマッピングおよび操作 Oracle Databaseデータ型のデータ属性を操作します。
外部サブプログラム PL/SQLからCコールバックを作成します。

OCIおよびOCCIアプリケーションの手続き型要素および非手続き型要素

OCIおよびOCCIを使用すると、SQLが提供する強力な非手続き型データ・アクセス機能と、CやC++など数多くのプログラミング言語で提供される手続き型機能を組み合せたアプリケーションを開発できます。手続き型言語および非手続き型言語には次のような特性があります。

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

  • 手続き型言語プログラムでは、文の実行の多くが、その前後の文や、ループまたは条件ブランチなどの制御構造に依存します。これらはSQLでは使用できません。このような言語は、手続き型であるためにSQLより複雑になりますが、非常に柔軟で強力でもあります。

OCIプログラムまたはOCCIプログラムで非手続き型言語の要素と手続き型言語の要素を組み合せることができるため、構造化プログラミング環境の中でOracle Databaseに簡単にアクセスできます。

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

SELECT name FROM employees WHERE empno = :empnumber

このSQL文では、:empnumberがアプリケーションによって提供される値のプレースホルダです。

また、SQLの手続き型拡張言語である、OracleのPL/SQLを使用することもできます。PL/SQLで開発するアプリケーションは、SQLのみで作成したアプリケーションより強力で柔軟です。OCIおよびOCCIは、Oracle Databaseにあるオブジェクトにアクセスし、操作する機能も提供しています。

OCIアプリケーションまたはOCCIアプリケーションの作成

図1-1に示すとおり、OCIまたはOCCIプログラムは非データベース・アプリケーションと同じ方法でコンパイルおよびリンクします。特別な事前処理またはプリコンパイルは必要ありません。

図1-1 OCIまたはOCCIの開発過程

OCIまたはOCCIの開発過程
「図1-1 OCIまたはOCCIの開発過程」の説明


注意:

OCIプログラムおよびOCCIプログラムを正しくリンクするには、プラットフォームによってはOCIライブラリおよびOCCIライブラリ以外のライブラリを含める必要があります。必要な追加ライブラリの詳細は、プラットフォーム固有のOracleマニュアルを参照してください。

Oracle Data Provider for .NET(ODP.NET)の概要

Oracle Data Provider for .NET(ODP.NET)は、Oracle Databaseのデータ・プロバイダの実装です。

ODP.NETはOracle Database固有のAPIを使用して、.NETアプリケーションからデータベース機能およびデータへの高速かつ高信頼アクセスを提供します。また、ODP.NETは、Microsoft .NET Framework Class Libraryで入手可能なクラスおよびインタフェースを使用し、継承します。

Oracle Provider for OLE DBを使用するプログラマに対して、ADO(ActiveX Data Objects)では簡単なプログラミング・モデルを表すオートメーション・レイヤーを提供します。ADO.NETからも類似したプログラミング・モデルがパフォーマンスの向上のために提供されますが、オートメーション・レイヤーはありません。さらに重要な点として、ADO.NETモデルを使用することで、ODP.NETなどのネイティブ・プロバイダはOracle Database固有の特定の機能およびデータ型を公開できるようになります。


関連項目:

『Oracle Data Provider for .NET開発者ガイド』

次に、Oracle Databaseに接続し、接続を切断する前にバージョン番号を表示する単純なC#アプリケーションを示します。

using System;
using Oracle.DataAccess.Client;

class Example
{
  OracleConnection con;

  void Connect()
  {
    con = new OracleConnection();
    con.ConnectionString = "User Id=hr;Password=password;Data Source=oracle";
    con.Open();
    Console.WriteLine("Connected to Oracle" + con.ServerVersion);
  }

  void Close()
  {
    con.Close();
    con.Dispose();
  }

  static void Main()
  {
    Example example = new Example();
    example.Connect();
    example.Close();
  }
}

注意:

その他のサンプルは、ディレクトリORACLE_BASE\ORACLE_HOME\ODP.NET\Samplesで提供されます。

OraOLEDBの概要

Oracle Provider for OLE DB(OraOLEDB)は、高いパフォーマンスを提供し、OLE DBコンシューマがOracleデータへ効率的にアクセスできるようにするOLE DBデータ・プロバイダです。通常、この開発者ガイドでは、OLE DBまたはADOを介してOraOLEDBを使用していることを想定しています。


関連項目:

『Oracle Provider for OLE DB開発者ガイド』

Oracle Objects for OLE(OO4O)の概要

Oracle Objects for OLE(OO4O)は、Microsoft COM AutomationおよびActiveXテクノロジをサポートするプログラミング言語またはスクリプト言語であれば、どの言語からでもOracle Database内に格納されているデータに簡単にアクセスできるように設計された製品です。このような言語には、Visual Basic、Visual C++、Visual Basic For Applications(VBA)、IIS Active Server Pages(VBScriptおよびJavaScript)などがあります。

OO4Oの使用方法の詳細は、OO4Oのオンライン・ヘルプを参照してください。

Oracle Objects for OLEは、次のソフトウェア・レイヤーで構成されています。

図1-2に、OO4Oのソフトウェア・コンポーネントを示します。

図1-2 ソフトウェア・レイヤー

ソフトウェア・レイヤー
「図1-2 ソフトウェア・レイヤー」の説明

内容は次のとおりです。

OO4Oオートメーション・サーバー

OO4Oオートメーション・サーバーは、Oracle Databaseに接続し、SQL文およびPL/SQLブロックを実行してその結果にアクセスする一連のCOMオートメーション・オブジェクトです。

Microsoft ADOなどのCOMベースのデータベース接続APIとは異なり、OO4Oオートメーション・サーバーは、特にOracle Databaseを対象に開発されたものです。

これは、Oracle Database固有の機能にアクセスするために最適化されたAPIを提供します。このAPIを使用せずにODBCまたはOLEデータベース固有のコンポーネントからアクセスすると、煩雑で非効率です。

OO4Oは、Visual BasicまたはExcelなどで開発される典型的な2層クライアント/サーバー・アプリケーションから、Microsoft Internet Information Server(IIS)のWebサーバー・アプリケーションやMicrosoft Transaction Server(MTS)などの複数層アプリケーション・サーバー環境にデプロイされるアプリケーション・サーバーまで、広範囲な環境にわたり、Oracle Databaseに効率的かつ簡単にアクセスするための重要な機能を提供します。

次のような機能があります。

  • PL/SQLおよびJavaのストアド・サブプログラム、および無名PL/SQLブロックの実行サポート。これには、PL/SQLカーソルなど、ストアド・サブプログラムのパラメータとして使用されるOracle Databaseデータ型のサポートが含まれます。「Oracle LOBおよびオブジェクト・データ型のサポート」を参照してください。

  • 問合せの結果セットに簡単かつ効率的にアクセスし、スクロール可能で更新可能なカーソルのサポート。

  • 効率的なWebサーバー・アプリケーション開発のための、スレッド・セーフなオブジェクトおよび接続プール管理機能。

  • Oracle Databaseオブジェクト・リレーショナル・データ型およびLOBデータ型の完全サポート。

  • AQの完全サポート。

  • 配列の挿入および更新のサポート。

  • Microsoft Transaction Server(MTS)のサポート。

OO4Oオブジェクト・モデル

図1-3に、Oracle Objects for OLEオブジェクト・モデルを示します。

図1-3 オブジェクトおよびそのリレーション

オブジェクトおよびそのリレーション
「図1-3 オブジェクトおよびそのリレーション」の説明

内容は次のとおりです。

OraSession

OraSessionオブジェクトは、アプリケーション内で使用されるOraDatabase、OraConnectionおよびOraDynasetオブジェクトのコレクションを管理します。

通常は、1つのアプリケーションに対してOraSessionオブジェクトが1つ作成されますが、アプリケーション内とアプリケーション間で共有する名前付きOraSessionオブジェクトを作成できます。

OraSessionオブジェクトは、アプリケーションの最上位オブジェクトです。これは、Oracle Objects for OLEメソッドではなく、CreateObject VB/VBA APIによって作成される唯一のオブジェクトです。次に、OraSessionオブジェクトの作成方法を示すコード・フラグメントを示します。

Dim OraSession as Object
Set OraSession = CreateObject("OracleInProcServer.XOraSession")

OraServer

OraServerは、Oracle Databaseへの物理的なネットワーク接続を表します。

OraServerインタフェースは、Oracle Call Interfaceで提供される接続多重化機能を公開して使用可能にするために導入されています。OraServerオブジェクトの作成後、OpenDatabaseメソッドをコールすることでこのオブジェクトに複数のユーザー・セッション(OraDatabase)を連結できます。この機能は、IISなどのように、N層分散環境でOracle Objects for OLEを使用するアプリケーション・コンポーネント用として特に便利です。

多数のアクティブ・ユーザー・セッションを持ったOracle Databaseにアクセスする際に接続多重化機能を使用することによって、サーバーの処理要件およびリソース要件が削減され、サーバーのスケーラビリティも向上します。

OraServerを使用すると、複数のOraDatabaseオブジェクト(多重化)間で単一接続を共有できる一方で、OraSessionから取得された各OraDatabaseには独自の物理接続を持つことができます。

OraDatabase

OraDatabaseインタフェースは、トランザクション制御用メソッド、およびOracle Databaseオブジェクト型を表すインタフェース作成用のメソッドを追加します。スキーマ・オブジェクトの属性は、OraDatabaseインタフェースのDescribeメソッドを使用して取得できます。

Oracle8iより前のリリースでは、OraSessionインタフェースのOpenDatabaseメソッドをコールしてOraDatabaseオブジェクトを作成していました。Oracle Netの別名、ユーザー名およびパスワードが、引数としてこのメソッドに渡されます。Oracle8i以上では、このメソッドをコールするとOraServerオブジェクトが暗黙的に作成されます。

OraDatabaseオブジェクトはOraServerインタフェースのOpenDatabaseメソッドを使用して作成できます。

トランザクション制御メソッドは、OraDatabase(ユーザー・セッション)レベルで使用できます。トランザクションは、Read-Write(デフォルト)、Serializable、またはRead-onlyとして開始できます。トランザクション制御メソッドには、次が含まれます。

  • BeginTrans

  • CommitTrans

  • RollbackTrans

次に例を示します。

UserSession.BeginTrans(OO4O_TXN_READ_WRITE)
UserSession.ExecuteSQL("delete emp where empno = 1234")
UserSession.CommitTrans

OraDynaset

OraDynasetオブジェクトによって、SQLのSELECT文で作成されたデータを参照および更新できます。

OraDynasetオブジェクトは1つのカーソルと考えることができますが、実際にOraDynasetのセマンティクスを実装するには実カーソルをいくつか使用する場合があります。OraDynasetオブジェクトは、サーバーからフェッチされたデータのローカル・キャッシュを自動的に保持し、ブラウズ・データ内のスクロール可能カーソルを透過的に実装します。大規模な問合せの場合は、かなりのローカル・ディスク領域が必要になる場合があります。アプリケーションを開発する場合は、ディスクの使用が少なくなるように、問合せをさらに微調整することをお薦めします。

OraField

OraFieldオブジェクトは、ダイナセットの行内の単一の列またはデータ項目を表します。

現在行が更新中の場合は、OraFieldオブジェクトは現在更新中の値を表します。ただし、この値はまだデータベースにコミットされていない可能性があります。

フィールドのValueプロパティへの割当ては、(Editを使用して)レコードを編集中の場合、または(AddNewを使用して)新しいレコードを追加中の場合のみ許可されます。他の方法でフィールドのValueプロパティにデータを割り当てると、エラーが発生します。

OraMetaDataおよびOraMDAttribute

OraMetaDataオブジェクトは、データベース内の特定のスキーマ・オブジェクトに関する記述情報を表すOraMDAttributeオブジェクトのコレクションです。

OraMetaDataオブジェクトは、次の3つの列を持つ表として表すことができます。

  • メタデータの属性名

  • メタデータの属性値

  • Valueが別のOraMetaDataオブジェクトかどうかを示すFlag

OraMetaDataオブジェクトに含まれているOraMDAttributeオブジェクトは、序数を使用した添字またはプロパティの名前を使用してアクセスできます。コレクションにない添字を参照すると、NULLOraMDAttributeオブジェクトが戻されます。

OraParameterおよびOraParameters

OraParameterオブジェクトは、SQL文またはPL/SQLブロック内のバインド変数を表します。

OraParameterオブジェクトは、OraDatabaseオブジェクトのOraParametersコレクションを介して間接的に作成、アクセスおよび削除されます。各パラメータには、それぞれ識別名および関連値があります。SQL文またはPL/SQL文の中でパラメータ名をプレースホルダとして使用すると、(オブジェクトの記述に示されているとおり)他のオブジェクトのSQL文およびPL/SQL文にパラメータを自動的にバインドできます。このようにパラメータを使用することで、動的な問合せを容易にし、プログラムのパフォーマンスを向上させます。

OraParamArray

OraParamArrayオブジェクトは、OraParameterオブジェクトによって表されるスカラー型バインド変数に対して、SQL文またはPL/SQLブロック内の配列型バインド変数を表します。

OraParamArrayオブジェクトは、OraDatabaseオブジェクトのOraParametersコレクションを介して間接的に作成、アクセスおよび削除されます。各OraParamArrayオブジェクトには、それぞれ識別名および関連値があります。

OraSQLStmt

OraSQLStmtオブジェクトは、単一のSQL文を表します。OraDatabaseオブジェクトからOraSQLStmtオブジェクトを作成するには、CreateSQLメソッドを使用します。

OraSQLStmtオブジェクトは、作成中およびリフレッシュ中に、パラメータ名をSQL文でプレースホルダとして使用して、使用可能なすべての関連入力パラメータを指定されたSQL文に自動的にバインドします。これによって、SQL文の再解析をしなくてもSQL文の実行パフォーマンスが向上します。

SALARYプレースホルダに別の値を使用して、後で同一の問合せを実行するために、OraSQLStmtオブジェクトを使用できます。次に例を示します(updateStmtは、ここではOraSQLStmtオブジェクトのことです)。

OraDatabase.Parameters("SALARY").value = 200000
updateStmt.Parameters("ENAME").value = "KING"
updateStmt.Refresh

OraAQ

OraAQオブジェクトは、OraDatabaseインタフェースのCreateAQメソッドを起動してインスタンス化します。このオブジェクトは、データベース内にあるキューを表します。

Oracle Objects for OLEは、Oracle Advanced Queuing(AQ)機能にアクセスするインタフェースを提供します。これによって、Visual Basicなどの一般的なCOMベースの開発環境からAQ機能にアクセスできます。Oracle Advanced Queuingの詳細は、『Oracle Streamsアドバンスト・キューイング・ユーザーズ・ガイド』を参照してください。

OraAQMsg

OraAQMsgオブジェクトは、キューまたはデキューされるメッセージをカプセル化します。メッセージは、ユーザー定義型またはRAW型です。

Oracle Advanced Queuingの詳細は、『Oracle Streamsアドバンスト・キューイング・ユーザーズ・ガイド』を参照してください。

OraAQAgent

OraAQAgentオブジェクトはメッセージの受信者を表し、複数コンシューマに対応したキューに対してのみ有効です。これは、OraAQMsgの子です。

OraAQAgentオブジェクトは、AQAgentメソッドをコールしてインスタンス化することもできます。次に例を示します。

Set agent = qMsg.AQAgent(name)

OraAQAgentオブジェクトは、AddRecipientメソッドをコールしてインスタンス化することもできます。次に例を示します。

Set agent = qMsg.AddRecipient(name, address, protocol).

Oracle LOBおよびオブジェクト・データ型のサポート

Oracle Objects for OLE(OO4O)は、Oracle Databaseでのオブジェクト・データ型およびLOBのインスタンスの、アクセスおよび操作を完全にサポートします。図1-4に、OO4Oがサポートするデータ型を示します。

このようなデータ型のインスタンスは、データベースからフェッチするか、あるいは入力変数または出力変数として、ストアド・サブプログラムを含むSQL文およびPL/SQLブロックに渡すことができます。すべてのインスタンスは、属性の動的アクセスおよび操作用のメソッドを提供するCOMオートメーション・インタフェースにマップされます。

図1-4 サポートされているOracle Databaseデータ型

サポートされているOracle Databaseデータ型
「図1-4 サポートされているOracle Databaseデータ型」の説明

内容は次のとおりです。

OraBLOBおよびOraCLOB

Oracle Objects for OLEのOraBlobインタフェースおよびOraClobインタフェースは、データ型BLOBCLOB、およびNCLOBのラージ・データベース・オブジェクトに対して操作を実行するメソッドを提供します。ここでは、BLOBCLOBおよびNCLOBデータ型をLOBデータ型といいます。

LOBデータは、ReadメソッドおよびCopyToFileメソッドを使用してアクセスします。

LOBデータは、WriteAppendEraseTrimCopyCopyFromFileおよびCopyFromBfileメソッドを使用して変更します。行の中のLOB列の内容を変更する前に、行のロックを取得する必要があります。LOB列がOraDynasetオブジェクトのフィールドの場合は、ロックはEditメソッドをコールして取得します。

OraBFILE

Oracle Objects for OLEのOraBFileインタフェースは、データ型BFILEのラージ・データベース・オブジェクトに対して操作を実行するメソッドを提供します。

BFILEは、データベース表領域外のオペレーティング・システム・ファイル内に格納される大規模なバイナリ・データ・オブジェクトです。

Oracle Data Control

Oracle Data Control(ODC)は、Visual Basicおよびカスタム・コントロールをサポートするその他の開発ツールにおける、ビジュアル・コントロール(編集、テキスト、リストおよびグリッド)とOracle Databaseとの間のデータ交換を簡素化するために設計されたActiveXコントロールです。

ODCは、Oracle Databaseと、それにバインドされたグリッド・コントロールなどのビジュアルなデータ認識コントロールからの情報の流れを処理するエージェントとして機能します。ODCは、データの表示および編集などの様々なユーザー・インタフェース(UI)・タスクを管理します。また、データベースに対する問合せの実行および結果の管理も行います。

Oracle Data Controlは、Visual Basicに含まれているMicrosoftデータ・コントロールに相当します。Visual Basicのデータ・コントロールを使い慣れている場合は、Oracle Data Controlの使用方法をすぐに理解できます。データ認識コントロールとODCとの間の通信は、Microsoftの指定したプロトコルによって制御されます。

Oracle Objects for OLE C++クラス・ライブラリ

Oracle Objects for OLE(OO4O)C++クラス・ライブラリは、Oracle Object Serverに対するプログラム・アクセスを提供するC++クラスのコレクションです。このクラス・ライブラリはOLEオートメーションを使用して実装されていますが、クラス・ライブラリの使用にはOLE開発キットまたはOLE開発知識は必要ありません。このライブラリを使用すると、C++開発者は、OO4OインタフェースにアクセスするCOMクライアント・コードを作成する必要がありません。

その他の情報源

Oracle Objects for OLEの詳細は、OO4O製品とともに提供されている次のオンライン・ヘルプを参照してください。

  • Oracle Objects for OLEヘルプ

  • Oracle Objects for OLE C++クラス・ライブラリ・ヘルプ

Oracle Objects for OLEの使用例は、Oracle DatabaseインストールのORACLE_HOME\OO4Oディレクトリや次のマニュアルにあるサンプルを参照してください。

  • 『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』

  • 『Oracle Streamsアドバンスト・キューイング・ユーザーズ・ガイド』

プログラミング環境の選択

新しい開発プロジェクト用のプログラミング環境を選択します。

簡単な選択基準の例を次に示します。

内容は次のとおりです。

プリコンパイラまたはOCIの選択

通常、プリコンパイラ・アプリケーションには同等のOCIアプリケーションより少ないコードが含まれているため、生産性が向上します。

データベースを詳細に制御する必要がある場合は、OCIアプリケーション(純OCIアプリケーションまたはOCIコールが埋め込まれたプリコンパイラ・アプリケーション)の方が適しています。

  • OCIでは、セッションの多重化および移行をより詳細に制御できます。

  • OCIでは、リストを含む任意の構造体に使用できるコールバックを使用して、動的バインドおよび定義が提供されます。

  • OCIにはメタデータを扱う多くのコールがあります。

  • OCIでは、クライアント・アプリケーションに対して非同期のイベントを通知できます。クライアントに対し、他のクライアントに伝播するための通知を生成する手段が提供されます。

  • OCIでは、任意のエラー・メッセージを戻す前に、DML文は配列を使用してできるだけ多くの反復を完了します。

  • 特殊な目的のためのOCIコールには、アドバンスト・キューイング、グローバリゼーション・サポート、データ・カートリッジおよび日時データ型のサポートが含まれます。

  • OCIコールは、Pro*C/C++アプリケーションに埋め込むことができます。

PL/SQLまたはJavaの選択

JavaおよびPL/SQLには、組込みパッケージおよびライブラリがあります。

PL/SQLおよびJavaは、サーバー内で相互運用します。JavaからPL/SQLパッケージを実行するか、またはJavaラッパーでPL/SQLクラスをラップして、分散CORBAおよびEnterprise JavaBeansクライアントから起動できるようにできます。表1-1に、PL/SQLパッケージ、およびそれぞれの相当するJavaでの操作を示します。

表1-1 PL/SQLおよびJavaの等価性

PL/SQLパッケージ 相当するJavaでの操作

DBMS_ALERT

SQLJまたはJDBCでパッケージをコールします。

DBMS_DDL

JDBCを使用します。

DBMS_JOB

Javaストアド・サブプログラムを持つジョブをスケジューリングします。

DBMS_LOCK

SQLJまたはJDBCでコールします。

DBMS_MAIL

JavaMailを使用します。

DBMS_OUTPUT

サブクラスoracle.aurora.rdbms.OracleDBMSOutputStreamまたはJavaストアド・サブプログラムDBMS_JAVA.SET_STREAMSを使用します。

DBMS_PIPE

SQLJまたはJDBCでコールします。

DBMS_SESSION

JDBCを使用してALTER SESSION文を実行します。

DBMS_SNAPSHOT

SQLJまたはJDBCでコールします。

DBMS_SQL

JDBCを使用します。

DBMS_TRANSACTION

JDBCを使用してALTER SESSION文を実行します。

DBMS_UTILITY

SQLJまたはJDBCでコールします。

UTL_FILE

JAVAUSERPRIV権限を付与してJava I/Oエントリ・ポイントを使用します。


JavaおよびPL/SQLは、ともにデータベース内でアプリケーションを作成するために使用できます。使用に対するガイドラインを次に示します。

  • データベース・アクセス用に最適化されたPL/SQL

    PL/SQLは、SQLと同じデータ型を使用します。したがって、特に大量のデータが扱われる場合、データベース・アクセスに処理が集中する場合、またはバルク操作が使用された場合に、より簡単にSQLのデータ型を使用できます。また、SQLを使用すると、Javaより速く操作できます。

  • データベースと統合されたPL/SQL

    PL/SQLは、データ・カプセル化、情報隠蔽、オーバーロードおよび例外処理をSQLに提供する拡張機能です。

    Oracle9iでは、一部の高度なPL/SQL機能がJavaで使用できない場合があります。たとえば、自律型トランザクションやリモート・データベース用のdblink機能などです。PL/SQLでのコード開発は、通常、Javaを使用した場合より速く行うことができます。

  • JavaおよびPL/SQLが持つオブジェクト指向機能

    Javaには、分散システムを開発するための継承、ポリモフィズムおよびコンポーネント・モデルがあります。PL/SQLには、継承および型進化(型のメソッドおよび属性を、その型を使用するサブタイプおよび表データを保持しながら変更する機能)があります。

  • オープン分散アプリケーションに使用されるJava

    Javaは、PL/SQLより豊富な型体系を持つ、オブジェクト指向言語です。JavaはCORBA(クライアントに様々なコンピュータ言語を持つことができます)およびEnterprise JavaBeansを使用できます。PL/SQLパッケージはCORBAまたはEnterprise JavaBeansクライアントから起動できます。

    Javaによって、XMLツール、Internet File SystemまたはJavaMailを実行できます。

    また、多くのJavaベース開発ツールが存在します。