ヘッダーをスキップ
Oracle® Databaseアドバンスト・アプリケーション開発者ガイド
11gリリース2 (11.2)
B56259-09
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

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

開発プロジェクト用のプログラミング環境を選択するときは、次のドキュメントを読むことをお薦めします。

次のようにプログラミング環境の選択が明白な場合もあります。

必要な機能をすべて備えたプログラミング言語がない場合は、次の理由により、複数のプログラミング言語を使用することができます。

複数言語プログラミングの詳細は、第14章「複数のプログラミング言語を使用したアプリケーションの開発」を参照してください。

内容は次のとおりです。

アプリケーション・アーキテクチャの概要

ここで、アプリケーション・アーキテクチャは、データベース・アプリケーションがOracle Databaseに接続するコンピューティング環境を意味します。

内容は次のとおりです。


参照:

アプリケーション・アーキテクチャの詳細は、『Oracle Database概要』を参照してください。

クライアント/サーバー・アーキテクチャ

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


参照:

クライアント/サーバー・アーキテクチャの詳細は、『Oracle Database概要』を参照してください。

サーバー側のプログラミング

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


参照:

サーバー側のプログラミングの詳細は、『Oracle Database概要』を参照してください。

2層アーキテクチャと3層アーキテクチャ

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


参照:

複数層アーキテクチャの詳細は、『Oracle Database概要』を参照してください。

プログラム・インタフェースの概要

プログラム・インタフェースは、データベース・アプリケーションとOracle Databaseの間のソフトウェア・レイヤーです。プログラム・インタフェースの機能は次のとおりです。

  • クライアント・ユーザー・プロセスによるSGAへの破壊的アクセスを防ぐ、セキュリティのための障壁になります。

  • 通信メカニズムとして働きます。つまり、情報リクエストの形式を設定し、データを渡し、エラーをトラップして返します。

  • 特に、異機種コンピュータ間で、または外部ユーザー・プログラムのデータ型に対して、データを変換します。

Oracleコードはサーバーとして働き、アプリケーション(クライアント)のために、データ・ブロックからの行のフェッチなどデータベース・タスクを実行します。プログラム・インタフェースは、Oracle Databaseソフトウェアおよびオペレーティング・システム固有のソフトウェアの両方によって提供される複数の部分で構成されます。


参照:

プログラム・インタフェースの詳細は、『Oracle Database概要』を参照してください。

内容は次のとおりです。

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

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

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

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

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

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

PL/SQLの概要

SQLの手続き型拡張言語であるOracleのPL/SQLは、完全な移植性を備えた高パフォーマンスのトランザクション処理言語です。PL/SQLでは、SQL文によるデータ操作、条件選択やループによるプログラム・フローの制御、定数や変数の宣言、サブプログラムの定義、型、サブタイプ、およびADTの定義とこれらの型を持つ変数の宣言、ランタイム・エラーのトラップが可能です。

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

PL/SQLを使用すると、Webクライアントで起動できるストアド・プロシージャを開発することができます。


参照:

  • PL/SQLの利点、主要な機能およびアーキテクチャの詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください。

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


Oracle Database Javaサポートの概要

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

内容は次のとおりです。


参照:

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

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

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


Oracle JVMの概要

Oracle Databaseとともに提供されるOracle JVM(Java仮想マシン)はJ2SEバージョン1.5.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)を介して、保護および制御されます。


参照:

Oracle JVMのその他の概要は、『Oracle Database概要』を参照してください。

Oracle JDBCの概要

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

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

  • Oracleデータ型のサポート

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

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

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

  • DatabaseMetaDataコールの制御

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

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

  • JDK 1.5のサポート。

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

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

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


注意:

JDBCコードとSQLJコードは相互運用が可能です。詳細は、「Oracle JDBCとOracle SQLJの比較」を参照してください。

内容は次のとおりです。


参照:

Oracle DatabaseでのJavaサポートのその他の概要は、『Oracle Database概要』を参照してください。

Oracle JDBCドライバ

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

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

JDBCはSQL規格のPart 3「Call-Level Interface」に基づいています。

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

Oracleによって実装されたドライバには、Sun Microsystemsが定義したJDBC標準機能に対する拡張が含まれています。

内容は次のとおりです。


参照:

  • JDBCドライバのその他の概要は、『Oracle Database概要』を参照してください。

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


JDBC Thinドライバ

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

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

JDBC OCIドライバ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

