アプリケーション開発者がOracle Databaseと対話するためのプログラムを作成する場合、次のような多くの選択肢があります。
従来のクライアント/サーバー・プログラムでは、アプリケーションのコードはデータベース・サーバー以外のシステムである、クライアント・システム上で実行されます。データベース・コールは、クライアント・システムからデータベース・サーバーに送信されます。挿入および更新操作時には、データがクライアントからサーバーに送信され、問合せ操作時には、データがサーバーからクライアントに戻されます。データは、クライアント・システム上で処理されます。クライアント/サーバー・プログラムは、通常、プリコンパイラを使用して作成されますが、SQL文はC、C++、COBOLなどの別の言語のコードに埋め込まれています。
データベースで変更が発生した場合に自動的に実行されるトリガー、または明示的に起動されるストアド・サブプログラムを使用して、完全にデータベース内に常駐するアプリケーション・ロジックを開発できます。アプリケーションから作業をオフロードすると、検証およびクリーン・アップの実行に使用されるコードを再利用できたり、様々なクライアントからのデータベース処理を制御できます。たとえば、Webサーバーを介したストアド・サブプログラムの起動を可能にすることで、クライアント/サーバー・アプリケーションと同じ機能を実行するWebベースのユーザー・インタフェースを構成できます。
クライアント/サーバー・コンピューティングは、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は、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;
関連項目:
|
PL/SQLは、移植可能な高性能トランザクション処理言語で、次のようなメリットがあります。
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アプリケーションを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ストアド・プロシージャを起動できます。このモジュールにより次のアクションが実行されます。
ブラウザ・クライアントから渡されたURLが変換されます。
URL内のパラメータを使用してOracle Databaseストアド・サブプログラムが起動されます。
クライアントに出力(通常は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アプリケーションを開発できます。
この項では、Javaアプリケーションをサポートする組込みデータベース機能の概要を説明します。データベースには、java
.lang
、java
.io
などのコアJDKライブラリが含まれています。データベースでは、JDBCおよびSQLJなどのクライアント側Java標準がサポートされています。また、データベース内でデータ処理集中型のJavaコードを実行可能な、サーバー側のJDBCおよびSQLJドライバが提供されています。
内容は次のとおりです。
関連項目:
|
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)を介して、保護および制御されます。
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ドライバはタイプ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ドライバはタイプ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内部ドライバは、タイプ2のドライバで、データベース・サーバー内で実行されます。このため、大量データへのアクセスに必要なラウンドトリップの数が削減されます。このドライバと、JavaサーバーVM、データベース、実行速度を最大で10倍に上げるJavaネイティブ・コンパイラ、およびSQLエンジンは、すべて同じアドレス空間内で実行されます。
このドライバは、データベースで使用されるすべてのJavaプログラムのサーバー側サポートを提供します。PL/SQLストアド・サブプログラムおよびトリガーをコールすることもできます。
サーバー側JDBCドライバは、クライアント側ドライバと同じ機能および拡張機能を完全にサポートします。
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の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();
次のソース・コードは、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()
の文字列の指定は異なります。
JDBCコードおよびSQLJコード(「Oracle SQLJの概要」を参照)は相互運用が可能なため、JDBCの動的SQL文をSQLJの静的および動的SQL文とともに使用できます。SQLJのイテレータ・クラスが、JDBCの結果セットに対応します。
関連項目: JDBCの詳細は、『Oracle Database JDBC開発者ガイドおよびリファレンス』を参照してください。 |
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ユーザーズ・ガイド』を参照してください。 |
内容は次のとおりです。
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データ型の拡張機能が含まれています。
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ソース・コードをクライアント上で変換、コンパイルおよびカスタマイズ後に、loadjava
ユーティリティを使用して、生成済のクラスおよびリソースをサーバーにロードします。通常、クラスはJavaアーカイブ(.jar
)ファイルに格納されます。
または、loadjava
を使用してSQLJソース・コードをサーバーにロードし、サーバーの埋込みトランスレータを使用してこのコードを変換およびコンパイルします。
関連項目: Oracle SQLJとともにストアド・サブプログラムを使用する方法の詳細は、『Oracle Database 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ストアド・サブプログラム、およびプレゼンテーションやビジネス・ロジック操作を実行する別のプログラムを作成できます。
SQLを使用したJavaストアド・サブプログラム・インタフェースでは、PL/SQLと類似した実行モデルを使用します。
関連項目: 『Oracle Database Java開発者ガイド』 |
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の公開
サブプログラムは、一連の文をカプセル化する名前付きブロックです。これらは、モジュール方式でメンテナンス性の高いアプリケーションの構成に使用できるという点で構築ブロックに似ています。このような名前付きブロックを作成し、次に、loadjava
コマンド、SQLのCREATE
FUNCTION
、CREATE
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インタフェース
オブジェクト型からのメソッドのコール
内容は次のとおりです。
データベース・トリガーとは、DML操作で特定の表が変更された場合など、特定のイベントが発生した場合に、Oracle Databaseが自動的に開始(起動)するストアド・プロシージャです。トリガーを使用すると、ビジネス・ルールを徹底し、無効な値の格納を防ぐことができます。また、各アプリケーションでチェックおよびクリーン・アップ操作を実行する必要性が減少します。
ストアド・サブプログラムおよびトリガーは1回コンパイルするのみで簡単に使用でき、メンテナンス性が高く、必要なメモリーおよび計算オーバーヘッドが少なくて済みます。
ネットワークのボトルネックが回避され、応答時間が短縮されます。分散アプリケーションの作成および使用がより容易になります。
計算集中型のサブプログラムは、サーバーで実行する方が高速に実行されます。
実行者権限ではなく、定義者権限によって実行するストアド・サブプログラムおよびトリガーのみをユーザーに対して使用可能にすることで、データ・アクセスを制御できます。
PL/SQLおよびJavaのストアド・サブプログラムが相互に起動できます。
サーバー内のJavaはJava言語仕様(JLS)に従ってSQLJ標準を使用できるため、Oracle Database以外のデータベースもサポートされます。
ストアド・サブプログラムおよびトリガーは、場所が異なるサイトおよび様々なアプリケーション内で再利用できます。
Pro*C/C++プリコンパイラは、プログラマがCまたはC++のソース・ファイル内にSQL文を埋め込むことができるようにするためのソフトウェア・ツールです。Pro*C/C++はソース・ファイルを入力として読み込み、CまたはC++のソース・ファイルを出力します。この出力ソース・ファイルで埋込みSQL文がOracle Databaseランタイム・ライブラリ・コールによって置き換えられ、CまたはC++コンパイラによってコンパイルされます。
プリコンパイル中またはその後のコンパイル中にエラーが検出された場合は、プリコンパイラの入力ファイルを変更して、プリコンパイルおよびコンパイルの2つの手順を再実行します。
内容は次のとおりです。
次に、スキーマ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++プログラマーズ・ガイド』を参照してください。
アプリケーションは、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プリコンパイラは、プログラマがCOBOLのソース・コード・ファイル内にSQL文を埋め込めるようにするためのソフトウェア・ツールです。Pro*COBOLはソース・ファイルを入力として読み取り、COBOLソース・ファイルを出力します。この出力ソース・ファイルでは埋込みSQL文がOracle Databaseランタイム・ライブラリ・コールによって置き換えられ、COBOLコンパイラによってコンパイルされます。
プリコンパイル中またはその後のコンパイル中にエラーが検出された場合は、プリコンパイラの入力ファイルを変更して、プリコンパイルおよびコンパイルの2つの手順を再実行します。
内容は次のとおりです。
次に、スキーマ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の機能のいくつかを簡単に説明します。
PL/SQLまたはJavaのストアド・サブプログラムを起動できます。PL/SQLブロックを埋め込むことによって、パフォーマンスを向上できます。PL/SQLブロックでは、独自に作成したか、またはOracle Databaseパッケージで提供されているサブプログラムを起動できます。
プリコンパイラ・オプションを使用すると、カーソル、エラー、構文検査、ファイル形式などの処理方法を定義できます。
プリコンパイラ・オプションを使用すると、プリコンパイル時のみでなく、実行時にもSQL文またはPL/SQL文の構文およびセマンティクスを確認できます。
様々な環境で実行できるように、条件付きでコード・セクションをプリコンパイルできます。
パフォーマンスを向上させるには、コード内で表、グループ項目またはグループ項目の表をホスト変数またはインジケータ変数として使用します。
エラーおよび警告の処理方法をプログラミングし、データの整合性を保証できます。
Pro*COBOLは、動的SQL(変数の値および文の構文をユーザーが入力できる手法)をサポートします。
関連項目: 詳細は、『Pro*COBOLプログラマーズ・ガイド』を参照してください。 |
Oracle Call Interface(OCI)およびOracle C++ Call Interface(OCCI)は、APIです。これらによって、3GL固有のサブプログラム起動を使用して、Oracle Databaseにアクセスしたり、SQL文実行のすべての過程を制御するアプリケーションを作成できます。これらのAPIは次のものを提供します。
システム・メモリーおよびネットワーク接続の効率的な使用による、パフォーマンスおよびスケーラビリティの向上
2層クライアント/サーバー環境または複数層環境における、動的なセッションおよびトランザクション管理のための一貫したインタフェース
N層認証
Oracle Databaseオブジェクトを使用したアプリケーション開発の包括的サポート
外部データベースへのアクセス
増加するユーザー数および要求数に対応したサービスを、ハードウェアを追加しなくても提供できるアプリケーション開発
OCIを使用すると、データベース内のデータおよびスキーマをC言語のようなホスト・プログラミング言語を使用して操作できます。OCCIは、C++言語との使用に適したオブジェクト指向インタフェースです。これらのAPIは、標準的なデータベース・アクセス関数および検索関数のライブラリを、実行時にアプリケーション内にリンクされる動的ランタイム・ライブラリ(OCILIB)の形式で提供します。これによって、SQLまたはPL/SQLを3GLプログラムに埋め込む必要がなくなります。
関連項目: OCIおよびOCCIコールの詳細は、次を参照してください。
|
内容は次のとおりです。
OCIおよびOCCIは、Oracle Databaseに対する他のアクセス方法に比べて、次のような優れたメリットがあります。
アプリケーション設計のすべての面に対する細かな制御
プログラムに対する高度な実行制御
使い慣れた3GLプログラム手法およびアプリケーション開発ツール(ブラウザやデバッガなど)の使用
動的SQL、メソッド4のサポート
様々なプラットフォームにおいて、すべてのOracle Databaseのプログラム・インタフェースが使用可能
コールバックを使用した動的バインドおよび定義
サーバー・メタデータ層を表す記述機能
登録されたクライアント・アプリケーションに対する非同期のイベント通知
配列のデータ操作言語(DML)の機能拡張
コミット要求を実行に対応付けてラウンドトリップを減らす機能
透過的プリフェッチ・バッファを使用して問合せを最適化し、ラウンドトリップを減らす機能
OCIおよびOCCIハンドルに対する相互排他(mutex)ロックの実装が不要になるスレッド・セーフティ
非ブロック化モードでのサーバー接続コールが実行中か、または完了できない場合、制御がOCIコードまたはOCCIコードに戻る機能
関数の種類 | 目的 |
---|---|
リレーショナル | データベース・アクセスを管理し、SQL文を処理します。 |
ナビゲーション | データベースから取得したオブジェクトを操作します。 |
データベースのマッピングおよび操作 | Oracle Databaseデータ型のデータ属性を操作します。 |
外部サブプログラム | PL/SQLからCコールバックを作成します。 |
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にあるオブジェクトにアクセスし、操作する機能も提供しています。
図1-1に示すとおり、OCIまたはOCCIプログラムは非データベース・アプリケーションと同じ方法でコンパイルおよびリンクします。特別な事前処理またはプリコンパイルは必要ありません。
注意: OCIプログラムおよびOCCIプログラムを正しくリンクするには、プラットフォームによってはOCIライブラリおよびOCCIライブラリ以外のライブラリを含める必要があります。必要な追加ライブラリの詳細は、プラットフォーム固有のOracleマニュアルを参照してください。 |
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 で提供されます。 |
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)は、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は、次のソフトウェア・レイヤーで構成されています。
OO4Oインプロセス・オートメーション・サーバー
Oracle Data Control
Oracle Objects for OLE C++クラス・ライブラリ
図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)のサポート。
図1-3に、Oracle Objects for OLEオブジェクト・モデルを示します。
内容は次のとおりです。
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は、Oracle Databaseへの物理的なネットワーク接続を表します。
OraServer
インタフェースは、Oracle Call Interfaceで提供される接続多重化機能を公開して使用可能にするために導入されています。OraServer
オブジェクトの作成後、OpenDatabase
メソッドをコールすることでこのオブジェクトに複数のユーザー・セッション(OraDatabase
)を連結できます。この機能は、IISなどのように、N層分散環境でOracle Objects for OLEを使用するアプリケーション・コンポーネント用として特に便利です。
多数のアクティブ・ユーザー・セッションを持ったOracle Databaseにアクセスする際に接続多重化機能を使用することによって、サーバーの処理要件およびリソース要件が削減され、サーバーのスケーラビリティも向上します。
OraServerを使用すると、複数のOraDatabaseオブジェクト(多重化)間で単一接続を共有できる一方で、OraSessionから取得された各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
オブジェクトによって、SQLのSELECT
文で作成されたデータを参照および更新できます。
OraDynaset
オブジェクトは1つのカーソルと考えることができますが、実際にOraDynaset
のセマンティクスを実装するには実カーソルをいくつか使用する場合があります。OraDynaset
オブジェクトは、サーバーからフェッチされたデータのローカル・キャッシュを自動的に保持し、ブラウズ・データ内のスクロール可能カーソルを透過的に実装します。大規模な問合せの場合は、かなりのローカル・ディスク領域が必要になる場合があります。アプリケーションを開発する場合は、ディスクの使用が少なくなるように、問合せをさらに微調整することをお薦めします。
OraField
オブジェクトは、ダイナセットの行内の単一の列またはデータ項目を表します。
現在行が更新中の場合は、OraField
オブジェクトは現在更新中の値を表します。ただし、この値はまだデータベースにコミットされていない可能性があります。
フィールドのValue
プロパティへの割当ては、(Edit
を使用して)レコードを編集中の場合、または(AddNew
を使用して)新しいレコードを追加中の場合のみ許可されます。他の方法でフィールドのValue
プロパティにデータを割り当てると、エラーが発生します。
OraMetaData
オブジェクトは、データベース内の特定のスキーマ・オブジェクトに関する記述情報を表すOraMDAttribute
オブジェクトのコレクションです。
OraMetaData
オブジェクトは、次の3つの列を持つ表として表すことができます。
メタデータの属性名
メタデータの属性値
Value
が別のOraMetaData
オブジェクトかどうかを示すFlag
OraMetaData
オブジェクトに含まれているOraMDAttribute
オブジェクトは、序数を使用した添字またはプロパティの名前を使用してアクセスできます。コレクションにない添字を参照すると、NULL
のOraMDAttribute
オブジェクトが戻されます。
OraParameter
オブジェクトは、SQL文またはPL/SQLブロック内のバインド変数を表します。
OraParameter
オブジェクトは、OraDatabase
オブジェクトのOraParameters
コレクションを介して間接的に作成、アクセスおよび削除されます。各パラメータには、それぞれ識別名および関連値があります。SQL文またはPL/SQL文の中でパラメータ名をプレースホルダとして使用すると、(オブジェクトの記述に示されているとおり)他のオブジェクトのSQL文およびPL/SQL文にパラメータを自動的にバインドできます。このようにパラメータを使用することで、動的な問合せを容易にし、プログラムのパフォーマンスを向上させます。
OraParamArray
オブジェクトは、OraParameter
オブジェクトによって表されるスカラー型バインド変数に対して、SQL文またはPL/SQLブロック内の配列型バインド変数を表します。
OraParamArray
オブジェクトは、OraDatabase
オブジェクトのOraParameters
コレクションを介して間接的に作成、アクセスおよび削除されます。各OraParamArray
オブジェクトには、それぞれ識別名および関連値があります。
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
オブジェクトは、OraDatabase
インタフェースのCreateAQ
メソッドを起動してインスタンス化します。このオブジェクトは、データベース内にあるキューを表します。
Oracle Objects for OLEは、Oracle Advanced Queuing(AQ)機能にアクセスするインタフェースを提供します。これによって、Visual Basicなどの一般的なCOMベースの開発環境からAQ機能にアクセスできます。Oracle Advanced Queuingの詳細は、『Oracle Streamsアドバンスト・キューイング・ユーザーズ・ガイド』を参照してください。
OraAQMsg
オブジェクトは、キューまたはデキューされるメッセージをカプセル化します。メッセージは、ユーザー定義型またはRAW型です。
Oracle Advanced Queuingの詳細は、『Oracle Streamsアドバンスト・キューイング・ユーザーズ・ガイド』を参照してください。
OraAQAgent
オブジェクトはメッセージの受信者を表し、複数コンシューマに対応したキューに対してのみ有効です。これは、OraAQMsg
の子です。
OraAQAgent
オブジェクトは、AQAgent
メソッドをコールしてインスタンス化することもできます。次に例を示します。
Set agent = qMsg.AQAgent(name)
OraAQAgent
オブジェクトは、AddRecipient
メソッドをコールしてインスタンス化することもできます。次に例を示します。
Set agent = qMsg.AddRecipient(name, address, protocol).
Oracle Objects for OLE(OO4O)は、Oracle Databaseでのオブジェクト・データ型およびLOBのインスタンスの、アクセスおよび操作を完全にサポートします。図1-4に、OO4Oがサポートするデータ型を示します。
このようなデータ型のインスタンスは、データベースからフェッチするか、あるいは入力変数または出力変数として、ストアド・サブプログラムを含むSQL文およびPL/SQLブロックに渡すことができます。すべてのインスタンスは、属性の動的アクセスおよび操作用のメソッドを提供するCOMオートメーション・インタフェースにマップされます。
内容は次のとおりです。
Oracle Objects for OLEのOraBlob
インタフェースおよびOraClob
インタフェースは、データ型BLOB
、CLOB
、およびNCLOB
のラージ・データベース・オブジェクトに対して操作を実行するメソッドを提供します。ここでは、BLOB
、CLOB
およびNCLOB
データ型をLOBデータ型といいます。
LOBデータは、Read
メソッドおよびCopyToFile
メソッドを使用してアクセスします。
LOBデータは、Write
、Append
、Erase
、Trim
、Copy
、CopyFromFile
およびCopyFromBfile
メソッドを使用して変更します。行の中のLOB列の内容を変更する前に、行のロックを取得する必要があります。LOB列がOraDynaset
オブジェクトのフィールドの場合は、ロックはEdit
メソッドをコールして取得します。
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(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アドバンスト・キューイング・ユーザーズ・ガイド』
新しい開発プロジェクト用のプログラミング環境を選択します。
各環境については、前述の概要およびマニュアルを参照してください。
プラットフォーム固有のマニュアルを参照してください。各プラットフォームでどのコンパイラの使用が承認されているかが説明されています。
特定の言語で必要な機能が提供されない場合、この章で記述したどの言語で作成されたコードからもPL/SQLおよびJavaのストアド・サブプログラムを起動できることを認識しておいてください。ストアド・サブプログラムには、トリガーおよびオブジェクト型メソッドが含まれます。
C言語で作成された外部サブプログラムは、OCI、Java、PL/SQLまたはSQLから起動できます。外部サブプログラム自体は、SQL、OCIまたはPro*C(C++ではなく)のいずれかを使用してデータベースにコールバックできます。
簡単な選択基準の例を次に示します。
Pro*COBOLは、オブジェクト型またはコレクション型をサポートしませんが、Pro*C/C++ではサポートされています。
SQLJが動的SQLをサポートする方法は、JDBCとは異なります。
内容は次のとおりです。
通常、プリコンパイラ・アプリケーションには同等のOCIアプリケーションより少ないコードが含まれているため、生産性が向上します。
データベースを詳細に制御する必要がある場合は、OCIアプリケーション(純OCIアプリケーションまたはOCIコールが埋め込まれたプリコンパイラ・アプリケーション)の方が適しています。
OCIでは、セッションの多重化および移行をより詳細に制御できます。
OCIでは、リストを含む任意の構造体に使用できるコールバックを使用して、動的バインドおよび定義が提供されます。
OCIにはメタデータを扱う多くのコールがあります。
OCIでは、クライアント・アプリケーションに対して非同期のイベントを通知できます。クライアントに対し、他のクライアントに伝播するための通知を生成する手段が提供されます。
OCIでは、任意のエラー・メッセージを戻す前に、DML文は配列を使用してできるだけ多くの反復を完了します。
特殊な目的のためのOCIコールには、アドバンスト・キューイング、グローバリゼーション・サポート、データ・カートリッジおよび日時データ型のサポートが含まれます。
OCIコールは、Pro*C/C++アプリケーションに埋め込むことができます。
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での操作 |
---|---|
|
SQLJまたはJDBCでパッケージをコールします。 |
|
JDBCを使用します。 |
|
Javaストアド・サブプログラムを持つジョブをスケジューリングします。 |
|
SQLJまたはJDBCでコールします。 |
|
JavaMailを使用します。 |
|
サブクラス |
|
SQLJまたはJDBCでコールします。 |
|
JDBCを使用して |
|
SQLJまたはJDBCでコールします。 |
|
JDBCを使用します。 |
|
JDBCを使用して |
|
SQLJまたはJDBCでコールします。 |
|
|
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ベース開発ツールが存在します。