ヘッダーをスキップ

Oracle Database 概要
11gリリース1(11.1)

E05765-03
目次
目次
索引
索引

戻る 次へ

25 サポートされているアプリケーション開発言語

この章では、Oracleアプリケーション開発システムの概要について説明します。

この章の内容は、次のとおりです。

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

Oracle Databaseの開発者は、アプリケーション開発に使用する言語をC、C++、Java、COBOL、PL/SQL、Visual BasicおよびC#の中から選択できます。言語固有の標準がすべてサポートされます。開発者は、最も慣れている言語、または特定のタスクに最も適した言語を選択できます。たとえば、アプリケーションでは、サーバー側でJavaを使用して動的Webページを作成し、PL/SQLを使用してデータベースにストアド・プロシージャを実装し、C++を使用して中間層に計算集中型のロジックを実装できます。

OracleにはPro*シリーズのプリコンパイラも用意されており、SQLとPL/SQLをC、C++、COBOLまたはFORTRANアプリケーション・プログラムに埋め込むことができます。

関連項目

  • プログラミング環境を選択する方法の詳細は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』を参照してください。

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

  • 第26章「Oracleデータ型」

 

C/C++プログラミング言語の概要

この項の内容は、次のとおりです。

Oracle Call Interface(OCI)の概要

Oracle Call Interface(OCI)はApplication Program Interface(API)です。このAPIにより、C言語によるシステム固有のファンクション・コールを使用してOracleデータベースにアクセスし、SQL文の実行フェーズ全体を制御するアプリケーションを作成できます。OCIは、Cのデータ型、コール規則、構文およびセマンティクスをサポートしています。OCIからOracle Databaseの表データに直接アクセスしたり、Oracle Streamsとの間でデータをエンキューおよびデキューできます。

OCIの機能は、次のとおりです。

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

問合せの結果を、OCIクライアント結果キャッシュのメモリーにキャッシュできます。その後、OCIクライアントはキャッシュされた結果を使用して、これらの後続の問合せの実行に対応します。データベース・コールを作成して問合せを再実行するより、結果キャッシュから結果を取得する方が速いため、頻繁に実行される問合せのパフォーマンスは、結果がキャッシュされている場合には大幅に向上します。OCIクライアントの結果キャッシュはプロセス単位であり、様々なセッション間で共有されます。

関連項目

OCIクライアント結果キャッシュの詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。 

OCIでは、Oracle Databaseのオブジェクト・リレーショナル機能がサポートされています。重要な要素は、オブジェクト・キャッシュと呼ばれる作業領域をアプリケーション・プログラムから使用できるようにするコールの集合です。オブジェクト・キャッシュは、クライアント側にあるメモリー・ブロックで、プログラムがオブジェクト全体を格納し、サーバーとの間を往復せずにオブジェクト間をナビゲートできるようにします。

オブジェクト・キャッシュは、そのオブジェクト・キャッシュを使用するアプリケーション・プログラムが完全に制御および管理します。Oracle Databaseは、オブジェクト・キャッシュにアクセスできません。オブジェクト・キャッシュを使用するアプリケーション・プログラムは、サーバーとのデータの一貫性を維持しながら、同時発生のアクセスによる衝突から作業領域を保護する必要があります。

問合せの結果を、OCIクライアント結果キャッシュのメモリーにキャッシュできます。その後、OCIクライアントはキャッシュされた結果を使用して、これらの後続の問合せの実行に対応します。データベース・コールを作成して問合せを再実行するより、結果キャッシュから結果を取得する方が速いため、頻繁に実行される問合せのパフォーマンスは、結果がキャッシュされている場合には大幅に向上します。OCIクライアントの結果キャッシュはプロセス単位であり、様々なセッション間で共有されます。

関連項目

OCIクライアント結果キャッシュの詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。 

OCIには、次の機能を持つ関数が用意されています。

OCIの同時実行性が向上し、個々のオブジェクトにロックをかけることができるようになりました。また、複合オブジェクト検索をサポートすることにより、パフォーマンスが向上しています。

OCIを使用する開発者は、Object Type Translator(OTT)を使用して、Oracle Databaseオブジェクト型に対応するC構造体データ型を生成できます。

関連項目

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

Oracle C++ Call Interface(OCCI)の概要

Oracle C++ Call Interface(OCCI)は、オブジェクト指向機能、システム固有クラスおよびC++プログラミング言語のメソッドを使用してOracle DatabaseにアクセスできるC++ APIです。OCCIはOCI上に作成され、その機能とパフォーマンスは、オブジェクト指向パラダイムのさらに使用しやすいインタフェースと結合されています。

この項の内容は、次のとおりです。

OCCIの結合リレーショナルおよびオブジェクト・インタフェース

結合リレーショナルAPIおよびオブジェクト・クラスによって、SQLはデータベースにアクセスできます。これらのインタフェースを介して、SQLはサーバー上でオブジェクトまたはリレーショナル・データの作成、操作およびフェッチを実行します。アプリケーションは、ラージ・オブジェクト、オブジェクトや構造型、配列および参照など、サーバー上のすべてのデータ型にアクセスできます。

OCCIのナビゲーショナル・アクセス用インタフェース

ナビゲーショナル・アクセス用インタフェースは、C++のインタフェースです。これによって、C++オブジェクト形式のオブジェクト・リレーショナル・データに、SQLを使用せずにシームレスにアクセスし、変更できます。C++オブジェクトは、透過的にアクセスされ、必要に応じてデータベースに格納されます。

OCCIのナビゲーショナル・アクセス用インタフェースを使用すると、オブジェクトを取得し、そのオブジェクトから他のオブジェクトへの参照内をナビゲートできます。サーバー・オブジェクトは、C++クラスのインタフェースとしてアプリケーション・キャッシュでマテリアライズされます。アプリケーションはOCCIのオブジェクト・ナビゲーショナル・コールを使用して、サーバーのオブジェクトに対して次の機能を実行できます。

Oracle Type Translatorの概要

Object Type Translator(OTT)は、オブジェクト型に対応するC言語の構造体の宣言を自動生成するプログラムです。OTTは、Oracle Databaseのオブジェクト型に対応するC++クラス定義を生成し、OCCIアプリケーションでネイティブなC++オブジェクト・インタフェースに対して使用できるようにします。OTTは、Pro*C/C++プリコンパイラとOCIサーバー・アクセス・パッケージを使用します。

関連項目

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

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

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

 

Pro*C/C++プリコンパイラの概要

Oracleプリコンパイラは、高水準のソース・プログラムにSQL文を埋め込むことができるプログラミング・ツールです。このプリコンパイラは入力としてホスト・プログラムを受け入れ、埋込みSQL文を標準のOracle Databaseランタイム・ライブラリ・コールに変換し、通常の方法でコンパイル、リンクおよび実行できるソース・プログラムを生成します。OracleプリコンパイラはC、C++、COBOLおよびFORTRANに使用できます(ただし、使用できないシステムもあります)。

Oracle Pro*C/C++プリコンパイラを使用すると、CまたはC++のソース・ファイルにSQL文を埋め込むことができます。Pro*C/C++は入力としてソース・ファイルを読み取り、CまたはC++のソース・ファイルを出力します。このソース・ファイルでは、埋込みSQL文がOracle Databaseランタイム・ライブラリ・コールで置換されてから、CまたはC++コンパイラによりコンパイルされます。