class JdbcTest { 
  public static void main (String args []) throws SQLException { 
    // Load Oracle driver
    DriverManager.registerDriver (new oracle.jdbc.OracleDriver());
     
    // Connect to the local database
    Connection conn = 
      DriverManager.getConnection ("jdbc:oracle:thin:@myhost:1521:orcl", 
                                   "hr", "password");

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

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

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

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

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

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

Oracle SQLJの概要


注意:

このドキュメントでは、SQLJはOracle SQLJおよびその拡張機能を意味します。

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

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

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

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

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

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

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

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

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

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

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

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

参照:

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

内容は次のとおりです。


参照:

SQLJのその他の概要は、『Oracle Database概要』を参照してください。

SQLJのメリット

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Oracle JDBCとOracle SQLJの比較

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

JDBCとSQLJには、次のような相違点があります。

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

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

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

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

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

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

  • SQLJは、SQLストアド・サブプログラムのコールに関して簡潔な規則を提供します。

    たとえば、次の連続する4つの例は、JDBCエスケープ構文、またはOracle JDBC構文を使用したストアド・プロシージャまたはストアド・ファンクションをコールする方法を示しています。

    prepStmt.prepareCall("{call fun(?,?)}");       //stored proc. JDBC esc.
    prepStmt.prepareCall("{? = call fun(?,?)}");   //stored func. JDBC esc.
    prepStmt.prepareCall("begin fun(:1,:2);end;"); //stored proc. 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 ADTおよびコレクション型にマップできます。

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

Oracle JPublisherの概要

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

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

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


参照:

  • Oracle JPublisherのその他の概要は、『Oracle Database概要』を参照してください。

  • Oracle JPublisherの詳細は、『Oracle Database JPublisherユーザーズ・ガイド』を参照してください。


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

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

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

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


参照:

  • Javaストアド・サブプログラムのその他の概要は、『Oracle Database概要』を参照してください。

  • Javaストアド・サブプログラムの詳細は、『Oracle Database Java開発者ガイド』を参照してください。


Oracle Database Webサービスの概要

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

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

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

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

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

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

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

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

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

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

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

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

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

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


参照:

Webサービス・プロバイダとしてのOracle Databaseのその他の概要は、『Oracle Database概要』を参照してください。

PL/SQLまたはJavaの選択

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

表13-1に、PL/SQLパッケージ、およびそれぞれの相当するJavaでの操作を示します。

表13-1 PL/SQLパッケージおよび相当するJavaでの操作

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

DBMS_ALERT

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

DBMS_DDL

JDBCを使用します。

DBMS_JOB

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

DBMS_LOCK

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

DBMS_MAIL

JavaMailを使用します。

DBMS_OUTPUT

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

DBMS_PIPE

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

DBMS_SESSION

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

DBMS_SNAPSHOT

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

DBMS_SQL

JDBCを使用します。

DBMS_TRANSACTION

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

DBMS_UTILITY

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

UTL_FILE

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


内容は次のとおりです。

PL/SQLとJavaの類似性

PL/SQLおよびJavaにはどちらもパッケージおよびライブラリがあります。

PL/SQLおよびJavaにはどちらも次のオブジェクト指向機能があります。

  • どちらにも継承があります。

  • PL/SQLには、型進化(型のメソッドおよび属性を、その型を使用するサブタイプおよび表データを保持しながら変更する機能)があります。

  • Javaには、分散システムを開発するためのポリモフィズムおよびコンポーネント・モデルがあります。

Javaに対するPL/SQLの利点

SQLの拡張機能であるPL/SQLでは、すべてのSQLデータ型、データ・カプセル化、情報隠蔽、オーバーロードおよび例外処理がサポートされます。このため次の利点があります。

  • SQLデータ型は、JavaよりもPL/SQLで簡単に使用できます。

  • SQL操作はJavaよりもPL/SQLで速く処理されます(特に大量のデータが扱われる場合、多くのデータベース・アクセスが行われる場合、またはバルク操作が使用される場合)。

    Oracle9iでは、一部の高度なPL/SQL機能がJavaで使用できない場合があります(たとえば、自律型トランザクションやリモート・データベース用のdblink機能などです)。

PL/SQLでのコード開発は、通常、Javaを使用した場合より速く行うことができます。

PL/SQLに対するJavaの利点

Javaはオープン分散アプリケーション用に使用され、多くのJavaベース開発ツールが存在しています。JavaにはPL/SQLよりも豊富な型体系があります。JavaはCORBA(クライアントに様々なコンピュータ言語を持つことができます)およびEnterprise JavaBeansを使用できます。PL/SQLパッケージはCORBAまたはEnterprise JavaBeansクライアントから起動できます。Javaによって、XMLツール、Internet File SystemまたはJavaMailを実行できます。

プリコンパイラの概要

クライアント/サーバー・プログラムは、通常、プリコンパイラを使用して作成されます。プリコンパイラは、C、C++、COBOLなどの言語で作成された高レベル・プログラムにSQL文を埋め込むためのプログラミング・ツールです。クライアント・アプリケーションは、SQL文をホストするためホスト・プログラムと呼ばれ、その作成に使用される言語はホスト言語と呼ばれます。

プリコンパイラはホスト・プログラムを入力として受け取り、埋込みSQL文を標準データベース・ランタイム・ライブラリ・コールに変換し、ソース・プログラムを生成します。ユーザーは、通常の方法でソース・プログラムをコンパイルおよびリンクして、実行できます。

内容は次のとおりです。


参照:

Oracleプリコンパイラのその他の概要は、『Oracle Database概要』を参照してください。

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

Pro*C/C++プリコンパイラの場合、ホスト言語はCまたはC++です。Pro*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)で、データベース内のADTおよび名前付きコレクション型を、ソースに含める構造体およびヘッダーにマップします。

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

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

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

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

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

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


参照:

Pro*C/C++プリコンパイラの詳細は、Pro*C/C++プリコンパイラのプログラマーズ・ガイドを参照してください。

例13-1に、スキーマhr内のemployees表を問い合せるCソース・プログラムのコードの一部を示します。

例13-1 Pro*C/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*COBOLプリコンパイラの概要

Pro*COBOLプリコンパイラの場合、ホスト言語はCOBOLです。Pro*COBOLプリコンパイラの機能の一部は次のとおりです。

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

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

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

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

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

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

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


