...

Java ™による ストアド・プロシージャの作成

by user

on
Category: Documents
13

views

Report

Comments

Transcript

Java ™による ストアド・プロシージャの作成
Java™に よる
ストアド・プロシージャの作成
Oracle テクニカル・ホワイトペーパー
1998 年 11 月
Java に よ る ス ト ア ド ・ プ ロ シ ー ジ ャ の 作 成
はじめに
この 3 年で、Java は、Web を通じてダウンロードできる簡単なグラフィカル・ユーザー・インタフェース
(GUI)プログラムを作成するためのプログラミング言語から、エンタープライズおよびインターネット・
アプリケーションを作成・実行するためのプラットフォームへと成長しました。Java はもともと、クライア
ント・アプリケーション向けの言語として開発されたものですが、今ではネットワーク・コンピューティン
グの実現を支援する多様なアプリケーションに使用されています。Java アプリケーションは、小さな組込み
デバイスでも、ハイエンドなメインフレーム・クラスのサーバーでも、同じように簡単に実行できます。ビ
ジネス・ロジックを作成し、そのロジックをスケーラブルなサーバーで実行するための基盤が固まるにつれ、
Java の真の可能性は今こそ実現しようとしています。
Oracle の強力なデータベース・プラットフォームは、業界で広く普及した Java で構築するにはうってつけ
です。Oracle8i™のリリースにより、Oracle はネットワーク・コンピューティングに基づくイントラネット/
インターネット・アプリケーション実行のため、まさにスケーラブルで、ハイ・パフォーマンス、かつ堅牢
なプラットフォームを提供することになりました。Oracle は、Java Virtual Machine(VM)をそのデータベー
ス・エンジンに組み込み、アプリケーション開発者が多様なプログラミング・モデルでアプリケーションを
作成するための機能を提供しています。アプリケーション・ロジックの作成に従来のストアド・プロシージ
ャを使用しているデータベース・プログラマはもとより、コンポーネント・ベースのプログラミングに慣れ
ている開発者も、CORBA オブジェクトまたは Enterprise JavaBeans™としてアプリケーションを作成して、
Oracle のスケーラブルな Java プラットフォームで実行することができます。
本書では、Java を使用してアプリケーションを作成し、そのアプリケーションを Java ストアド・プロシー
ジャとして Oracle データベースで実行する方法を説明します。本書は、Oracle の Java Virtual Machine のア
ーキテクチャおよびプログラミング・モデルを説明する一連の Oracle テクニカル・ペーパーの一部です。
本書は次のような 5 つのセクションで構成されています。
·
第 1 部では、Java が人気の高いサーバー・プログラミング言語となった理由と、スケーラブルな Java
サーバーを作成する上での課題について触れています。また、Oracle8i の Java Virtual Machine を概説し、
その設計目標、および主な設計上の特徴も取り上げます。
·
第 2 部では、Oracle8i がサポートするさまざまなプログラミング・モデル(ストアド・プロシージャと
コンポーネント指向の作成)を概説します。
·
第 3 部では、Java でストアド・プロシージャを書き、Oracle8i データベースで実行する方法について詳
細な例を取り上げます。ここでは、アプリケーションを作成し、Oracle データベースにアプリケーショ
ンをロードし、ストアド・プロシージャとして Java アプリケーションを公開して、さらに多様なコン
テキストで Java ストアド・プロシージャを呼び出すための詳しい手順を説明します。
·
第 4 部では、Java、Structured Query Language(構造型問合せ言語:SQL)および PL/SQL の間での相互
動作性について説明します。Java が SQL および PL/SQL を呼出す方法を示す例を紹介し、Java ストア
ド・プロシージャを呼び出すためのさまざまなシナリオを説明します。
·
最後の第 5 部では、Java ストアド・プロシージャを使用してアプリケーションを作成し、Oracle8i の Java
Virtual Machine で実行することの利点を説明します。
Java によるストアド・プロシージャの作成、Oracle テクニカル・ホワイトペーパー
1
1998 年 11 月
Oracle Corporation 発行の
「Developing Stored Procedures In Java」
の翻訳版です。
Java の使いやすさと簡易性
アプリケーション開発者の間で Java の人気が高まったのはなぜでしょう?その理由は主に、Java を使用す
るとアプリケーション開発者の生産力が高まるからです。Java は、最新の安定したオブジェクト指向言語だ
からです。Java がこれまでにない人気を呼んだ理由は、次のような 3 つの利点にあります。
·
アプリケーション開発がより簡単になる−Java は、ネットワーキング、マルチスレッド、自動ガベージ・
コレクションのサポートなど、他の言語よりもアプリケーション開発をいっそう簡単にする機能を提
供します。
·
アプリケーションがプラットフォームを選ばない−Java Virtual Machine をサポートしていれば、組込み
システムからメインフレームまで、どのプラットフォームでも同一の Java バイナリを実行できます。
これにより、アプリケーションを移植する必要性が、一切不要とまではいかなくても、かなり減少し
ます。
·
アプリケーションをコンポーネントとして作成できる−Java は、他のアプリケーション開発者が書いた
コンポーネントと組み合わせることができるコンポーネントを設計およびパッケージすることを可能
にするコンポーネント・モデル、JavaBeans を提供します。Enterprise JavaBeans は、Java のコンポーネ
ント・モデルをサーバー・サイド・コンポーネントにまで拡張します。サーバー・サイド・コンポー
ネントを使用すれば、アプリケーション開発者は「ビジネス・ロジック」を作成して、そのロジック
をアプリケーションに組み込める 1 つのコンポーネントとしてパッケージすることができます。
JavaBeans コンポーネント・モデルは、プラグ・アンド・プレイ・ソフトウェア・モジュールとして確
かな市場を築くことでしょう。この新しいアプリケーション開発モデルにより、どのプラットフォー
ムでもカスタマイズおよび実行でき、企業のビジネス・ニーズの変化に適応するアプリケーションを
短時間で組み立てることができます。
エンタープライズ・アプリケーションのための Java−サーバー言語
当初 Java に人気があったのは、クライアント・マシンで実行する「アプレット」と呼ばれる小さなアプリ
ケーションの形式で、Web ページに動的コンテンツを追加するのに適していたからです。しかし、Java は、
将来の主な使用目的−つまり、クライアント/サーバー構成でもイントラネット/インターネット構成でも実
行できるエンタープライズおよびインターネット・アプリケーションを書くこと−に向かって急速に移行し
つつあります。サーバー言語として Java に人気が集まることには、いくつかの理由があります。
·
Java は安全な言語であるため、データベースの統合に最適である。データベースは安全な環境でなけれ
ばならず、複数のミッション・クリティカル・アプリケーションの基盤を提供する必要があるので、
Oracle はデータベースの一貫性を損なう恐れのあるアプリケーション・コードをデータベース内で実行
することを許しません。たとえば、Oracle は、C や C++などの「安全でない」言語で書かれたアプリケ
ーション・コードをデータベースと同じアドレス・スペースで実行することを許可していません。確
かに、C のような言語は、アプリケーション開発者に極めて高い柔軟性を提供しますが、いくつかの落
とし穴もあります。熟練した C や C++のプログラマーでさえも、次のような間違いをおかすことがあ
ります。
-
配列境界の上書き−配列と文字列はポインタとして操作しますから、プログラマは配列や文字列の
境界をうっかり上書きしてしまうことがあります。
-
メモリの漏れや破壊−メモリの割当てと割当て解除はプログラマの仕事ですから、メモリの破壊や
漏れなど、さまざまなプログラミングの問題が起きることがあります。
アプリケーションに上記のようなエラーがあると、データベースの一貫性が損なわれ、ミッション・クリテ
ィカル・アプリケーションが中断する恐れがあります。対照的に、Java は強く型指定された言語で、配列や
文字列のネイティブ・サポートと、メモリ管理の組込みサポートが含まれています。Java 言語に組み込まれ
たガベージ・コレクション・メカニズムにより、アプリケーション開発者はメモリの割当ておよび割当て解
除から解放されますから、メモリの破壊や漏れが起きる心配が無くなります。
Java によるストアド・プロシージャの作成、Oracle テクニカル・ホワイトペーパー
2
1998 年 11 月
Oracle Corporation 発行の
「Developing Stored Procedures In Java」
の翻訳版です。
·
安全な言語と言うだけでなく、サーバー側の Java もクライアント側の Java と同じように多数の利点を
アプリケーション開発者に提供してくれます。Java はプラットフォームに依存しないため、Java で作成
されたアプリケーション・ロジックは Java をサポートするどのサーバーでも簡単に実行できます。こ
れにより、多層環境で真のアプリケーションのパーティション化を実現できます。Java で書かれたア
プリケーション・プログラムは、アプリケーションを書き直すことなく、簡単に別のサーバーに移植
できます。企業は、これらの利点を利用して、製品開発時間を短縮し、システム開発費および運営費
を低減できます。
·
Java は C 言語に匹敵する表現力を持つ機能が満載された言語です。クライアントまたはサーバー環境
であらゆる種類のアプリケーションの作成に使用できます。
Oracle8i の Java Virtual Machine−エンタープライズ・ソリューション
Java は、エンタープライズ・アプリケーションの作成に最適な言語ですが、Oracle8i がリリースされるまで
は、市場にエンタープライズ・クラスの Java サーバーはありませんでした。これまでは、ほとんどのアプ
リケーション・サーバーおよびデータベース・サーバー・ベンダーが、わずかな拡張が加えられてきた
JavaSoft の Java VM(JDK)を使用して、サーバー・サイド Java アプリケーションを実行してきました。こ
のため、エンタープライズ・ユーザーもかなりの欠点を甘んじて受け入れなければなりませんでした。たと
えば、JavaSoft の Java VM はシングル・ユーザー環境を重視したクライアント・サイド VM として開発され
たものであるため、エンタープライズ・アプリケーションに対応するスケーラビリティに欠けています。ま
た、エンタープライズ・アプリケーションを実行するために必要なパフォーマンス、堅牢性、高可用性も提
供しません。記憶域の自動管理やマルチスレッド、動的ロードに対応する必要があるため、スケーラブルな
Java Virtual Machine をインプリメントすることは、かなり骨が折れます。シングル・オブジェクト・メモリ
を使用し、スレッドを介してマルチ・ユーザーに対応するスケール変更を試みるクライアント・サイド VM
は、スケーラブルではないのです。
Oracle8i は、Sun の Java 仕様に適合する Java VM をインプリメントして、エンタープライズ・アプリケーシ
ョンおよびインターネット Java アプリケーションを作成するためのクラス最高のサーバー・プラットフォ
ームを提供します。Oracle8i の Java Virtual Machine には、次のような特徴があります。
·
ハイ・パフォーマンス:トランザクション処理および意思決定支援アプリケーションに対応します。
·
スケーラビリティ:極めて多数のユーザーをサポートします。
·
高可用性:エンタープライズ・アプリケーションおよびインターネット・アプリケーションに求めら
れる 24 時間年中無休の可用性を実現します。
·
運用性:所有コストを低減し、質の高いサービスを提供します。
·
標準との適合と Java Runtime のサポート:アプリケーション開発者が標準の Java Integrated Development
Environment(統合開発環境:IDE)を活用して、アプリケーションを作成し、そのアプリケーションを
Oracle データベースで実行することを可能にします。
Java によるストアド・プロシージャの作成、Oracle テクニカル・ホワイトペーパー
3
1998 年 11 月
Oracle Corporation 発行の
「Developing Stored Procedures In Java」
の翻訳版です。
Oracle8i
PL/SQL
SQL
Net8
IIOP
ORB
Java
JDBC
VM
図 1:Oracle8i の Java Virtual Machine
クラス最高の Java サーバーを実現するため、Oracle はハイ・パフォーマンスな Java VM を Oracle8i データ
ベースに組み込みました(図 1)。Oracle では、エンタープライズ対応済みの Oracle8™インフラストラクチ
ャを基盤に、Oracle8i Java Virtual Machine に次のような主な設計上の特徴を開発しました。
·
専用メモリ・マネージャ−スケーラビリティ、パフォーマンスおよびリレーショナル・データベース
管理システム(RDBMS)統合向けに最適化されています。オブジェクト・メモリ・アーキテクチャは、
効率的な内部フレームワークを提供し、ガベージ・コレクションの方法を最適化できます。
·
ネイティブな Java コンパイラ−解釈コードに比べて 15 倍から 40 倍のパフォーマンス向上を実現します。
·
Oracle Multithreaded Server(MTS)との統合−10,000 以上の同時セッションに対応するスケーラビリテ
ィをサポートします。
Oracle8i VM アーキテクチャについての詳細は、Oracle テクニカル・ホワイトペーパー「インターネット・
コンピューティングを実現する」を参照してください。
Java は、電子商取引やセルフサービス・アプリケーション、オンライン・ショッピングなど、インターネッ
ト上で新しいサービスを提供するために独立ソフトウェア・ベンダーが作成しているまったく新しい種類の
アプリケーションにも最適です。情報の公開や表示には HTML や XML が広く使用されていますが、Java
はこれらの新しいインターネット・アプリケーションを作成するための主流言語になることでしょう。
Oracle8i のエンタープライズ Java プラットフォームは、このような新しいアプリケーションに最適な実行手
段を提供し、Oracle のお客様に幅広いアプリケーション・ソリューションを確実にお届けします。これらの
新種のアプリケーションは、スケーラブルでハイ・パフォーマンスなサーバーで実行でき、標準のインター
ネット・プロトコルを介して多様なクライアントからアクセスできるモジュール形式の Java コンポーネン
トとして作成されることになります。
Java によるストアド・プロシージャの作成、Oracle テクニカル・ホワイトペーパー
4
1998 年 11 月
Oracle Corporation 発行の
「Developing Stored Procedures In Java」
の翻訳版です。
Oracle 8i の Java Virtual Machine を使用したプログラミング・モデル
アプリケーション開発者は、2 つの異なるプログラミング・モデルを使用して、Oracle8i の Java Virtual Machine
(VM)で Java アプリケーションを作成し、実行することができます。プロシージャ・プログラミング・ス
タイルに慣れているアプリケーション開発者は、PL/SQL などの言語を使用してビジネス・アプリケーショ
ン・ロジックを作成していました。作成されたビジネス・ロジックは、ストアド・プロシージャやファンク
ションまたはトリガーとしてデータベースで実行されるストアド・プログラム・ユニットとして実行されま
した(ゆえに、「ストアド・プロシージャ」と呼ばれます)。ストアド・プロシージャは、実行可能な単位
としてまとめられる一連の SQL 文および PL/SQL 文です。ストアド・プロシージャは、データベース内に
定義され、格納されるため、SQL データへの効率的なアクセスを提供します。ストアド・プロシージャは
データベースで実行するため、アプリケーションとデータベースの間のネットワーク・トラフィックが軽減
され、アプリケーションとシステムのパフォーマンスが向上します。Oracle8i のリリースを期に、アプリケ
ーション開発者は Java を使用してビジネス・ロジックを作成し、それをストアド・プロシージャやファン
クション、トリガーとしてデータベースで実行できるようになりました。Java で作成されたストアド・プロ
シージャは、SQL や PL/SQL と同じアドレス・スペースで実行するので、SQL または PL/SQL を使用して書
かれたビジネス・ロジックもシームレスに呼び出し、相互動作することができます。
Oracle8i の Java Virtual Machine がサポートするもう 1 つのプログラミング・モデルは、コンポーネント・ベ
ースのプログラミングです。コンポーネント・ベースのプログラミングは、アプリケーション開発者にもた
らす利点ゆえに目を見張るような成長を見せてきました。この利点には、アプリケーション・コードが再使
用可能であること、異なるベンダーのコンポーネントをつなげてアプリケーションを容易に組み立てられる
こと、そして開発の柔軟性です。Oracle8i の Java VM は、Java で書かれた CORBA オブジェクトと Enterprise
JavaBeans という 2 種類のコンポーネント Application Programming Interface(アプリケーション・プログラミ
ング・インタフェース:API)をサポートします。CORBA コンポーネントと Enterprise JavaBeans は、Oracle8i
サーバーで容易に実行でき、Oracle8i の Java Virtual Machine 固有のスケーラビリティ、信頼性、パフォーマ
ンス、そして高可用性を利用できます。
PL/SQL は同じデータ型を共有するため、SQL とシームレスに動作します。サーバーのプログラミングを可
能にするオープンな汎用プログラミング言語、PL/SQL に代わるオープン・システムが Java です。その上、
Oracle8i の Java の実装は総合的な機能を備えています。言い換えれば、これまで PL/SQL を使用してきたす
べての状況で Java を使用することができるのです。さらに、標準の Java または SQLJ を使用して、データ
ベース・ストアド・プロシージャを実行できます。SQLJ は、Java プログラムに静的 SQL 文を埋め込むため
の標準の方法です(ちょうど、C プログラムに静的 SQL 文を埋め込むのに使用される Pro*C™に相当します)。
一般的にストアド・プロシージャやトリガーは、データ中心型または SQL 中心型なので、SQLJ はストアド・
プロシージャやトリガーを作成するのに最適です。また組込み SQL 言語はこの目的にぴったりです。Java
ストアド・プロシージャは、次のような 3 つの異なるランタイム・コンテキストを実行できます。
·
その 1、Java ストアド・プロシージャを使用して、Java で最上位 SQL 関数およびプロシージャを書く
ことができます。これにより、ユーザーは Java で書かれた任意のビジネス・ロジックで SQL を拡張す
ることが可能になります。PL/SQL とまったく同じように、SQL DML の中または最上位で使用できま
す。
·
その 2、データベース・トリガーも Java で実装できます。トリガーは、データベース行の変化に関連す
るさまざまな状況で実行できます。Oracle8i のビューは完全に更新可能ですから、トリガーも更新や挿
入、削除操作をサポートするようにビューを拡張できます。Oracle がサポートする 5 種類のトリガーす
べてを Java で書けるようになりました。
·
その 3、Oracle8 はオブジェクト・リレーショナル機能を提供し、ユーザーは SQL で複雑なデータ型や
複合データ型を定義できるようになりました。Oracle8 では、ユーザーはこれらのタイプのメソッドを
PL/SQL でインプリメントしたり、あるいは外部プロシージャを C または C++でインプリメントするこ
とが可能でしたが、Oracle8i ではさらに、これらを Java でインプリメントする機能が加わりました。
Java によるストアド・プロシージャの作成、Oracle テクニカル・ホワイトペーパー
5
1998 年 11 月
Oracle Corporation 発行の
「Developing Stored Procedures In Java」
の翻訳版です。
Java ストアド・プロシージャを書く方法
Oracle の Java Virtual Machine の概要と、Java ストアド・プロシージャが何であるかを説明したところで、い
よいよ Oracle 環境で実際にインプリメントする方法を説明することにしましょう。まず、クライアント上
の Java 実行環境と Oracle8i サーバー上の Java 実行環境の共通点と相違点を理解するために、この 2 つの環
境を対比してみることにします。次に、Java プログラムが概念上データベースにどのようにロード、格納、
解釈および実行されるかを説明します。最後に、例を挙げて、Oracle データベースで Java プログラムを作
成および実行するための手順を詳しく説明します。
まず、JavaSoft の JDK を使用して、クライアント環境で Java プログラムがどのようにコンパイルされ、実
行されるかを説明しましょう。Java ソース・プログラムがコンパイルされると、各パブリック・クラスがオ
ペレーティング・システム環境内で別々の.class ファイルに格納されます。Java プログラムの実行に必要な
Java クラスは、物理的に異なるファイル・システム・ディレクトリに入れることができます。Java Virtual
Machine が Java クラスをロードすると、CLASSPATH 環境変数に指定された異なるファイル・システム・デ
ィレクトリを検索して、実行に必要なクラスへの参照が解釈されます。
Oracle8i データベースで Java プログラムをコンパイルして実行する場合も、これに似たメカニズムが使用さ
れます。Java プログラムを書いてテストしたら、Oracle8i、すなわちデータベースの Java VM にロードして、
すべての参照を解釈する必要があります。データベースは、Java ソース・テキストや標準の Java .class ファ
イル、Java アーカイブ(.jar)など、Java プログラムをロードできる多様な形式をサポートしています。デ
ータベースにロードされた Java ソースは、データベース内の Java バイト・コード・コンパイラで自動的に
コンパイルされます。データベースにロードされた Java プログラムは、ちょうど PL/SQL プログラム・ユ
ニットがデータベースに格納されるように、データベース・スキーマに「ライブラリ・ユニット」として格
納されます。各 Java ソース・ファイルと Java クラスはそれぞれのライブラリ・ユニットに格納されます。
Java プログラムを実行するために必要な Java ライブラリ・ユニットは、物理的に異なるデータベース・ス
キーマに入れることができます。
クライアント実行環境と同様に、Java クラスを実行するにはその前にクラスの分析をする必要があります。
データベース内の Java クラスはライブラリ・ユニットとして格納されているため、Java 名への外部参照が
すべてバインドされていると、Java クラス・ライブラリ・ユニットが分析されます。CLASSPATH と同じく、
RESOLVER がサーバー側の実行に必要なクラス全てを分析し解決するまたはリンクするためにデータベー
スによって使用されます。RESOLVER は検索パスを提供しますが、ファイル・システム・ディレクトリを
使用するのではなく、SQL スキーマが指定されます。RESOLVER が Java の完全名に対応するバイナリを検
索する場合、その名前に一致するライブラリ・ユニットが見つかるまで順にスキーマ・リストを検索します。
さらに、個々のクラスを含むライブラリ・ユニットについて依存リストが作成されます。ここでの依存リス
トは、PL/SQL の場合と同じ役割を果たします。つまり、参照ライブラリ・ユニットに変更がない限り、Java
プログラムは事実上、「事前リンク」されていてすぐに実行できる状態であると言うことです。RESOLVER
の構文は次のとおりです。
RESOLVER ((<match string> <schema name>) ...)
<march string>は、Java 名または Java 言語のインポート文に指定できるワイルドカード名、あるいは任意の
名前と一致する 1 つのワイルドカード‘*’です。<schema name>は、対応する「ライブラリ・ユニット」
の検索対象となるスキーマを指定します。次の例を参照してください。
RESOLVER ((“some.particular.class” FRED)
(“com.oracle.employee.*” SCOTT)
(* PUBLIC))
Java によるストアド・プロシージャの作成、Oracle テクニカル・ホワイトペーパー
6
1998 年 11 月
Oracle Corporation 発行の
「Developing Stored Procedures In Java」
の翻訳版です。
Oracle8i の Java 実行環境について少し理解できたところで、今度は Oracle8i サーバーに Java プログラムを
ロードして実行するために必要な手順を説明します。Oracle8i で Java ストアド・プログラムを書く作業は、
Java コードを書く、Java コードをロードして分析する、コードを発行する、コードを実行するという 4 つの
手順に分けることができます。
Java コードを書く
標準の Java ツールまたはエディタを使用して、ストアド・プロシージャを作成するための Java プログラム
を書き始めます。Oracle8i は、Java アプリケーションを作成し、そのアプリケーションを Oracle8i データベ
ースで実行することを容易にする Java 向けの Integrated Development Environment(統合開発環境:IDE)−
JDeveloper™−を提供します。機能に満足できるまで、Java コードを作成、テストおよびデバッグしてくだ
さい。
以下の例は、Java クラス、'emp'と 2 つの Java メソッド('approve_raise'および'sal_grade')を使用して、Java
ストアド・プロシージャを作成し、Oracle 環境で実行する方法を説明するものです。メソッド'approve_raise'
は、社員の現在の給与と昇給を使用して、その社員に与えられた昇給がビジネス・ロジックに準じたものか
どうかを検証します。メソッド'sal_grade'は、社員の現在の給与をもとに、社員が属する等級を返します。
この例の Java コードは SQL や PL/SQL を呼び出しません。次のセクションでは、この例を膨らませて、Java
が SQL とどのように相互動作するかを説明します。
// File: emp.java
package com.oracle.employee;
public class emp {
public static String sal_grade (float current_sal) {
if (current_sal > 0 && current_sal < 50000) return “ MTS”;
if (current_sal >= 50000 && current_sal < 100000) return “ SMTS”;
return “Salary out of Range”;
}
public static void approve_raise (float current_sal, float raise,
float new_sal [ ]) {
// new_sal is an array of size one to handle OUT parameters in
Java.
float percent_raise = (raise / current_sal) * 100;
if (percent_raise > 15 || percent_raise < 5)
new_sal[0] = -1;
else {
new_sal[0] = current_sal + raise;
}
}
}
Java によるストアド・プロシージャの作成、Oracle テクニカル・ホワイトペーパー
7
1998 年 11 月
Oracle Corporation 発行の
「Developing Stored Procedures In Java」
の翻訳版です。
Java コードのロードと解決
Java プログラムを書いたら、次はデータベースにロードする必要があります。ここでは、Java をデータベー
スにロードするために使用される異なる形式と、Java をロードする方法、そしてデータベースに Java をロ
ードできる場所について説明します。
·
Java は 3 つの形式でデータベースにロードできる−まず、Java プログラムは Java ソースとしてデータ
ベースにロードし、データベース内のバイト・コード・コンパイラでコンパイルできます。第 2 に、
データベース外部でコンパイルされた Java ソース・ファイルも、.class ファイルまたは.jar ファイルと
してデータベースにロードすることができます。最後に、Java リソース・ファイル(標準の移植可能
フォーマットの Java データ:たとえば、イメージなど)もデータベースにロードできます。
·
Java は 2 つの方法で Oracle8i にロードできる−まず、SQL*Plus®から“CREATE JAVA...”という形式の
新しい DDL コマンドを発行して、Java ソース、バイナリ、またはリソース・ファイルをデータベース
にロードすることができます。Oracle8i データベースは、オペレーティング・システム・レベルのバイ
ナリ・ファイルから、またはデータベースの LOB 列から、という 2 つの入力ソースを受け付けます。
データベースにロードされる各 Java クラスのライブラリ・ユニットの名前は、それが入っているクラ
ス名から導出されます。たとえば、Java クラスの完全修飾名が com.oracle.employee.emp である場合、デ
ータベースの対応するライブラリ・ユニット名は、com/oracle/employee/emp になります。
以下の例は、Java クラス・ファイルをデータベースにロードするのに使用できる 2 つの異なるメカニズムを
示します。
·
·
オペレーティング・システム・レベルでバイナリ・ファイルを使用する:
-
サーバーのファイル・システムにディレクトリ・オブジェクトを作成する。
-
SQL> CREATE DIRECTORY bfile_dir as ‘/home/user/com/oracle/employee’;
-
文が処理される。
-
次に、“CREATE JAVA CLASS...”DDL 文を使用して、Java クラス・ファイルをロードする。
-
SQL> CREATE OR REPLACE JAVA CLASS USING BFILE (bfile_dir, ‘emp.class’);
-
文が処理される。
データベースの LOB 列を使用する:
-
1.
Java emp.class ファイルをデータベースの表の LOB 列にロードする。(詳細はここには掲載し
ません。)
-
2.
-
SQL> CREATE JAVA CLASS RESOLVER USING BLOB
-
表の LOB 列から Java クラスを作成する。
> (SELECT ALOB FROM LOB_TABLE WHERE ID=123);
文が処理される。
ロード・プロセスを簡略化するため、Oracle8i は、データベースに Java をロードするプロセスを自動化する
LOADJAVA と呼ばれる Java で書かれたユーティリティを提供します。LOADJAVA では、Java ソース、Java
バイナリ(.class)および Java アーカイブ全体(.jar)という 3 つの形式で Java 入力を行います。LOADJAVA
ユーティリティは、上記の手順をすべて自動実行します。まず、Java をロードできるシステム生成のデータ
ベース表を作成します。この表は、create$java$lob$table と呼ばれます。次に、Java バイナリおよび.jar
を、このシステム生成表のバイナリ LOB 列または BLOB 列にロードします。最後に、“CREATE JAVA...”
DDL を発行して、BLOB 列からデータベース・ライブラリ・ユニットに Java をロードします。
Java によるストアド・プロシージャの作成、Oracle テクニカル・ホワイトペーパー
8
1998 年 11 月
Oracle Corporation 発行の
「Developing Stored Procedures In Java」
の翻訳版です。
LOADJAVA ユーティリティは、Java クラスの解決に使用する引数として、RESOLVER の記述も行えます。
Oracle は、LOADJAVA ユーティリティ以外にも、データベース「ライブラリ・ユニット」から Java バイナ
リおよびアーカイブを削除するための DROPJAVA ユーティリティを提供します。
以下の例は、LOADJAVA を使用して、Java プログラムを Oracle データベースにロードする方法を示すもの
です。この例は、emp.class ファイルをユーザー SCOTT のスキーマにロードします。この例では、パスワー
ド“tiger”でスキーマに接続します。Java クラスは、データベース SID ORCL でホスト oudelsrv-1 上のデー
タベースにロードされます。このクラスの外部参照を解釈するのに使用される RESOLVER 仕様部は、
(“employee.*”SCOTT)(*PUBLIC)で指定されます。
LOADJAVA を使用して Java プログラム・ユニットをデータベースにロードするには、次のようにします。
loadjava -user scott/tiger@oudelsrv-1:5521:ORCL -r
‘(("employee.*" SCOTT) (* PUBLIC))’ emp.class
-
ネットワークを通じて Java をロードできる:LOADJAVA ユーティリティは Oracle の Java Database
Connectivity(JDBC)ドライバを使用してデータベースと通信し、Java をデータベースにロードす
るので、ネットワークを通じて Java プログラム・ユニットをデータベースにロードすることができ
ます。デフォルトで、LOADJAVA ユーティリティは Thin JDBC ドライバを使用します。ユーザー
は、JDBC/Oracle® Call Interface ドライバを指定することもできます。
Java コードの公開
Java プログラムをデータベースにロードしたら、次は SQL を使って登録する必要があります。Java プログ
ラムを SQL を使って登録するのに必要なのは、SQL からの呼出しが可能になるように最上位 Java エント
リ・ポイントを公開するだけです。これは、どういうことでしょう? Java でインプリメントされたデータ
ベース・トリガーを例に考えてみましょう。Java トリガーには、複数のクラスとメソッド・コールがある場
合があります。DML 文の実行時に SQL から呼び出されるのは、そのうち 1 つのコールだけです。したがっ
て、Java 対 Java のコールは Java VM 内で発生します。Java クラスとメソッドは、データ・ディクショナリ
に自動的に公開されるというわけではありません。Java メソッドの多くは、他の Java クラスからのみ呼び
出されます。したがって、Java を SQL に対して公開する理由は、この最上位 Java エントリ・ポイント、す
なわち SQL が最初に SQL を使用して呼び出す Java クラスまたはメソッドを登録するためなのです。Java
を SQL に公開するには、その前に次のような 3 つの問題を解決する必要があります。
·
SQL タイプを Java タイプにマップする−SQL または PL/SQL から Java プログラムを呼び出すと、SQL
と Java の間でデータはパラメータと結果という形でやり取りされます。Java と SQL とではサポートし
ているデータ型が異なるため、ストアド・プログラムの呼出し中に SQL から Java または Java から SQL
にデータをマップする必要があります。Java ネイティブ・タイプには、BYTE、SHORT、INT、FLOAT、
DOUBLE が含まれるのに対し、SQL ネイティブ・タイプには NUMBER、CHAR、VARCHAR2、DATE
が含まれます。Java ストアド・プログラムを SQL に対して公開する場合には、SQL と Java の間でのパ
ラメータ値と戻り値の対応を指定しなければなりません。SQL ネイティブ・タイプを Java ネイティブ・
タイプに直接マップすることは可能ですが、これには次のような 2 つの問題があります。
-
まず、SQL ネイティブ・タイプを Java ネイティブ・タイプに直接マップすると、一部のアプリケ
ーションの情報が失われることがあります。たとえば、SQL NUMBER を Java の'int'にマップすると、
非常に大きな数字を使用する財務アプリケーションの情報が失われる恐れがあります。
-
第 2 に、SQL データには NULL 値を使用できます。Java のスカラー型は NULL を取れません。SQL
NULL データが Java スカラー型のパラメータに渡されると、Java へのコールが試みられる前に、
NULL CONSTRAINT 例外が呼び出されます。
Java によるストアド・プロシージャの作成、Oracle テクニカル・ホワイトペーパー
9
1998 年 11 月
Oracle Corporation 発行の
「Developing Stored Procedures In Java」
の翻訳版です。
上記の問題は次のような 2 つの方法で対処することができます。
·
SQL NULL の問題を解決するには、Java スカラー型に対応する Java クラスを使用することができます。
たとえば、SQL NUMBER 型を Java. lang. Integer クラスにマップします。Java の“null”は SQL NULL
を表しますから、これで SQL NULL 値を渡せるようになります。ただし、これらの Java クラスを使用
しても、情報が失われる可能性がゼロになるわけではありません。
·
上記の 2 つの問題に対応するために、Oracle8i には、ネイティブ SQL 型に対応する Java ラッパーを提
供する Oracle.SQL Java パッケージが含まれています。これらのクラスは、SQL データを Java ネイティ
ブ・フォーマットに変換するのではなく、(バイト配列の)SQL フォーマットで保持するように設計
されています。oracle.sql パッケージには、すべての基本の SQL 型に対応するクラス定義が含まれてい
ます。これらのクラスにより、適宜 SQL フォーマットから基本的な Java 型にデータが変換されます。
データは SQL ネイティブ・フォーマットで保持されますから、情報が失われることがなく、NULL 値
も格納できます。SQL データを表間で移動するような操作では、oracle.sql パッケージを使用すると、
SQL ネイティブ型から Java ネイティブ型への変換が行われないために、非常に効率的であることも分
かっています。たとえば、SQL の数字を Java プログラムに渡すには、oracle.sql.NUMBER クラスを使用
できます。
·
SQL パラメータ・モードを Java パラメータ・モードにマップする−SQL は、パラメータ・モード、IN、
OUT および IN OUT をサポートしているのに対し、Java メソッドは IN パラメータ・モードしかサポー
トしません。Java では、SQL の OUT および IN OUT パラメータ・モードは、長さ 1 の配列を使用して、
その 1 つの要素を取り出して IN OUT パラメータであるかのように設定することで、Java パラメータ型
にマップされます。
·
Java プログラムが実行する権限−Oracle7™および Oracle8 では、PL/SQL ストアド・プログラムは「定
義者権限」で実行します。このような PL/SQL プログラムは、命名する表に直ちにバインドします。定
義者権限プログラムは、SQL 名にアクセスするための定義者の可視性と権限で、定義サイトにおいて
定義者のスキーマで実行されます。定義者権限プログラム・クラスの呼出し側には、そのクラスに対
する EXECUTE 権限が必要です。このためには、表に直ちにバインドできるように、お客様がアプリケ
ーションのすべての(PL/SQL)コードを使用するすべてのスキーマにロードしなければなりません。
これによって、プログラムの不要なコピーが複数格納されることになり、余分なコンパイルが必要に
なります。
Oracle8i は、Java プログラムが使用できる「起動者権限」と呼ばれる新しい権限メカニズムをサポートしま
す。この権限メカニズムを使用すれば、プロシージャの呼出し側の可視性と権限を使用して、表へのバイン
ドを遅らせることが可能になります。起動者権限プログラムが、表 T の問合せを必要とする SQL 文を実行
した場合、ユーザー A がプログラムを起動すると A のスキーマで表 T にアクセスし、ユーザー B がプログ
ラムを起動すると B のスキーマで表 T にアクセスします。SQL または PL/SQL から Java プログラムを起動
する場合には、定義者権限または起動者権限で実行するかを宣言することができます。ただし、Java プログ
ラムが他の Java プログラムを起動する場合には、常に起動者権限で実行されます。
上記の 3 つの問題を解決したら、CALL-spec を使用して SQL に Java メソッドを公開できます。CALL-spec
は、Java メソッドがサブ・プログラムをインプリメントすることを示す注釈を付ける PL/SQL サブ・プログ
ラム仕様部です。CALL-spec は、PL/SQL 外部プロシージャ宣言部に似ており、SQL 名とパラメータ、およ
び Java でインプリメントされるメソッドの結果型を宣言します。CALL-spec は、SQL と Java の間の名前と
データ型の対応を制御するためにアプリケーション開発者が書いても、あるいは Java と SQL の型対応を自
動化するツールで生成することもできます。CALL-spec は、説明するプログラムについて次のような情報を
提供します。
·
指定のサブ・プログラムがインプリメントされる言語。ここでは“JAVA”
·
メソッドの Java フルネーム。以下の例では、“com.oracle.employee.emp.sal_grade”または
“com.oracle.employee.emp.approve_raise”
·
パラメータと結果についての SQL 型と Java 型の対応
Java によるストアド・プロシージャの作成、Oracle テクニカル・ホワイトペーパー
10
1998 年 11 月
Oracle Corporation 発行の
「Developing Stored Procedures In Java」
の翻訳版です。
·
パラメータ・モード
·
Java プログラムを実行する際の権限。これは任意指定です。指定がないと、Java プログラムは定義者権
限で実行します。
以下の CALL-spec は、前ページで説明した概念を明確にするものです。
クラスemployee.empのsal_grade JavaメソッドのCALL-spec
SQL> CREATE OR REPLACE FUNCTION SGRADE (SAL IN NUMBER) RETURN VARCHAR2
2>
3>
IS LANGUAGE JAVA NAME
'com.oracle.employee.emp.sal_grade (float) return
java.lang.String';
/
Statement processed.
CALL-spec for the approve_raise Java method of class employee.emp
SQL> CREATE OR REPLACE PROCEDURE APPRAISE (SAL IN NUMBER, RAISE IN
2>
NUMBER, NSAL OUT NUMBER) AUTHID INVOKER
IS LANGUAGE JAVA NAME
‘com.oracle.employee.emp.approve_raise(float, float, float [ ])’;
/
Statement processed.
注:以下の例は、Oracle SQL パッケージを使用する方法を説明します。この架空の CALL-spec は、ここで
取り上げてきた例に対応するものではありません。この例を参考に Oracle SQL ネイティブ・マッピングを
使用する場合には、まず、メソッド宣言に適切なパラメータ型を使用するように Java コードを変更する必
要があります。(この例では、パラメータに NUMBER 型しか使っていません)
Oracle SQLネイティブ・マッピングを使用したemployee.empクラスの
approve_raise JavaメソッドのCALL-spec
SQL> CREATE OR REPLACE PROCEDURE APPRAISE (SAL IN NUMBER, RAISE IN
2>
NUMBER, NSAL OUT NUMBER) AUTHID INVOKER
3>
IS LANGUAGE JAVA NAME
‘com.oracle.employee.emp.approve_raise(oracle.sql.NUMBER,
oracle.sql.NUMBER,
oracle.sql.NUMBER [ ])’;
/
Statement processed.
Java によるストアド・プロシージャの作成、Oracle テクニカル・ホワイトペーパー
11
1998 年 11 月
Oracle Corporation 発行の
「Developing Stored Procedures In Java」
の翻訳版です。
Java コードの実行
Java ストアド・プロシージャを SQL を使って登録したら、いよいよ SQL で呼び出すことができます。Java
は、SQL および PL/SQL から、従来のデータベース・ストアド・ファンクションやプロシージャ、データベ
ース・トリガー、オブジェクト型メソッドなどのさまざまなコンテキストで呼び出せるほか、PL/SQL パッ
ケージまたはサブ・プログラム(プロシージャまたはファンクション)からも呼び出すことができます。
SQL から Java を呼び出すには、次のような 2 つの方法があります。
·
“CALL”文を使用する−Oracle8i には、新しい SQL 文、“CALL”文が導入されました。CALL 文は、
キーワード“CALL”で始まります。この文は、SQL*PLUS の EXECUTE コマンドとよく似ています。
ただし、BEGIN...END にまで拡張することはありません。“CALL”文を使用すれば、最上位プロシー
ジャとして Java ストアド・プログラムを呼び出すことができます。“CALL”文は、SQL に対して Java
メソッドを公開するのに使用される CALL-spec を呼び出します。“CALL”文はファンクションとも併
用できます。以下は、CALL 文を使用する方法の一例です。Java メソッドの公開に使用される CALL-spec
が(前で定義された)SGRADE と APPRAISE であることに注意してください。
·
“CALL”文を使用して、SQL から最上位プロシージャとして Java ストアド・プログラムを呼び出すに
は、次のようにします。
SQL> VARIABLE NEWSAL NUMBER
SQL> VARIABLE CURSAL NUMBER
SQL> VARIABLE RAISE NUMBER
SQL> VARIABLE GRADE VARCHAR2
SQL> EXECUTE :CURSAL := 50000;
Statement processed.
SQL> EXECUTE :RAISE := 5000;
Statement processed.
SQL> CALL APPRAISE(:CURSAL, :RAISE, :NEWSAL);
Statement processed.
SQL> PRINT NEWSAL
NEWSAL
------------55000
SQL> CALL SGRADE(:CURSAL) INTO :GRADE
Statement processed.
SQL> PRINT GRADE
GRADE
-----------SMTS
·
SQL 問合せを使用する−SQL 問合せ文にユーザー定義 PL/SQL 関数を使用できるのと同じように、Java
ストアド・ファンクションを使用して SQL 問合せから返される結果を操作することができます。ここ
でもやはり、Java メソッドを SQL に公開するのに使用された CALL-spec を SQL から呼び出す必要があ
ります。以下の例は、SQL 問合せ文で Java メソッドを使用する方法を示すものです。
·
SQL 問合せから Java ストアド・ファンクションを呼び出すには、次のようにします。
SQL> SELECT ENAME, SAL, SGRADE(SAL) FROM EMP;
Java によるストアド・プロシージャの作成、Oracle テクニカル・ホワイトペーパー
12
1998 年 11 月
Oracle Corporation 発行の
「Developing Stored Procedures In Java」
の翻訳版です。
SQL と同様に、PL/SQL も Java ストアド・プロシージャおよびファンクションを呼び出すことができます。
PL/SQL は、Java ストアド・プロシージャを直接呼び出せます。それでは、この仕組みを説明しましょう。
Java ストアド・プログラムには、PL/SQL プロキシー・コール記述子でラップされているので、呼出し側の
PL/SQL プログラムは PL/SQL CALL-spec を呼び出すだけで良いのです。プロキシーを呼び出す構文は、別
の PL/SQL プログラムを呼び出す構文とほぼ同じです。プロキシー・サブ・プログラムが呼び出されると、
Java VM は Java メソッドを自動的に呼び出します。以下は、PL/SQL から直接 Java メソッドを呼び出す例で
す。
·
PL/SQL から直接 Java ストアド・プロシージャを呼び出すには次のようにします。
DECLARE
newsal NUMBER(7,2);
cursal NUMBER(7,2);
raise NUMBER(7,2);
BEGIN
…
APPRAISE(CURSAL, RAISE, NEWSAL);
…
END;
Java ストアド・プロシージャから SQL および PL/SQL にアクセスするには
これまでは、Oracle8i データベースの中で Java ストアド・プログラムを作成し、実行する方法を説明してき
ました。簡単な例を使用して、データベースで Java プログラムをロード、変換、発行および呼出す方法を
解説しました。ただし、これらの例はごく単純で、Oracle データベースの永続的な状態(RDBMS)へのア
クセスが考慮されていません。ここでは、Java ストアド・プログラムがどのように永続的データにアクセス
し、PL/SQL とどのように相互動作するかを説明します。データベースで実行中の Java プログラムは、JDBC
または SQLJ を使用して永続データにアクセスできます。Oracle Java Virtual Machine には、データベースで
実行する JDBC ドライバの特別なバージョンがあります。この組込み JDBC ドライバは、JDBC 1.22 仕様を
使用してコンパイルし、クライアント・サイド JDBC ドライバがサポートするのと同じ API をサポートしま
す。この JDBC ドライバは、データベースと同じアドレス・スペースとプロセス・スペースで実行するので、
ネットワークを介することなく、直接 SQL および PL/SQL にアクセスできます。
組込み JDBC ドライバに加えて、Oracle8i サーバーには、アプリケーション開発者が SQLJ を使用して永続
データにアクセスするアプリケーションを書くことを可能にする組込み JDBC トランスレータも含まれて
います。SQLJ は、ちょうど PRO*C プログラムで静的 SQL 文を C に組み込めるのと同じように、静的 SQL
文を Java プログラムに組み込むための一般的な方法です。組込み SQLJ トランスレータは、SQLJ プログラ
ムを、基礎となる JDBC へのコールを含んだ純粋な Java プログラムに変換します。変換された Java プログ
ラムは 100% Java で、組込み Java バイト/コード・コンパイラでコンパイルできます。やはり、変換済みプ
ログラムは組込み JDBC ドライバを使用して、永続データにアクセスできます。組込み JDBC ドライバと
SQLJ トランスレータを使用すれば、JDBC または SQLJ を使用してデータベースにアクセスするクライアン
ト・マシン上に作成されたアプリケーションを、ほんの少し変更するだけで容易にパッケージして、データ
ベースで実行できるので、柔軟なアプリケーションのパーティション化が実現します。
引き続き前の例を用いて、SQLJ を使用して永続データにアクセスしてみましょう。'emp'クラスのメソッド
は次のような方法で変更します。まず、'sal_grade'メソッドは社員の給与ではなく、社員名を入力パラメー
タとして使用します。次に、'approve_raise'メソッドは現在の給与や昇給、新しい給与をパラメータとして使
用しません。
Java によるストアド・プロシージャの作成、Oracle テクニカル・ホワイトペーパー
13
1998 年 11 月
Oracle Corporation 発行の
「Developing Stored Procedures In Java」
の翻訳版です。
その代わり、社員名、昇給および新しい給与をパラメータとして使用します。新しい Java ストアド・プロ
シージャは次のようになります。
package com.oracle.employee;
public class emp {
public static String sal_grade (String empname) {
float current_sal;
#sql {select salary into :current_sal from emp where ename
= :empname };
if (current_sal > 0 && current_sal < 50000) return “ MTS”;
if (current_sal >= 50000 && current_sal < 100000) return
“ SMTS”;
return (“Salary out of Range”);
}
public static void approve_raise (String empname, float raise,
float new_sal [ ]) {
float current_sal;
int hire_time;
#sql {select salary into :current_sal from emp where ename
= :empname };
// We are assuming that employment_period is a PL/SQL function that
has been previously defined in the
// the database that looks at the employees hire date and returns the
number of months the employee
// has been with the company.
#sql hire_time = { VALUES(employment_period (:empname)) };
float percent_raise = (raise / current_sal) * 100;
if (hire_time > 9) {
if (percent_raise > 15 || percent_raise < 5) {
new_sal[0] = -1;
}
else {
new_sal[0] = current_sal + raise;
}
}
else {
new_sal[0] = -2;
}
}
}
Java によるストアド・プロシージャの作成、Oracle テクニカル・ホワイトペーパー
14
1998 年 11 月
Oracle Corporation 発行の
「Developing Stored Procedures In Java」
の翻訳版です。
このプログラムは、SQLJ を使用して Java から SQL を呼び出す方法を説明するものです。SQL は、クライ
アント・マシンでコンパイルされてから、前項で説明したようにデータベースにロードされて実行されます。
同じプログラムをデータベースに直接ロードすることもできます。組込み SQLJ トランスレータが SQLJ プ
ログラムを、基礎となる JDBC へのコールを含めて Java プログラムに変換し、バイト/コード・コンパイラ
がこの Java プログラムを対応するバイナリ・クラス・ファイルに変換します。
Java ストアド・プロシージャを呼び出すシナリオ
Java ストアド・プロシージャは、PL/SQL ストアド・プロシージャと同様に、従来の 2 階層クライアント/
サーバー構成を含む複数の構成で実行できます。Java ストアド・プロシージャは、中間層アプリケーション
で実行中のアプリケーションからも呼び出すことができます。Java ストアド・プロシージャは、どのデータ
ベース/Net8™クライアントからでも呼び出せます。Net8 Connection Manager は、多数のユーザーを 1 つのサ
ーバーに接続する接続コンセントレータです。Java ストアド・プロシージャを呼び出すためのシナリオの一
部を紹介します。
·
JDBC または SQLJ を介した Java クライアント−Java クライアント・アプリケーションは、SQL92 エス
ケープ構文または Oracle SQL 構文のいずれでも、PL/SQL ストアド・プロシージャを呼び出すために使
用する JDBC コールを使用して、Java ストアド・プロシージャを呼び出すことができるようになりまし
た。
·
Pro*、Oracle Call Interface および ODBC クライアントもストアド・プロシージャにアクセスできます。
·
Developer/2000™FORMS クライアントは Java ストアド・プロシージャにアクセスできます。
Javaア
アプレット
ORACLE RDBMS
JDBCド
ドライバ
SQL*Net
OCIク
クライアント
SQL*Net
Pro*ク
クライアント
Net8
Connection
Manager
SQL*Net
ODBCク
クライアント
SQL*Net
Dev 2000 [Forms]
Javaス
ストアド・
プロシー ジャ
PL/SQLス
ストアド・
プロシー ジャ
リレー ショナ ル 、
オ ブジェクト・
リレー ショナ ル デ
・ ータ
ファット・クライアント
図 2:Java ストアド・プロシージャの使用
Java によるストアド・プロシージャの作成、Oracle テクニカル・ホワイトペーパー
15
1998 年 11 月
Oracle Corporation 発行の
「Developing Stored Procedures In Java」
の翻訳版です。
Java ストアド・プロシージャの利点
本書では、Java ストアド・プロシージャを概説し、アプリケーション開発者が Oracle8i データベース内の
Java ストアド・プロシージャとしてビジネス・ロジックを作成し、実行する方法を説明してきました。ここ
では、Java ストアド・プロシージャを使用することの利点を説明します。ストアド・プロシージャが広く普
及したことの最も重要な理由は、結果セットの処理により、ネットワーク・トラフィックのボトルネックが
排除されてアプリケーション・パフォーマンスが高まり、サーバー・リソースのより効率的な利用が可能に
なるからです。サーバーからクライアントまでネットワークを通じて大量のデータを送信するのではなく、
クライアントには結果のみをネットワークで送信するだけで、データベース・サーバーでデータを操作する
ことができるからです。
第 2 に、広く分散された組織ではビジネス・ルールを中央で実行できます。中央の Oracle8i データベースか
らは、これらの Java ストアド・プロシージャを 2 つの方法でレプリケートできます。まず、他の Oracle デ
ータベースにレプリケートして、たとえば中央サーバーと支店データベースの間でルールを実行できます。
さらに、Java ストアド・プロシージャは、Oracle データベースと、Oracle Lite データベースを実行するモバ
イル・クライアントとの間でもレプリケートできます。
第 3 に、Java ストアド・プロシージャは、この 2 年間推進されてきた SQLJ 標準化に向けての努力の一部で
もあります。Oracle は、この標準化の努力を推進する上でのリーダーとしての役割を果たしてきました。
Oracle、IBM、Tandem、Sybase、JavaSoft、Informix、その他のパートナーとの協力により、標準の定義が進
められてきたのです。この努力では、2 つのパートに特に力が注がれてきました。まず、標準のパート 0 は、
Java プログラムに SQL 文を組み込むための標準構文を提供します。パート 1 は、Java で書かれたデータベ
ース・ストアド・プロシージャおよびトリガーの標準構文を提供することを目的としています。Oracle8i の
Java ストアド・プロシージャのインプリメンテーションでは、Java と SQL の相互運用性を規定したこれか
ら発表される予定の ANSI/ISO 標準に適合しています。これらのストアド・プロシージャは、複数のベンダ
ーのデータベースの間での移植性があります。
第 4 に、Java ストアド・プロシージャは、PL/SQL ストアド・プロシージャに代わるクライアント/サーバー
構成や多層構成で実行されるトランザクション・イントラネット/インターネット・アプリケーション向け
のオープンな代替手段として、PL/SQL ストアド・プロシージャを補完します。サーバー・プログラミング
言語として Java を追加することで、Oracle は、汎用サーバー・プラットフォームとしてすべての Java プロ
グラマに RDBMS を開放することを目指しています。
最後に、Oracle が提供する Java と PL/SQL の 2 方向の運用性により、アプリケーションの再使用が可能にな
ります。既存の PL/SQL ストアド・プロシージャを Java から容易に再使用することができます。また、Java
ストアド・プロシージャも PL/SQL から再使用できます。
このような利点は、2 階層クライアント/サーバー構成と多層イントラネットおよびエキストラネットの実
行など、多数の実行構成の間の懸け橋を実現します。
Java によるストアド・プロシージャの作成、Oracle テクニカル・ホワイトペーパー
16
1998 年 11 月
Oracle Corporation 発行の
「Developing Stored Procedures In Java」
の翻訳版です。
まとめ
本書では、Java でエンタープライズ・アプリケーションを作成し、それを Oracle8i データベースで実行する
方法を概説しました。Oracle データベースに統合された Oracle8i Java Virtual Machine は、スケーラブルで堅
牢、かつ安全で、可用性が高く、管理が容易な Java アプリケーションを実行するためのオープンなサーバ
ー・プラットフォームを提供します。Oracle8i データベースで Java ストアド・プログラムを実行するには、
データベースに Java プログラムをロードして、Java メソッドを SQL に対して公開し、多様なコンテキスト
の中で Java プログラムを呼び出す必要があります。Java プログラムはデータベース・サーバーと同じアド
レス・スペースで実行し、組込み JDBC ドライバを利用できるため、ネットワークを経由せずに SQL デー
タにアクセスできますから、ハイ・パフォーマンスの実現に最適であると言えます。
Java はデータベースに強固に統合され、SQL および PL/SQL とシームレスに相互運用できます。Oracle8i の
Java ストアド・プログラムのインプリメンテーションは、アプリケーション・スループットの向上やネット
ワーク・トラフィックの軽減、Java、SQL および PL/SQL の間でのシームレスな相互運用性を含むさまざま
な利点をアプリケーション開発者にもたらします。Java ストアド・プロシージャは、Oracle データベースと
Oracle のモバイル・データベース(Oracle Lite)の間でも容易にレプリケートされるので、広く分散された
組織でもビジネス・ルールを中央で実行することが可能になります。さらに、Java ストアド・プロシージャ
はオープン標準に基づいているため、複数のデータベース・ベンダーの間での移植性も実現します。
Java によるストアド・プロシージャの作成、Oracle テクニカル・ホワイトペーパー
17
1998 年 11 月
Oracle Corporation 発行の
「Developing Stored Procedures In Java」
の翻訳版です。
Oracle Corporation
World Headquarters
500 Oracle Parkway
Redwood Shores, CA 94065
U.S.A.
世界共通窓口:
650-506-7000
FAX:650-506-7200
http://www.oracle.com/
版権 © Oracle Corporation 1998
無断転載を禁ず
この文書はあくまでも参考資料であり、掲載されている
情報は予告なしに変更されることがあります。万一、誤
植などにお気づきの場合は、オラクル社までお知らせく
ださい。
オラクル社は本書の内容に関していかなる保証もしませ
ん。また、本書の内容に関連したいかなる損害について
も責任を負いかねます。
Oracle および SQL*Plus はオラクル社の登録商標です。
Enabling the Information Age 、 Oracle8i 、 PL/SQL 、
Oracle8 、 Pro*C、 JDeveloper、 Oracle7 、 Net8 お よ び
Developer/2000 はオラクル社の商標です。
他のすべての企業名と製品名は、識別のためにのみ
掲載されており、それぞれの所有者の商標の場合が
あります。
#430.15.1999.04.A
Fly UP