Pro*C/C++を使用すると高度にカスタマイズされたアプリケーションを作成できます。たとえば、最新のウィンドウおよびマウス・テクノロジを取り込むユーザー・インタフェースを作成できます。また、バックグラウンドで実行されてユーザーの介入を必要としないアプリケーションも作成できます。

さらに、Pro*C/C++ではアプリケーションの詳細なチューニングが可能です。リソース使用、SQL文の実行および各種のランタイム・インジケータを緊密に監視できます。この情報を使用してプログラムのパラメータを変更し、パフォーマンスを最大化します。

プリコンパイルすることでアプリケーション開発プロセスにステップが1つ加わりますが、所要時間は短縮されます。埋込みSQL文は、手動ではなくプリコンパイラにより、Oracle Databaseランタイム・ライブラリ(SQLLIB)のコールに変換されます。また、Pro*C/C++プリコンパイラはホスト変数を分析し、構造と列のマッピングを定義し、SQLCHECK=FULLが指定されている場合には埋込みSQL文のセマンティック分析を実行します。

Oracle Pro*C/C++プリコンパイラを使用すると、プログラマはCおよびC++プログラムでオブジェクト・データ型を使用することもできます。Pro*C/C++を使用する開発者は、Object Type Translator(OTT)を使用して、Oracle Databaseのオブジェクト型とコレクションをCのデータ型にマップし、Pro*C/C++アプリケーションで使用できます。

Pro*C/C++開発者は、プログラムからOCI関数をコールすることもできます。

Pro*C/C++は、オブジェクト型とコレクションのコンパイル時型チェック機能と、データベース型からCデータ型への自動型変換を提供しています。Pro*C/C++は、オブジェクトを作成したり破棄したりするためのEXEC SQL構文と、サーバーにあるオブジェクトにアクセスするための2つの方法を提供しています。

型記述の動的作成とアクセス

Oracleでは、C APIを提供しているため、型記述の動的な作成とアクセスが可能です。さらに、一時型記述、つまりデータベースに永続的に格納されない型記述も作成できます。

C APIによって、OCIAnyDataOCIAnyDataSetの作成とアクセスが可能になります。

Oracleでは、これらのデータ型に対応するSQLデータ型(OracleのOpen Type System)も用意されています。

このようなデータについて、データベース表の列とSQLの問合せを作成できます。

C APIは次の項を使用します。

PL/SQLの概要

PL/SQLは、SQLに対するOracleの手続き型言語拡張機能です。使用しやすく、SQLとシームレスで、堅牢かつ移植性を備えたセキュアなサーバー側に格納される手続き型言語を提供します。PL/SQLのコンパイラとインタプリタはOracle Developerに埋め込まれており、開発者にクライアント側とサーバー側の両方で一貫性のある高度な開発モデルを提供します。また、PL/SQLストアド・プロシージャは、Pro*CやOracle Call InterfaceおよびOracle ReportsやOracle Formsなど、多数のOracle Databaseクライアントからコールできます。

PL/SQLを使用すると、SQL文を手続き型構造と混合して使用できます。さらにPL/SQLでは、プロシージャ、ファンクションおよびパッケージなどのPL/SQLプログラム・ユニットを定義して実行できます。PL/SQLプログラム・ユニットは、一般に、無名ブロックとストアド・プロシージャに分類されます。

無名ブロックとは、アプリケーション内に表示されるが名前が付いていない、またはデータベースに格納されていないPL/SQLブロックです。多くのアプリケーションでは、SQL文を記述できるところであればどこにでもPL/SQLブロックを記述できます。

ストアド・プロシージャとは、Oracle Databaseによってデータベースに格納され、アプリケーションから名前でコールできるPL/SQLブロックのことです。ストアド・プロシージャを作成すると、Oracle Databaseはそのプロシージャを解析し、その解析済の表現をデータベースに格納します。さらにOracle Databaseでは、ファンクション(プロシージャによく似ているもの)やパッケージ(プロシージャとファンクションをまとめたもの)を作成して保管することもできます。

関連項目

「Javaの概要」

第22章「トリガー」 

この項の内容は、次のとおりです。

PL/SQLの実行方法

PL/SQLの実行方法は、次のいずれかです。

解析済の実行

Oracle9iより前のバージョンでは、PL/SQLのソース・コードは、その名のとおり常にバイトコード表現にコンパイルされ、Oracle Databaseの一部として、またOracle Formsなどの製品に実装される移植性のある仮想コンピュータによって実行されていました。Oracle9iからは、システム固有の実行または解析済の実行を選択できます。

システム固有の実行

計算集約型のプログラム・ユニットで最大限のパフォーマンスが発揮されるように、データベースに格納されているPL/SQLプログラム・ユニットのソース・コードを直接コンパイルし、特定のプラットフォームのオブジェクト・コードにします。(このオブジェクト・コードは、Oracle Databaseにリンクされます。)

関連項目

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

PL/SQLエンジンは、PL/SQLプログラム・ユニットの定義、コンパイルおよび実行に使用するツールです。このエンジンは、Oracle Databaseをはじめとする多数のOracle製品に組み込まれている特別なコンポーネントです。

多くのOracle製品にPL/SQLコンポーネントが含まれていますが、この項では、Oracle Databaseに格納でき、Oracle DatabaseのPL/SQLエンジンを使用して処理できるプログラム・ユニットについて説明します。それぞれのOracleのツール製品のPL/SQL機能については、該当するOracleのツール製品のマニュアルに説明があります。

図25-1に、Oracle Databaseに含まれているPL/SQLエンジンを示します。

図25-1    PL/SQLエンジンおよびOracle Database


画像の説明

プログラム・ユニットは、データベースに格納されています。アプリケションがデータベースに格納されたプロシージャをコールすると、Oracle Databaseは、コンパイル済のプログラム・ユニットをシステム・グローバル領域(SGA)内の共有プールにロードします。PL/SQL文エグゼキュータとSQL文エグゼキュータは、連動してプロシージャ内の文を処理します。

PL/SQLエンジンは、次のOracle製品に組み込まれています。

別のPL/SQLブロック(無名ブロックまたは別のストアド・プロシージャ)からストアド・プロシージャをコールすることもできます。たとえば、Oracle Forms(バージョン3以上)からストアド・プロシージャをコールできます。

また、無名ブロックを、次のツールで開発したアプリケーションからOracle Databaseに渡すこともできます。

PL/SQLの言語構造

PL/SQLブロックには、次のPL/SQL言語構造を組み込むことができます。

この項の内容は、次のとおりです。

変数と定数

プロシージャ、ファンクションまたはパッケージの中では、変数および定数を宣言できます。変数や定数は、必要になった時点で値を受け渡すためにSQL文やPL/SQL文で使用できます。

SQL*Plusなどの対話形式のツールを使用すると、カレント・セッションで変数を定義できます。この方法で宣言した変数は、プロシージャやパッケージの中で宣言した変数と同じように使用できます。

カーソル

カーソルは、Oracle Databaseデータのレコード単位での処理を容易にするために、プロシージャ、ファンクションまたはパッケージの中で明示的に宣言できます。また、カーソルは、PL/SQLエンジンによって(他のデータ操作アクションをサポートするため)暗黙的に宣言されることもあります。

関連項目

「スクロール可能カーソル」 

例外

PL/SQLでは、PL/SQLコードの処理中に発生する、例外と呼ばれる内部的なエラー条件とユーザー定義のエラー条件を明示的に処理できます。内部例外は、0(ゼロ)による除算などの不正な操作や、PL/SQLに戻されたOracle Databaseエラーが原因で発生します。ユーザー定義例外は、アプリケーション固有のエラー(借方に記入するだけで、差引勘定を負のままにするなど)の処理を制御するために、PL/SQLブロック内で明示的に定義され、通知されます。