    参照:

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

例13-2に、スキーマhr内のemployees表を問い合せるCOBOLソース・プログラムのコードの一部を示します。

例13-2 Pro*COBOLアプリケーション

...
 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アプリケーションのテストを開始できます。

OCIおよびOCCIの概要

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コールの詳細は、次を参照してください。
  • 『Oracle Call Interfaceプログラマーズ・ガイド』

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

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

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

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


内容は次のとおりです。

OCIおよびOCCIのメリット

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

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

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

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

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

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

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

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

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

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

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

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

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

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

OCIおよびOCCI関数

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

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

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

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

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

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

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

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

SELECT name FROM employees WHERE empno = :empnumber

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

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

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

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

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

図13-1の説明が続きます。
「図13-1 OCIまたはOCCIの開発過程」の説明


注意:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


参照:

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

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

using System; 
using Oracle.DataAccess.Client; 

class Example 
{ 
  OracleConnection con; 

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

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

注意:

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

OraOLEDBの概要

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


参照:

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

Oracle Objects for OLE(OO4O)の概要

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

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

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

  • OO4Oインプロセス・オートメーション・サーバー

  • Oracle Data Control

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

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

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

図13-2の説明は次にあります
「図13-2 ソフトウェア・レイヤー」の説明

内容は次のとおりです。

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

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

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

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

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

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

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

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

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

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

  • AQの完全サポート。

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

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

OO4Oオブジェクト・モデル

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

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

図13-3の説明が続きます
「図13-3 オブジェクトおよびそのリレーション」の説明

内容は次のとおりです。

OraSession

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

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

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

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

OraServer

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

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

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

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

OraDatabase

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

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

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

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

  • BeginTrans

  • CommitTrans

  • RollbackTrans

次に例を示します。

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

OraDynaset

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

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

OraField

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

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

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

OraMetaDataおよびOraMDAttribute

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

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

  • メタデータの属性名

  • メタデータの属性値

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

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

OraParameterおよびOraParameters

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

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

OraParamArray

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

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

OraSQLStmt

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

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

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

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

OraAQ

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

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

OraAQMsg

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

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

OraAQAgent

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

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

Set agent = qMsg.AQAgent(name)

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

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

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

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

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

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

図13-4の説明が続きます
「図13-4 サポートされているOracle Databaseデータ型」の説明

内容は次のとおりです。

OraBLOBおよびOraCLOB

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

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

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

OraBFILE

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

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

Oracle Data Control

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

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

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

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

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


参照:

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

    Oracle Objects for OLEヘルプ

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

  • Oracle Objects for OLEの使用例は、次のドキュメントを参照してください。

    Oracle DatabaseインストールのORACLE_HOME\OO4Oディレクトリ内のサンプル

    Oracle Database SecureFiles and Large Objects開発者ガイド

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