例外状況が発生すると、PL/SQLコードの実行は停止され、例外ハンドラというルーチンが起動します。それぞれの内部例外やユーザー定義例外について、特定の例外ハンドラを作成できます。

PL/SQLにおける動的SQL

PL/SQLでは、完全なテキストが実行時まで認識されない動的SQL文を実行できます。動的SQL文は、実行時に、プログラムに入力されたりまたはプログラムにより作成される文字列に格納されます。これにより、汎用プロシージャを作成できます。たとえば、動的SQLを使用すると、実行時までは名前がわからない表を操作するプロシージャを作成できます。

動的SQLを含むストアド・プロシージャと無名PL/SQLブロックを記述するには、次の2つの方法があります。

また、動的SQLを使用してDML文またはDDL文を発行できます。この方法は、PL/SQLにDDL文を静的に埋め込むことができないという問題を解決するために使用できます。たとえば、EXECUTE IMMEDIATE文またはDBMS_SQLパッケージによって提供されるPARSEプロシージャを使用して、ストアド・プロシージャからDROP TABLE文を発行できます。

関連項目

  • 動的SQLのための2つのアプローチの比較については、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』を参照してください。

  • 動的SQLの詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください。

  • 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』

 

PL/SQLプログラム・ユニット

Oracle Databaseでは、PL/SQLプログラム・ユニットというプロシージャ型スキーマ・オブジェクトを使用してデータベースにアクセスし、情報を処理できます。プロシージャ、ファンクションおよびパッケージは、すべてPL/SQLプログラム・ユニットの例です。

ストアド・プロシージャとファンクション

プロシージャファンクションは、SQL文やその他のPL/SQL構成メンバーのセットで構成され、グループとしてまとめてデータベースに格納されるスキーマ・オブジェクトです。特定の問題を解決したり、関連する一連のタスクを実行するために、1単位として実行されます。プロシージャとファンクションには、コール元から、入力のみ、出力のみまたは入出力の値が入るパラメータを指定できます。プロシージャとファンクションを使用すると、SQLが持つ平易さや柔軟性と、構造化プログラミング言語が持つプロシージャ的な機能性をあわせ持つことができます。

プロシージャとファンクションはほとんど同じものですが、プロシージャはコール元に値を戻さないのに対して、ファンクションは必ず1つの値を戻すという違いがあります。簡単にするため、この章ではプロシージャという語でプロシージャファンクションの両方を指すものとします。

プロシージャまたはファンクションは、次の方法で対話型で実行できます。

図25-2に、データベースに格納され、いくつかの異なるデータベース・アプリケーションによってコールされる単純なプロシージャを示します。

図25-2    ストアド・プロシージャ


画像の説明

次のストアド・プロシージャの例では、従業員レコードがemployees表に挿入されます。

Procedure hire_employees (last_name VARCHAR2, job_id VARCHAR2, manager_id NUMBER, 
hire_date DATE, salary NUMBER, commission_pct NUMBER, department_id NUMBER) BEGIN . . INSERT INTO employees VALUES (emp_sequence.NEXTVAL, last_name, job_id, manager_id, hire_date, salary, commission_pct, department_id); . . END

この例のデータベース・アプリケーションはすべて、hire_employeesプロシージャをコールしています。また、権限を付与されたユーザーは、Oracle Enterprise ManagerまたはSQL*Plusを使用して、次のような文でhire_employeesプロシージャを実行できます。

EXECUTE hire_employees ('TSMITH', 'CLERK', 1037, SYSDATE, 500, NULL, 20); 

この文により、employees表にTSMITHのための新しい従業員レコードが挿入されます。

関連項目

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

この項の内容は、次のとおりです。

プロシージャの利点

ストアド・プロシージャは、次の分野で特長を発揮します。

プロシージャのガイドライン

ストアド・プロシージャの設計時には、次のガイドラインに従ってください。

無名PL/SQLブロックとストアド・プロシージャ

ストアド・プロシージャを作成し、それをスキーマ・オブジェクトとしてデータベースに格納できます。いったん作成してコンパイルしたプロシージャは、再コンパイルしなくても実行可能な名前付きのオブジェクトになります。さらに、依存性情報がデータ・ディクショナリに格納されるため、それぞれのストアド・プロシージャの妥当性が保証されます。

ストアド・プロシージャとは別の方法として、無名PL/SQLブロックをOracleのツール製品やアプリケーションからOracle Databaseに送信し、無名PL/SQLブロックを作成できます。Oracle DatabaseによってPL/SQLブロックがコンパイルされ、SGAの共有プールにそのコンパイル済バージョンが入れられます。ただし、そのソース・コードやコンパイル済バージョンは、現行インスタンスの後も再利用できるようにデータベースに格納されることはありません。共有SQLを使用すると、共有プールに入っている無名PL/SQLブロックがその共有プールからフラッシュされるまでの間は、そのブロックを再利用および共有できます。

どちらの場合でも、データベース・アプリケーションからデータベースまたはメモリーに格納されているデータベース・プロシージャに、PL/SQLブロックを移すことにより、Oracle Databaseが実行時に不必要な再コンパイルを実行することがなくなり、アプリケーションとOracle Databaseの全体的なパフォーマンスが向上します。

スタンドアロン・プロシージャ

パッケージのコンテキスト内で定義されていないストアド・プロシージャのことを、スタンドアロン・プロシージャと呼びます。パッケージ内で定義されているプロシージャは、そのパッケージの一部とみなされます。

関連項目

パッケージの利点の詳細は、「PL/SQLパッケージ」を参照してください。 

ストアド・プロシージャの依存性の追跡

ストアド・プロシージャは、その本体で参照するオブジェクトに依存します。Oracle Databaseは、そのような依存性を自動的に追跡し、管理します。たとえば、プロシージャが参照している表の定義を変更した場合は、そのプロシージャを再コンパイルして、引き続き設計どおりに機能することを確認する必要があります。通常、Oracle Databaseはこのような依存性の管理を自動的に処理します。

関連項目

依存性の追跡の詳細は、第6章「スキーマ・オブジェクトの依存性」を参照してください。 

外部プロシージャ

Oracle Database上で実行されるPL/SQLプロシージャからは、Cプログラミング言語で作成して共有ライブラリに格納した外部プロシージャや外部ファンクションをコールできます。Cルーチンは、Oracle Databaseとは別のアドレス空間で実行されます。

関連項目

外部プロシージャの詳細は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』を参照してください。 

テーブル・ファンクション

テーブル・ファンクションは、出力用の行セットを生成する関数です。つまり、テーブル・ファンクションは、コレクション型インスタンスを戻します(NESTED TABLEデータ型およびVARRAYデータ型)。テーブル・ファンクションは、SQL文のFROM句で通常の表のかわりに使用できます。

Oracle Databaseでは、テーブル・ファンクションにより、ファンクションからの結果をパイプライン処理(Oracle Databaseの行ソースのように機能する)できます。これは、ODCITableインタフェースの実装や、ネイティブのPL/SQL命令の使用により実現できます。

パイプライン処理を使用すると、Oracle Warehouse Builder(OWB)およびカートリッジ・グループなど、多くのアプリケーションでパフォーマンスが改善されます。

データ・ウェアハウス構築における抽出、変換、ロード(ELT)プロセスは、OLTPシステムからデータを抽出します。抽出されたデータは、データ・ウェアハウスにロードされる前に、(PL/SQLなどの手続き型言語で記述された)変換のシーケンスに渡されます。

Oracle Databaseでは、テーブル・ファンクションおよび非テーブル・ファンクションのパラレル実行も可能です。パラレル実行では次の点が拡張されます。

つまり、テーブル・ファンクションはビューに似ています。ただし、SQLで宣言を使用して変換を定義するかわりに、PL/SQLでプロシージャを使用して定義します。これは特に、ETLに通常必要な独特の複雑な変換に役立ちます。

関連項目

 

PL/SQLパッケージ

パッケージとは、関連するプロシージャとファンクションおよびこれらのプロシージャとファンクションが使用するカーソルと変数をグループとしてまとめたもので、1単位として継続的に使用できるようにデータベースに格納されています。スタンドアロン・プロシージャやファンクションと同様に、パッケージ・プロシージャとファンクションは、アプリケーションやユーザーが明示的にコールできます。

Oracle Databaseには、データベースの機能性を拡張してSQL機能へのPL/SQLアクセスを提供する多数のPL/SQLパッケージがあります。たとえば、ULT_HTTPパッケージを使用すると、PL/SQLとSQLからのHTTPコールアウトでインターネット上のデータにアクセスしたり、Oracle Web Server Cartridgesをコールできます。オラクル社が提供するパッケージは、アプリケーションの作成時や、独自のストアド・プロシージャを作成する場合に使用できます。

パッケージは、仕様部と本体の2つの部分に分けて作成します。パッケージの仕様部ではパッケージのすべてのパブリックな構成メンバーを宣言し、本体ではパッケージのすべての構成メンバー(パブリックとプライベート)を定義します。パッケージ本体は、パッケージと同じスキーマに作成する必要があります。パッケージを2つに分けることには、次のような利点があります。

図25-3に、従業員データベースの管理に使用するいくつかのプロシージャをカプセル化するパッケージを示します。

図25-3    ストアド・パッケージ


画像の説明

データベース・アプリケーションは、必要に応じて明示的にパッケージ・プロシージャをコールします。employees_managementパッケージに対する権限を付与されたユーザーは、そこに含まれている任意のプロシージャを明示的に実行できます。たとえば、Oracle Enterprise ManagerまたはSQL*Plusでは、次の文を発行してhire_employeesパッケージ・プロシージャを実行できます。

EXECUTE employees_management.hire_employees ('TSMITH', 'CLERK', 1037, SYSDATE, 500, 
NULL, 20); 

関連項目

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

  • 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』

 

パッケージの利点

パッケージは、次の分野で特長を発揮します。

PL/SQLのコレクションとレコード

多数のプログラミング技法は、配列、構造体、リスト、ネストした表、セットおよびツリーなどのコレクション型を使用します。これらの技法をデータベース・アプリケーション内でサポートするために、PL/SQLにはデータ型TABLEおよびVARRAYが用意されており、索引付き表、ネストした表および可変サイズ配列を宣言できます。

この項の内容は、次のとおりです。

コレクション

コレクションは、すべて同じ型の要素からなる順序付けられたグループです。各要素には、コレクション内での位置を決定する一意の添字が付いています。

コレクションの機能は、ほとんどの第3世代プログラミング言語に見られる配列と同じです。また、コレクションはパラメータとして渡すことができます。そのため、データベース表との間や、クライアント側アプリケーションとストアド・サブプログラムの間で、データの列を移動するときに使用できます。

レコード

%ROWTYPE属性を使用すると、表の1行やカーソルからフェッチされる1行を表すレコードを宣言できます。ただし、ユーザー定義レコードの場合は、所有しているフィールドを宣言できます。

レコードには一意の名前を持つフィールドが含まれ、そのデータ型は異なっていてもかまいません。名前、給与および採用日など、従業員に関する各種データがあるとします。これらの項目は、型は異なりますが論理的には関連しています。項目ごとに1フィールドを含むレコードを使用すると、データを論理単位として扱うことができます。

関連項目

コレクションおよびレコードの使用方法の詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください。 

PL/SQL Server Pages

PL/SQL Server Pages(PSP)は、特殊なタグによりPL/SQLスクリプトが埋め込まれているサーバー側のWebページ(HTMLまたはXML形式)です。動的Webページを生成するために、通常、開発者はCまたはPerlを使用して、同じプログラム内でデータをフェッチし、Webページ全体を生成するCGIプログラムを記述しています。この種の動的ページの開発とメンテナンスは、コストと時間がかかる作業です。

スクリプト化により、動的Webページの迅速な開発というニーズに対処できます。HTMLページには、元のHTMLの可読性を変えずに小型スクリプトを埋め込むことができます。スクリプトには、HTMLページの動的部分を生成し、ユーザーが要求したときに実行されるロジックが含まれています。

HTMLの内容をアプリケーション・ロジックから切り離すことにより、スクリプト・ページの開発、デバッグおよびメンテナンスが容易になります。開発モデルが簡素化されており、通常のスクリプト作成言語はプログラミング・スキルをあまり必要としないため、Webページの作成者が動的Webページを開発できます。

HTMLページに埋め込まれたスクリプトには、クライアント側スクリプトとサーバー側スクリプトの2種類があります。クライアント側スクリプトは、HTMLページの一部として戻され、ブラウザ内で実行されます。このスクリプトは、主としてクライアント側でHTMLページのナビゲーションやデータの妥当性チェックに使用されます。サーバー側スクリプトもHTMLページに埋め込まれますが、サーバー側で実行されます。このスクリプトは、データをフェッチして操作し、ページの一部として戻されるHTMLの内容を生成します。PSPスクリプトは、サーバー側スクリプトです。

PL/SQL GatewayはHTTPクライアントからHTTP要求を受信し、URLに指定されているPL/SQLストアド・プロシージャを起動し、クライアントにHTTP出力を戻します。PL/SQL Server Pagesは、PSPコンパイラによってPL/SQLストアド・プロシージャにコンパイルされます。ゲートウェイによりプロシージャが実行されると、動的な内容を持つWebページが生成されます。PSPは、次の2つの既存のPL/SQL Gatewayのどちらかとともに使用します。

Javaの概要

Javaは、アプリケーション・レベルのプログラムに効果を発揮するオブジェクト指向のプログラミング言語です。Javaの機能は、次のとおりです。

この項の内容は、次のとおりです。

Javaおよびオブジェクト指向プログラミングの用語

この項には、Oracle Database環境におけるJavaアプリケーション開発の基本用語が含まれます。

この項の内容は、次のとおりです。

クラス

オブジェクト指向プログラミング言語はすべて、クラスの概念をサポートしています。表の定義では、クラスから共通の特性を共有するオブジェクト用のテンプレートが提供されます。それぞれのクラスには次の項目を含めることができます。

クラスからオブジェクトを作成すると、そのクラスのインスタンスが作成されます。インスタンスには、データまたは状態と呼ばれるオブジェクトのフィールドが含まれます。

図25-4に、2つの属性である姓(lastName)と従業員識別子(ID)を使用して定義されているEmployeeクラスの例を示します。

図25-4    クラスとインスタンス


画像の説明

インスタンスを作成するときは、属性には、ある従業員にのみ関係する個人のプライベートな情報を格納します。すなわち、従業員のインスタンスに含まれる情報は、該当する1人の従業員に対してのみ公開されます。図25-4の例は、従業員の2つのインスタンスSmithとJonesを示しています。各インスタンスには、個々の従業員に関連する情報が含まれています。

属性

インスタンス内の属性はフィールドと呼ばれます。インスタンスのフィールドは、リレーショナル表の行フィールドに類似しています。クラスにより、フィールドと各フィールドのタイプが定義されます。Java内のフィールドを静的、パブリック、プライベート、保護付きまたはデフォルト・アクセスとして宣言できます。

言語仕様では、すべてのフィールドのデータの可視性規則が定義されます。可視性規則では、これらのフィールド内のデータにアクセス可能な環境を定義します。

メソッド

クラスでは、クラスのインスタンスを起動するメソッドも定義します。メソッドはJavaで記述され、オブジェクトの動作を定義します。このように状態と動作をまとめることがカプセル化の本質であり、すべてのオブジェクト指向プログラミング言語の特長です。各従業員のidがプライベート・フィールドであることを宣言してEmployeeクラスを定義すると、他のオブジェクトは、メソッドがフィールドを戻したときにのみそのプライベート・フィールドにアクセスできます。この例では、オブジェクトは、Employee.getIdメソッドを起動することで、従業員の識別子を取得します。

また、カプセル化では、Employee.getIdメソッドをプライベートとして宣言すること、あるいはEmployee.getIdメソッドを記述しないでおくことができます。カプセル化を行うと、再利用可能なプログラム、または不正に使用されることのないプログラムを容易に記述できるようになります。カプセル化では、パブリックの宣言を行ったオブジェクトの機能のみがパブリックになります。他のすべてのフィールドとメソッドはプライベートです。プライベート・フィールドとプライベート・メソッドは、内部オブジェクトの処理に使用できます。

クラス階層

Javaでは、クラスをクラスの大きな階層内で定義します。階層の最上位にあるのは、Objectクラスです。Javaのすべてのクラスはスーパークラスの継承連鎖内を移動する過程で、あるレベルのObjectクラスを継承しています。クラスBがクラスAを継承している場合、クラスBの各インスタンスには、クラスBで定義したすべてのフィールドとクラスAで定義したすべてのフィールドが含まれます。たとえば、図25-5では、FullTimeEmployeeクラスはEmployeeクラスを継承しているため、Employeeクラスで定義したidおよびlastNameフィールドを含みます。また、FullTimeEmployeeクラスでは、FullTimeEmployeeにのみ含まれる別のフィールドbonusが追加されます。

クラスBのインスタンスでは、クラスAまたはクラスBのいずれかで定義された任意のメソッドを起動できます。従業員の例では、FullTimeEmployeeインスタンスでは、その独自クラスでのみ定義されているメソッド、またはEmployeeクラスで定義されたメソッドを起動できます。

図25-5    継承を使用した動作と状態のローカライズ


画像の説明

クラスBのインスタンスは、クラスAのインスタンスで置換可能です。これにより、コードの再利用性を改善するための、オブジェクト指向言語の強化された構成メンバーが継承されます。また、動作と状態を定義する新しいクラスを、階層内の適切な場所、しかもクラス・ライブラリの既存の機能が利用できる場所に作成できます。

インタフェース

Javaでサポートされるのは1つの継承のみです。すなわち、各クラスは継承したクラスを1つのみ持ちます。1つ以上のソースを継承する必要がある場合、Javaはこれまでのような複雑さや混乱を招くことなく、複数継承に相当する継承をインタフェースを介して提供します。インタフェースはクラスに類似しています。ただし、インタフェースではメソッドを実装するかわりに、メソッドのシグネチャを定義します。このメソッドは、インタフェースを実装するように宣言したクラスに実装されます。1つのクラスで同時に多数のインタフェースをサポートすると、複数継承が発生します。

ポリモフィズム

前述のEmployeeの例で、各種の従業員が給与累計で対応できるようにする必要があるとします。給与は、従業員の種類ごとに異なる方法で計算されます。

従来の手続き型言語では、可能なケースをそれぞれ定義して長いSWITCH文を記述します。

switch (employee.type) {
case: Employee
return employee.salaryToDate;
case: FullTimeEmployee
return employee.salaryToDate + employee.bonusToDate;
...

新しい種類のEmployeeを追加する場合は、SWITCH文を更新する必要があります。データ構造を変更する場合は、その構造を使用するSWITCH文をすべて変更する必要があります。

Javaなどのオブジェクト指向言語では、Employeeクラスのうち、すでにこのクラスで定義されている以上の特殊な処理を必要とするサブクラスごとにメソッドcompensationToDateを実装します。たとえば、NonExemptEmployeecompensationToDateメソッドを次のように実装するとします。

private float compensationToDate() {
return super.compensationToDate() + this.overtimeToDate();
}

FullTimeEmployeeのメソッドを次のように実装します。

private float compensationToDate() {
return super.compensationToDate() + this.bonusToDate();
}

メソッド名compensationToDateを共通して使用することで、使用している従業員の種類を知らなくても、同じメソッドを異なるクラスで起動して異なる結果を受け取ることができます。FullTimeEmployeesPartTimeEmployeesを処理するために特殊なメソッドを記述する必要はありません。このように、異なるオブジェクトに対して同じメッセージに異なる方法で対応する機能は、ポリモフィズムと呼ばれます。

また、Employeeをまったく継承しない新規のクラスContractorを作成し、そこでcompensationToDateメソッドを実装できます。給与累計を計算するプログラムは、フルタイム、パートタイム、外注契約者のいずれであるかに関係なく給与計算時にすべての従業員を反復し、それぞれでcompensationToDateメソッドを起動した結果戻された値を合算します。メソッドのコール元が正常に動作することがわかっていれば、個々のcompensationToDateメソッドを安全に変更できます。たとえば、既存のクラスに新規フィールドを安全に追加できます。

Java仮想マシン(JVM)の概要

Javaソースは、他の高水準言語と同様、低水準の命令にコンパイルされます。Javaでは、これらの命令はバイトコードと呼ばれています(これらの命令サイズが一律1バイトの記憶単位であるためです)。Cなど他のほとんどの言語は、IntelまたはHPプロセッサに固有の命令など、コンピュータ固有の命令にコンパイルされます。Javaソースは、プラットフォームに依存しない、標準のバイトコード集合にコンパイルされ、Java仮想マシン(JVM)と対話します。JVMは、Javaコードを実行する特定のプラットフォーム用に最適化された個別のプログラムです。

図25-6に、Javaによりプラットフォームの独立性がどのように保たれるかを示します。Javaソースはバイトコードにコンパイルされ、プラットフォームに依存しません。各プラットフォームには、オペレーティング・システムに固有のJVMをインストールします。ソースのJavaバイトコードは、JVMを介して、プラットフォームに依存する適切な処理へと翻訳されます。

図25-6    Javaコンポーネント構造


画像の説明

Javaプログラムの開発では、Java言語で記述された事前定義のコア・クラス・ライブラリを使用します。Javaコア・クラス・ライブラリは、基本言語サポート(java.lang)、I/O(java.io)およびネットワーク・アクセス(java.net)など、一般的な機能を提供するパッケージに論理的に分割されています。JVMとコア・クラス・ライブラリにより、Javaプログラマの開発するプログラムが、Javaをサポートするすべてのハードウェアおよびオペレーティング・システムで、確実に実行できるようなプラットフォームが提供されます。この概念は、「1回プログラミングすれば、どこでも実行可能」というJavaの考え方を推進するものです。

図25-7に、OracleのJavaアプリケーションがJavaコア・クラス・ライブラリの最上位に配置され、さらに、JVMの最上位に配置される様子を示します。OracleのJavaサポート・システムはデータベース内に配置されるので、JVMはオペレーティング・システムと直接対話するかわりに、Oracle Databaseライブラリと対話します。

図25-7    Javaコンポーネント構造


画像の説明

Sun社により、Java言語およびJVMの仕様が提供されます。Java言語仕様(JLS)で構文とセマンティクスなどが定義され、JVM仕様でバイトコードを実行するコンピュータに必要な下位レベルの動作が定義されます。さらに、Sun社からは、JVMの実装者が仕様に従ってコンパイルしたかどうかを判断するための互換性テスト一式が提供されます。このテスト一式は、Java Compatibility Kit(JCK)と呼ばれます。OracleのJVM実装は、JCKに完全に準拠しています。Java方針の一部は、公開された仕様規格と、その企画への準拠を検証する簡単な方法とで構成されており、これにより、ベンダーはすべてのプラットフォーム上のJavaに対し均一なサポートを提供できます。

Oracle DatabaseでJavaを使用する理由

データベースでJavaアプリケーションを記述およびロードできるのは、Javaが安全な言語であるためです。Javaは、Javaコードが格納されているオペレーティング・システムの改ざんを防止します。Cなど、一部の言語では、データベースにセキュリティ上の問題が生じる可能性があります。Javaの場合は、その設計上、データベース内で容認できる安全な言語です。

Javaは開発者にとって多数の利点がありますが、Javaサーバー・アプリケーションをサポートするJVMをスケーラブルな方法で実装するのは難問です。この項では、これらの難問について説明します。

マルチスレッド

マルチスレッドのサポートは、通常、Javaの主要なスケーラビリティ機能の1つと見られています。特に、Javaを使用すると、Java言語およびクラス・ライブラリにより、他の多数の言語に比べて共有サーバー・アプリケーションの作成が簡素化されます。しかし、どのような言語でも、信頼性が高いスケーラブルな共有サーバー・コードを記述するのは困難な作業です。

Oracle Databaseは、データベース・サーバーとして多数のユーザーの作業を効率的にスケジュールします。Oracle JVMはRDBMSサーバーの機能を使用して、多数のユーザーのJava実行スケジュールを同時に設定します。Oracle DatabaseはJLSとJCKに必要なJava言語レベルのスレッドをサポートしていますが、データベースの有効範囲内でスレッドを使用するとスケーラビリティは向上しません。データベースの埋込みスケーラビリティを使用すると、共有サーバーのJavaサーバーを記述する必要がなくなります。ユーザーのスケジューリングには、シングル・スレッドJavaアプリケーションを作成してデータベースの機能を使用する必要があります。データベースが各アプリケーション間のスケジューリングを受け持つため、スレッドを管理しなくてもスケーラビリティが実現します。共有サーバーのJavaアプリケーションを作成することもできますが、複数のJavaスレッドを使用してもサーバーのパフォーマンスは向上しません。

マルチスレッドによりJavaに生じる難問の1つは、スレッドと自動記憶域管理、つまりガベージ・コレクションとの間の相互作用です。汎用JVMで実行されるガベージ・コレクタでは、どのJava言語スレッドが実行されているか、あるいは基礎となるオペレーティング・システムでどのようにスケジュールされているかは認識されません。

自動記憶域管理

ガベージ・コレクションはJavaの自動記憶域管理の主機能であり、Java開発者はメモリーの割当てと解放を明示的に行う必要がなくなります。そのため、CやC++のプログラムで一般に問題となるメモリー・リークの大きな発生源が排除されます。この利点は代価も伴います。つまり、ガベージ・コレクションはプログラムの実行スピードとフットプリントのオーバーヘッドに影響します。このトレードオフを定性的/定量的に評価する多数の論文が記述されていますが、全体のコストは代替案と比較して妥当です。

ガベージ・コレクションは、高度な拡張性を持つ高速のJavaプラットフォームを提供しようとするJVM開発者に難問を課します。Oracle JVMは、これらの難問に次の方法で対処します。

フットプリント

Javaプログラムの実行によるフットプリントは、次のように様々な要因の影響を受けます。

スケーラビリティの観点から、多数の同時クライアントをサポートするには、ユーザー・セッションのフットプリントを最小限に抑えることが重要です。Oracle JVMは、Javaバイト・コードなど、ユーザー用のすべての読取り専用データを共有メモリーに格納することで、ユーザー・セッションのフットプリントを最小限に抑えます。ユーザー・セッションのフットプリントが大きくならないように、コールとセッションのメモリーに対して、適切なガベージ・コレクション・アルゴリズムが適用されます。Oracle JVMは、次の3種類のガベージ・コレクション・アルゴリズムを使用して、ユーザーのセッション・メモリーをメンテナンスします。

パフォーマンス

Oracle JVMのパフォーマンスは、システム固有のコンパイラを実装することで拡張されます。Javaは、JVMの最上位でプラットフォームに依存しないバイトコードを実行し、バイトコードは特定のハードウェア・プラットフォームと相互作用します。ソフトウェア内でレベルを追加すると、パフォーマンスが低下します。Javaでは、プラットフォームに依存しないバイトコードを解析するために仲介部分を通過する必要があるため、Cのようにプラットフォーム依存言語に存在しないJavaアプリケーションの場合は、ある程度の非効率が生じます。この問題に対処するために、複数のJVMサプライヤがシステム固有のコンパイラを作成しています。システム固有のコンパイラは、Javaバイトコードをプラットフォームに依存するシステム固有のコードに変換します。これにより、解析処理が不要になり、パフォーマンスが改善されます。

表25-1に、システム固有の2つのコンパイル方法を示します。

表25-1    システム固有のコンパイル方法 
メソッド  説明 

Just-In-Time(JIT)コンパイル 

JITコンパイラは、実行時にJavaバイトコードをシステム固有(プラットフォーム固有)のコンピュータ・コードにすばやくコンパイルします。この場合、プラットフォームで実行される実行可能ファイルが生成されるかわりに、変換後に直接実行されるJavaバイトコードからのプラットフォーム依存コードが提供されます。頻繁に実行するJavaコードには、この方法を使用する必要があります。この実行スピードは、Cなどの言語とほぼ同じです。 

静的コンパイル 

静的コンパイルでは、Javaバイトコードが実行前にプラットフォームに依存しないCコードに変換されます。標準的なCコンパイラは、Cコードをターゲット・プラットフォーム用の実行可能ファイルにコンパイルします。あまり変更されないJavaアプリケーションには、このアプローチが適しています。このアプローチでは、最近のCコンパイラに見られる成熟して効率的なプラットフォーム固有のコンパイル技法が利用されています。 

Oracle Databaseは、静的コンパイルを使用して、コアJavaクラス・ライブラリであるORBおよびJDBCコードをコンパイル済の形式で提供します。これらのコードは、Oracleがサポートしているすべてのプラットフォーム間で適用できますが、JITアプローチの場合は、プラットフォームごとに下位レベルのプロセッサ依存コードを記述してメンテナンスする必要があります。このシステム固有のコンパイル技法は、独自のJavaコードに使用できます。

動的クラス・ロード

Javaのもう1つの強力な機能は、動的クラス・ロードです。クラス・ローダーは、クラスがプログラムの実行中に使用される場合にのみディスクからロード(および解釈に必要なJVM固有のメモリー構造に格納)されます。また、クラスをCLASSPATH内で検索し、プログラムの実行中にロードします。このアプローチはアプレットにも使用できますが、サーバー環境では表25-2に示す問題を伴います。

表25-2    動的クラス・ロードに伴う問題 
問題  説明  解決策 

予測可能性 

クラス・ロード操作を初めて実行する場合は、重大なペナルティを伴います。単純なプログラムの場合は、Oracle JVMにそのニーズをサポートするための多数のコア・クラスがロードされる可能性があります。ロードされるクラスの数を、プログラマが簡単に予測または判断することはできません。 

Oracle JVMは、他のJava仮想マシンと同様に、クラスを動的にロードします。ワンタイム・クラス・ロードのスピードは同じです。ただし、クラスは共有メモリーにロードされるため、そのクラスの他のユーザーはクラスを再ロードする必要はなく、単に同じ事前ロード・クラスを使用します。 

信頼性 

動的クラス・ロードの利点は、プログラムの更新がサポートされることです。たとえば、サーバー上でクラスを更新すると、プログラムをダウンロードして動的にロードするクライアントでは、次回にそのプログラムを使用するときに更新内容が表示されます。サーバー・プログラムは、信頼性を強調する傾向があります。開発者は、各クライアントが特定のプログラム構成を実行することを知っておく必要があります。ロードする意図のない一部のクラスがクライアントによって意図せずにロードされないようにしてください。 

Oracle Databaseでは、アップロードおよび解決操作が、実行時にクラス・ロード操作と分離されます。開発したJavaコードをサーバーにアップロードするには、loadjavaユーティリティを使用します。CLASSPATHを使用するかわりに、インストール時にリゾルバを指定します。リゾルバはCLASSPATHに似ていますが、クラスがあるスキーマを指定する必要があります。このように解決をクラス・ロードから分離することで、プログラム・ユーザーによる実行内容を常に把握できます。 

OracleのJavaアプリケーション方針

Javaの魅力は、ユビキタスと、それをアプリケーション開発に使用できるプログラマの数が増加していることです。オラクル社は、エンタープライズ・アプリケーションの開発者に、Javaアプリケーションの作成、デプロイおよび管理のためのエンドツーエンドのJavaソリューションを提供します。この総合的なソリューションは、クライアント側とサーバー側のプログラム・インタフェース、Java開発をサポートするためのツール、Oracle Databaseと統合されたJava仮想マシンで構成されています。これらの製品はいずれも、Java標準との互換性を持っています。

Javaプログラミング環境には、Oracle JVMに加えて次のコンポーネントがあります。

この項の内容は、次のとおりです。

Javaストアド・プロシージャ

Javaストアド・プロシージャは、PL/SQLストアド・プロシージャと同様に、サーバーで実行するためのJavaで記述するプログラムです。Javaストアド・プロシージャには、SQL*Plusなどの製品で直接起動する方法と、トリガーを使用して間接的に起動する方法があります。また、OCI、プリコンパイラまたはJDBCなど、すべてのOracle Netクライアントからアクセスできます。

また、Javaを使用して、PL/SQLに依存しない強力なプログラムを開発することもできます。Oracle Databaseには、Javaプログラミング言語とJVMの完全準拠の実装が用意されています。

関連項目

Javaでストアド・プロシージャを記述する方法、PL/SQLからアクセスする方法およびJavaからPL/SQL機能にアクセスする方法は、『Oracle Database Java開発者ガイド』を参照してください。 

PL/SQLの統合とOracle Databaseの機能

既存のPL/SQLプログラムをJavaから起動したり、JavaプログラムをPL/SQLから起動できます。このソリューションでは、Javaベースのインターネット・コンピューティングの利点と機会を活用しながら、既存の資産を保護して利用できます。

JDBC

Java Database Connectivity(JDBC)は、SQLデータにアクセスするJava開発者向けのApplication Program Interface(API)です。このAPIはクライアントとサーバーで使用できるため、同じコードをどちらにでもデプロイできます。

OracleのJDBCでは、動的SQLを通じて、Javaプログラムからデータベース内で定義されたオブジェクト型とコレクション型にアクセスできます。動的SQLとは、実行される埋込みSQL文がアプリケーションの実行前には認識されず、文の作成には入力が必要であることを意味します。この機能は、データベース内で定義されている型を、デフォルトまたはカスタマイズ可能なマッピングを通じてJavaのクラスに変換します。また、JavaおよびJ2EEアプリケーションによるリソース使用を監視およびトレースし、データベース操作レベルに相関付けることもできます。

コアJavaクラス・ライブラリには、JDBC APIが1つのみ用意されています。ただし、JDBCは、ベンダーが特定のデータベースを必要に応じて特化するためのドライバを提供できるように設計されています。Oracleには、次の3種類のJDBCドライバが用意されています。

表25-3    JDBCドライバ 
ドライバ  説明 

JDBC Thinドライバ 

JDBC Thinドライバを使用すると、Oracle SQLのデータにアクセスする100%のPure Javaアプリケーションおよびアプレットを作成できます。JDBC Thinドライバは、他のJavaアプレットと同様にWebページから動的にダウンロードできるため、Webブラウザ・ベースのアプリケーションとアプレットに特に適しています。 

JDBC Oracle Call Interfaceドライバ 

JDBC Oracle Call Interface(OCI)ドライバは、クライアントまたは中間層にあるOracle固有のネイティブ・コード(つまり非Java)ライブラリにアクセスし、JDBC Thinドライバに比べて豊富な機能セットとパフォーマンス向上をもたらしますが、サイズが極端に大きくなることと、クライアント側でのインストールというコストの問題があります。 

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

Oracle Databaseは、Javaコードがサーバー上で実行される場合に、サーバー側内部ドライバを使用します。これにより、サーバーのJVM内で実行中のJavaアプリケーションは、JDBCを使用してローカルに定義されたデータ(つまり、同じコンピュータの同じプロセスにあるデータ)にアクセスできます。また、基礎となるOracle RDBMSライブラリを直接使用できるため、さらにパフォーマンスが向上し、JavaコードとSQLデータの間にネットワーク接続が介入することによるオーバーヘッドは発生しません。Oracle Databaseでは、サーバー上で同じJava-SQLインタフェースをサポートすることで、デプロイ時にコードの再処理を必要としません。  

関連項目

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

  • JDBCプログラムの例は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』を参照してください。

 

SQLJ

SQLJを使用すると、開発者はJavaプログラムでオブジェクト・データ型を使用できます。開発者は、JPublisherを使用してOracleのオブジェクト型とコレクション型をJavaクラスにマップし、アプリケーションで使用できます。

SQLJでは、Javaコードに埋め込まれたSQL文を使用してサーバー・オブジェクトにアクセスします。SQLJは、SQL文のオブジェクト型とコレクションのコンパイル時型チェック機能を提供します。構文は、ANSI規格(SQLJ Consortium)に準拠しています。

Javaクラスは、SQLのユーザー定義オブジェクト型として指定できます。このSQLJ型の列または行を定義できます。また、この型のオブジェクトは、SQLプリミティブ型であるかのように問い合せて操作できます。さらに、次のことができます。

JPublisher

Java Publisher(JPublisher)は、完全にJavaで記述されたユーティリティで、次のユーザー定義データベース・エンティティを表すJavaクラスをJavaプログラムで生成します。

JPublisherによって、これらのエンティティからJavaクラスへのマッピングを強い型指定のパラダイムで指定およびカスタマイズできます。

関連項目

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

Java Message Service

Java Message Service(JMS)は、Sun社がOracle、IBMおよび他のベンダーと共同開発したメッセージ処理標準です。JMSでは、JMSアプリケーション用の一連のインタフェースが定義され、JMSプロバイダが実装する動作が指定されています。JMSには標準ベースのAPIが用意されており、社内および顧客やパートナとの間でビジネス・イベントを非同期に交換できるようにします。JMSにより、分散環境の疎結合コンポーネント間で信頼性の高い通信が容易になり、企業の統合に必要な作業が大幅に簡素化されます。Javaテクノロジとエンタープライズ・メッセージ処理を組み合せて、移植性の高いアプリケーションを開発できます。

Oracle Java Message Serviceは、JMS標準に準拠したOracle Streams用のJava APIです。複数のクライアント・アプリケーションでは、中央のJMSプロバイダ(Oracle Streams)を介して、あらゆるタイプのメッセージが送受信できます。JMSクライアントは、Javaアプリケーションとメッセージ・クライアント・ランタイム・ライブラリで構成され、このランタイム・ライブラリがJMSインタフェースを実装してOracle Streamsと通信します。

Javaメッセージ用のOracle JMSは標準JMSインタフェースをサポートしており、標準に含まれていない他のOracle Streams機能をサポートするための拡張機能も用意されています。Oracle JMSを使用すると、Oracle Streamsで使用可能なキューにメッセージをエンキューおよびデキューできます。Oracle JMSの標準JMS機能は、次のとおりです。

Oracle Streamsには、標準JMS機能に対する拡張機能も用意されています。

Microsoftプログラミング言語の概要

Oracleには、Visual BasicやActive Server Pageなど、COMベースのプログラミング言語からの様々なデータ・アクセス方式が用意されています。たとえば、Oracle Objects for OLE(OO4O)やOracle Provider for OLE DBがあります。後者は、Microsoft社のActiveX Data Objects(ADO)で使用できます。Microsoft Officeなど、COMオートメーション・サーバーに対するサーバー側プログラミングは、COMオートメーション機能を介して使用可能です。さらに従来型のODBCアクセスは、OracleのODBCドライバを介して使用可能です。C/C++アプリケーションでは、Oracle Call Interface(OCI)も使用できます。これらのデータ・アクセス・ドライバは、Oracle Databaseで優れたパフォーマンスを発揮するように設計されており、サード・パーティのドライバでは使用できないデータベースの拡張機能を提供します。

また、OracleはOracle Data Provider for .NETを介して最適の.NETデータ・アクセス・サポートを提供し、.NETからOracle拡張機能にアクセスできるようにします。さらに、OLE DB .NETとODBC .NETもサポートしています。

この項の内容は、次のとおりです。

Open Database Connectivity

Open Database Connectivity(ODBC)は、データベースに接続し、データベースに対してSQL文を準備して実行するためのデータベース・アクセス・プロトコルです。アプリケーションをODBCドライバと組み合せることで、Excelのようなスプレッドシートに格納されているデータなど、あらゆるデータ・ソースにアクセスできます。ODBCは普及している標準APIであるため、ODBC標準に準拠するアプリケーションを記述できます。ODBCドライバは、ODBC標準とアプリケーションがアクセスする特定のデータベースの間のマッピングをすべて実行します。ODBC準拠のプログラムは、どのデータ・ソースへのアクセスにもデータ・ソース固有のドライバをそのまま使用でき、追加の開発作業を必要としません。

OracleにはODBCインタフェースが用意されているため、ODBC準拠であれば、どのようなアプリケーションからもOracleのODBCドライバを使用してOracle Databaseデータベースにアクセスできます。たとえば、Visual Basicで記述されたアプリケーションでは、ODBCを使用してOracle Databaseにアクセスできます。

Oracle Objects for OLEの概要

Oracle Objects for OLE(OO4O)を使用すると、Microsoft社のCOMオートメーションおよびActiveXテクノロジをサポートしているプログラミング言語またはスクリプト言語を使用して、Oracle Databaseに格納されているデータに容易にアクセスできます。これには、Visual Basic、Visual C++、Visual Basic For Applications(VBA)、IIS Active Server Pages(VBScriptおよびJavaScript)などが含まれます。

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

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

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

OO4Oは、Visual BasicやExcelなどで開発された典型的な2層クライアント/サーバー・アプリケーション、Microsoft Internet Information Server(IIS)やMicrosoft Transaction ServerにおけるWebサーバー・アプリケーションのように複数層アプリケーション・サーバー環境にデプロイされたアプリケーション・サーバーなど、様々な環境でOracle Databaseにアクセスするための主機能を備えています。

Oracle Data Control

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

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

関連項目

『Oracle Objects for OLE開発者ガイド』 

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

Oracle Objects for OLEのC++クラス・ライブラリは、Oracle Object Serverへのプログラム的なアクセスを提供するC++クラスのコレクションです。このクラス・ライブラリはOLEオートメーションを使用して実装されますが、使用するのにOLE開発キットもOLE開発に関する知識も必要ありません。このライブラリにより、C++開発者はOO4OインタフェースにアクセスするCOMクライアント・コードを記述せずに済みます。

関連項目

「スタート」メニューから、Oracle Objects for OLEのC++クラス・ライブラリのヘルプを参照してください。 

Oracle Data Provider for .NET

Oracle Data Provider for .NET(ODP.NET)は、Oracle Database用のデータ・プロバイダの実装です。ODP.NETはOracleシステム固有のAPIを使用して、あらゆる.NETアプリケーションからOracle Databaseのデータおよび機能への高速かつ信頼性の高いアクセスを提供します。また、Microsoft .NET Frameworkクラス・ライブラリで使用可能なクラスとインタフェースを使用し、継承します。

.NET Frameworkと同じように、ODP.NETでは、ネイティブ・プロバイダによるプロバイダ固有の機能とデータ型の公開を可能にするADO.NETモデルが使用されます。

ODP.NETを使用すると、開発者はVisual Basic .NET、C#およびその他の.NET言語でプログラムを記述できます。

関連項目

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

レガシー言語の概要

この項の内容は、次のとおりです。

Pro*COBOLプリコンパイラの概要

Pro*COBOLプリコンパイラは、ホストCOBOLプログラムにSQL文を埋め込むためのプログラミング・ツールです。Pro*COBOLは入力としてソース・ファイルを読み取り、COBOLソース・ファイルを出力します。このソース・ファイルでは、埋込みSQL文がOracleランタイム・ライブラリ・コールで置換されてから、COBOLコンパイラによりコンパイルされます。

Pro*C/C++プリコンパイラと同様に、Pro*COBOLを使用すると高度にカスタマイズされたアプリケーションを作成できます。たとえば、最新のウィンドウおよびマウス・テクノロジを取り込むユーザー・インタフェースを作成できます。また、バックグラウンドで実行されてユーザーの介入を必要としないアプリケーションも作成できます。

さらに、Pro*COBOLではアプリケーションの詳細なチューニングが可能です。リソース使用、SQL文の実行および各種のランタイム・インジケータを緊密に監視できます。この情報を使用してプログラムのパラメータを調整し、パフォーマンスを最大化します。

関連項目

『Pro*COBOLプログラマーズ・ガイド』 

Pro*FORTRANプリコンパイラの概要

Oracle Pro*FORTRANプリコンパイラを使用すると、ホストFORTRANプログラムにSQLを埋め込むことができます。

Pro*FORTRANは、Windowsではサポートされません。

関連項目

『Pro*FORTRAN Supplement to the Oracle Precompilers Guide』 


戻る 次へ
Oracle
Copyright © 1993, 2008 Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引