20 プログラミング環境の選択
開発プロジェクト用のプログラミング環境を選択するときは、次のドキュメントを読むことをお薦めします。
-
この章の各項、およびそれらの項で参照しているドキュメント。
-
プラットフォームでサポートされるコンパイラや開発ツールを示すプラットフォーム固有のドキュメント。
次のようにプログラミング環境の選択が明白な場合もあります。
-
Pro*COBOLでは、ADTやコレクション型がサポートされませんが、Pro*C/C++ではサポートされています。
必要な機能をすべて備えたプログラミング言語がない場合は、次の理由により、複数のプログラミング言語を使用することができます。
-
この章のすべてのプログラミング言語は、PL/SQLおよびJavaのストアド・サブプログラムを起動できます。(ストアド・サブプログラムには、トリガーおよびADTメソッドが含まれます。)
-
PL/SQL、Java、SQLおよびOracle Call Interface(OCI)は、外部のCサブプログラムを起動できます。
-
外部Cサブプログラムは、SQL、OCIまたはPro*C(C++ではなく)を使用してOracle Databaseにアクセスできます。
トピック:
関連項目:
複数言語プログラミングの詳細は、「複数のプログラミング言語を使用したアプリケーションの開発」を参照してください。
20.1 アプリケーション・アーキテクチャの概要
ここで、アプリケーション・アーキテクチャは、データベース・アプリケーションがOracle Databaseに接続するコンピューティング環境を意味します。
トピック:
関連項目:
アプリケーション・アーキテクチャの詳細は、『Oracle Database概要』を参照してください。
20.1.1 クライアント/サーバー・アーキテクチャ
従来のクライアント/サーバー・プログラムでは、アプリケーションのコードはデータベース・サーバー以外のシステムである、クライアント・システム上で実行されます。データベース・コールは、クライアント・システムからデータベース・サーバーに送信されます。挿入および更新操作時には、データがクライアントからサーバーに送信され、問合せ操作時には、データがサーバーからクライアントに戻されます。データは、クライアント・システム上で処理されます。クライアント/サーバー・プログラムは、通常、プリコンパイラを使用して作成されますが、SQL文はC、C++、COBOLなどの別の言語のコードに埋め込まれています。
関連項目:
クライアント/サーバー・アーキテクチャの詳細は、『Oracle Database概要』を参照してください。
20.1.2 サーバー側のプログラミング
データベースで変更が発生した場合に自動的に実行されるトリガー、または明示的に起動されるストアド・サブプログラムを使用して、完全にデータベース内に常駐するアプリケーション・ロジックを開発できます。アプリケーションから作業をオフロードすると、検証およびクリーン・アップの実行に使用されるコードを再利用できたり、様々なクライアントからのデータベース処理を制御できます。たとえば、Webサーバーを介したストアド・サブプログラムの起動を可能にすることで、クライアント/サーバー・アプリケーションと同じ機能を実行するWebベースのユーザー・インタフェースを構成できます。
関連項目:
サーバー側のプログラミングの詳細は、『Oracle Database概要』を参照してください。
20.1.3 2層アーキテクチャと3層アーキテクチャ
クライアント/サーバー・コンピューティングは、2層モデルと呼ばれることがあります。このモデルでは、アプリケーションはデータベース・サーバーと直接通信します。3層モデルでは、別個のアプリケーション・サーバーが要求を処理します。アプリケーション・サーバーには、基本的なWebサーバーや、キャッシュやロード・バランスなどの拡張機能を実行するサーバーがあります。この中間層の処理能力を向上させると、クライアント・システムに必要なリソースを少なくできるため、Thinクライアント構成になり、この構成では、クライアント・システムが必要とするのはWebブラウザか、またはTCP/IPやHTTPプロトコルを介して要求を送信する他の手段のみです。
関連項目:
複数層アーキテクチャの詳細は、『Oracle Database概要』を参照してください。
20.2 プログラム・インタフェースの概要
プログラム・インタフェースは、データベース・アプリケーションとOracle Databaseの間のソフトウェア・レイヤーです。プログラム・インタフェースの機能は次のとおりです。
-
クライアント・ユーザー・プロセスによるSGAへの破壊的アクセスを防ぐ、セキュリティのための障壁になります。
-
通信メカニズムとして機能し、情報リクエストの書式設定、データの受渡し、エラーのトラップと通知を行います。
-
特に、異機種コンピュータ間で、または外部ユーザー・プログラムのデータ型に対して、データを変換します。
Oracleコードはサーバーとして働き、アプリケーション(クライアント)のために、データ・ブロックからの行のフェッチなどデータベース・タスクを実行します。プログラム・インタフェースは、Oracle Databaseソフトウェアとオペレーティング・システム固有のソフトウェアの両方によって提供される、複数の部分から構成されています。
関連項目:
プログラム・インタフェースの詳細は、『Oracle Database概要』を参照してください。
トピック:
20.2.1 ユーザー・インタフェース
ユーザー・インタフェースとは、アプリケーションがエンドユーザーに対して表示するものです。これはそのアプリケーションの背後にあるテクノロジおよびユーザー自身のニーズによって異なります。経験豊富なユーザーの場合は、データベースに渡すSQL文を入力できます。初心者ユーザーの場合は、クライアント・システム(Windows、X-Windowなど)のグラフィック・ライブラリを使用したグラフィカル・ユーザー・インタフェースを表示できます。また、従来のユーザー・インタフェースは、HTMLおよびJavaを使用してWebブラウザで提供することもできます。
20.2.2 ステートフル・ユーザー・インタフェースとステートレス・ユーザー・インタフェース
従来のクライアント/サーバー・アプリケーションでは、アプリケーションはユーザーのアクションを記録し、この情報を1つ以上のセッションで使用できます。たとえば、前に選択した項目を再入力する必要がないように、その項目をメニュー内に表示できます。アプリケーションがこの方法で情報を保存できる場合、そのアプリケーションはステートフルであるといいます。
WebアプリケーションまたはThinクライアント・アプリケーションは、ステートレスであると開発が容易です。ステートレス・アプリケーションは、必要なすべての情報を収集し、データベースを使用してその情報を処理し、ユーザーが変わるとそれらの操作を再実行します。これは、顧客登録などの単一画面要求を処理する一般的な方法です。
デフォルトでステートレスであるWebアプリケーションにステートフルのアクションを追加する方法は、数多くあります。たとえば、Webページ上のエントリ・フォームから次のWebページに情報が渡されるように、複数の異なるステップを通してユーザーの選択内容を記憶するウィザードのようなインタフェースを構成できます。Cookieを使用してクライアント・システムに関する少量の情報項目を格納でき、ユーザーがWebサイトに再度アクセスしたときはそれらの項目を取得できます。また、サーブレットを使用して、データベース・セッションを開いたままにし、同じクライアントからの要求間で、変数の格納もできます。
20.3 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言語リファレンス』を参照してください。
20.4 Oracle Database Javaサポートの概要
この項では、JavaアプリケーションをサポートするOracle Databaseの機能の概要を説明します。データベースには、java
.lang
、java
.io
などのコアJDKライブラリが含まれています。データベースでは、JDBCおよびSQLJなどのクライアント側Java標準がサポートされています。また、データベース内でデータ処理集中型のJavaコードを実行可能な、サーバー側のJDBCドライバが提供されています。
トピック:
20.4.1 Oracle JVMの概要
Oracle Databaseとともに提供されるJava仮想マシンであるOracle JVMは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 Database 12cリリース1 (12.1.0.1)から、Oracle JVMでは、最新のJava Standard Editionを完全にサポートしています。最新のJava標準との互換性により、アプリケーションのポータビリティが向上し、クライアント側Javaクラスをデータベースで直接実行できるようになりました。
関連項目:
-
Oracle JVMのその他の概要は、『Oracle Database概要』を参照してください。
-
最新のJava Standard Editionのサポートの詳細は、『Oracle Database Java開発者ガイド』を参照してください
20.4.2 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のサポート。
-
ローカル・トランザクションとグローバル・トランザクション間の切替え。
-
トランザクションのセーブポイント。
-
接続プールによるプリペアド文の再利用
ノート:
JDBCコードとSQLJコードは相互運用が可能です。
トピック:
関連項目:
-
Oracle DatabaseでのJavaサポートのその他の概要は、『Oracle Database概要』を参照してください。
20.4.2.1 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社が定義したJDBC標準機能に対する拡張が含まれています。
トピック:
関連項目:
-
JDBCドライバのその他の概要は、『Oracle Database概要』を参照してください。
-
JDBCの詳細は、『Oracle Database JDBC開発者ガイドおよびリファレンス』を参照してください。
20.4.2.1.1 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ソケットをオープンするため、ソケットをサポートするブラウザでのみ実行できます。
20.4.2.1.2 JDBC OCIドライバ
JDBC OCIドライバはタイプ2のJDBCドライバです。Cで作成されているOCIをコールして、Oracle Databaseと対話します。したがって、ネイティブ・メソッドおよびJavaメソッドの両方を使用します。
OCIドライバを使用すると、Thinドライバより多くの機能(透過的アプリケーション・フェイルオーバー、高度なセキュリティ、高度なLOB操作など)にアクセスできます。
OCIドライバは、異なるOracle Databaseバージョン間の互換性を提供します。また、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コンポーネントでは使用できます。Oracle Application Serverは、アプリケーションおよびブラウザ間のアクセスをサポートするミドルウェア・サービスおよびツール製品を提供します。
20.4.2.1.3 サーバー側JDBC内部ドライバ
サーバー側JDBC内部ドライバは、タイプ2のドライバで、データベース・サーバー内で実行されます。このため、大量データへのアクセスに必要なラウンド・トリップの数が削減されます。このドライバと、JavaサーバーVM、データベース、実行速度を最大で10倍に上げるJavaネイティブ・コンパイラ、およびSQLエンジンは、すべて同じアドレス空間内で実行されます。
このドライバは、データベースで使用されるすべてのJavaプログラムのサーバー側サポートを提供します。PL/SQLストアド・サブプログラムおよびトリガーをコールすることもできます。
サーバー側ドライバは、クライアント側ドライバと同じ機能および拡張機能を完全にサポートします。
20.4.2.2 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();
20.4.2.3 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()
の文字列の指定は異なります。
20.4.3 Oracle SQLJの概要
ノート:
このマニュアルでは、SQLJはOracle SQLJおよびその拡張機能を意味します。
SQLJは、SQL文をJavaソース・コードに埋め込むためのANSI SQL-1999規格です。SQLJは、JDBCにかわり、Javaからのクライアント側SQLデータ・アクセスを、より簡単なものにします。
SQLJのソース・ファイルには、SQL文が埋め込まれたJavaソースが含まれています。Oracle SQLJは、動的SQLおよび静的SQLをサポートします。動的SQLのサポートは、SQLJ標準に対するOracleの拡張機能です。
Oracle SQLJトランスレータは、次の作業を行います。
-
SQLJソースを、SQLJランタイム・ドライバへのコールを持つJavaコードに変換します。SQLJトランスレータは、ソース・コードをPure Javaのソース・コードに変換し、データベース・スキーマに対して静的SQL文の構文およびセマンティクスを確認し、ホスト変数とSQLとで型に互換性があるかどうかを検証します。
-
Javaコンパイラを使用して生成済Javaコードをコンパイルします。
-
ターゲット・データベース用にプロファイルを作成します(オプション)。SQLJで、Oracle Database固有にカスタマイズされたプロファイル・ファイルが生成されます。
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);
トピック:
関連項目:
SQLJのその他の概要は、『Oracle Database概要』を参照してください。
20.4.3.1 SQLJのメリット
Javaに対するOracle SQLJ拡張機能を使用すると、埋込みSQLを介してデータベース操作を実行するアプリケーションを迅速に開発したり、簡単にメンテナンスできます。
特に、Oracle SQLJには次の特長があります。
-
静的SQLからデータベースにアクセスする簡潔でわかりやすいメカニズムを提供します。アプリケーション内のSQLは、ほとんどの場合静的です。SQLJは、JDBCよりさらに簡潔で、エラーが発生しにくい静的SQL構文を提供します。
-
変換時に構文およびセマンティクスの検証を行うSQLチェッカー・モジュールを提供します。
-
柔軟なデプロイメント構成を提供します。これにより、クライアント側または中間層でSQLJを実装できるようになります。
-
ソフトウェア標準をサポートします。SQLJはベンダー・グループの努力の集積であり、携わったすべてのベンダーは、今後、SQLJをサポートしていきます。アプリケーションで複数ベンダーのデータベースにアクセスできます。
-
ソース・コード・レベルの移植性を提供します。各ベンダーのDBMSコードがベンダー固有の機能に依存していない場合は、実行可能ファイルをすべてのベンダーのDBMSで使用できます。
-
クライアントおよびサーバーで統一されたプログラミング・スタイルを施行します。
-
SQLJトランスレータと、グラフィカルな統合開発環境であるOracle JDeveloperを統合します。この開発環境では、SQLJ変換、Javaコンパイル、プロファイルのカスタマイズ、ソース・コード・レベルのデバッグがすべて1つのステップで提供されます。
-
Oracle Databaseデータ型の拡張機能が含まれています。
20.4.4 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は相互運用が可能です。
-
PL/SQLとJavaのストアド・サブプログラムは完全に互換性があります。
20.4.5 Javaストアド・サブプログラムの概要
Javaストアド・サブプログラムを使用すると、中間層で実行するプログラムから独立した、データベース・サーバーで実行するプログラムを実装できます。この方法でアプリケーションを構造化すると複雑にならず、再利用率、セキュリティ、パフォーマンスおよびスケーラビリティが向上します。
たとえば、永続性のあるデータが必要な操作を実行するJavaストアド・サブプログラム、およびプレゼンテーションやビジネス・ロジック操作を実行する別のプログラムを作成できます。
Javaストアド・サブプログラムのSQLに対するインタフェースは、PL/SQLの実行モデルと類似した実行モデルを使用します。
関連項目:
-
Javaストアド・サブプログラムのその他の概要は、『Oracle Database概要』を参照してください。
-
Javaストアド・サブプログラムの詳細は、『Oracle Database Java開発者ガイド』を参照してください。
20.4.6 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の公開
20.5 PL/SQLまたはJavaの選択
PL/SQLおよびJavaは、サーバー内で相互運用します。JavaからPL/SQLパッケージを実行するか、またはJavaからPL/SQLを起動して、分散CORBAおよびEnterprise Java Beansクライアントからいずれかを起動できるようにできます。
表20-1に、PL/SQLパッケージ、およびそれぞれの相当するJavaでの操作を示します。
表20-1 PL/SQLパッケージおよび相当するJavaでの操作
PL/SQLパッケージ | 相当するJavaでの操作 |
---|---|
|
JDBCでパッケージをコールします。 |
|
JDBCを使用します。 |
|
Javaストアド・サブプログラムを持つジョブをスケジューリングします。 |
|
JDBCでコールします。 |
|
JavaMailを使用します。 |
|
サブクラス |
|
JDBCでコールします。 |
|
JDBCを使用して、 |
|
JDBCでコールします。 |
|
JDBCを使用します。 |
|
JDBCを使用して、 |
|
JDBCでコールします。 |
|
|
トピック:
20.5.1 PL/SQLとJavaの類似性
PL/SQLおよびJavaにはどちらもパッケージおよびライブラリがあります。
PL/SQLおよびJavaにはどちらも次のオブジェクト指向機能があります。
-
どちらにも継承があります。
-
PL/SQLには、型進化(型のメソッドおよび属性を、その型を使用するサブタイプおよび表データを保持しながら変更する機能)があります。
-
Javaには、分散システムを開発するためのポリモフィズムおよびコンポーネント・モデルがあります。
20.5.2 Javaに対するPL/SQLの利点
SQLの拡張機能であるPL/SQLでは、すべてのSQLデータ型、データ・カプセル化、情報隠蔽、オーバーロードおよび例外処理がサポートされます。したがって、次のようになります。
-
SQLデータ型は、JavaよりもPL/SQLで簡単に使用できます。
-
SQL操作はJavaよりもPL/SQLで速く処理されます(特に大量のデータが扱われる場合、多くのデータベース・アクセスが行われる場合、またはバルク操作が使用される場合)。
Oracle9iでは、一部の高度なPL/SQL機能がJavaで使用できない場合があります(たとえば、自律型トランザクションやリモート・データベース用のdblink機能などです)。
コード開発は通常、JavaよりPL/SQLのほうが高速ですが、これは実際には、使用する開発ツールまたは開発環境に大きく依存します。
データ・ロジックがSQLに集中している場合は、PL/SQLが優先されます。つまり、アプリケーションのデータ処理またはデータデータ検証の要件は高くなります。
また、開発に利用できる、Oracle提供パッケージおよびサード・パーティ・ライブラリによる大規模なユーザー・ベースもあります。
20.5.3 PL/SQLに対するJavaの利点
Javaはオープン分散アプリケーション用に使用され、多くのJavaベース開発ツールが存在しています。Javaには、PL/SQLでは利用できない固有のメカニズムがあります。たとえば、Javaにはセキュリティ・メカニズム、自動ガベージ・コレクタ、型安全性メカニズム、バイト・コード検証機能、およびJava 2セキュリティが組み込まれています。また、Javaでは、組込みの配列境界チェック、組込みのネットワーク・アクセス・クラス、および有用な多数の即時使用可能なクラスを含むAPIなど、高速の開発機能が組み込まれています。Javaには、データベースで再利用できる、多数のクラス・ライブラリ、ツール、およびサード・パーティ・クラス・ライブラリを備えています。JavaにはPL/SQLよりも豊富な型体系があります。JavaはCORBA(クライアントに様々なコンピュータ言語を持つことができます)およびEnterprise Java Beansを使用できます。PL/SQLパッケージはCORBAまたはEnterprise Java Beansクライアントから起動できます。Javaによって、XMLツール、Internet File SystemまたはJavaMailを実行できます。
アプリケーションがERPシステム、RMIサーバー、Java/J2EE、およびWebサービスと対話する必要がある場合、これらのいずれもPL/SQLでは実行できないため、Javaが推奨されます。Javaはまた、中間層でアプリケーション部分を開発する必要がある場合に推奨されます。これは、ビジネス・ロジックが複雑であるか、直接SQLアクセスをほとんど必要とせずに集中的に計算し、中間層ドリブン・プレゼンテーション・ロジックを実装しているため、アプリケーションで透過的なJava永続性を必要とするか、コンテナ管理のインフラストラクチャ・サービスを必要とするためです。このため、アプリケーションをデータベース層と中間層にパーティション化する必要がある場合、アプリケーション部分を必要に応じて中間層に移行し、Java/J2EEを使用します。
20.6 プリコンパイラの概要
クライアント/サーバー・プログラムは、通常、プリコンパイラを使用して作成されます。プリコンパイラは、C、C++、COBOLなどの言語で作成された高レベル・プログラムにSQL文を埋め込むためのプログラミング・ツールです。クライアント・アプリケーションは、SQL文をホストするためホスト・プログラムと呼ばれ、その作成に使用される言語はホスト言語と呼ばれます。
プリコンパイラはホスト・プログラムを入力として受け取り、埋込みSQL文を標準データベース・ランタイム・ライブラリ・コールに変換し、ソース・プログラムを生成します。ユーザーは、通常の方法でソース・プログラムをコンパイルおよびリンクして、実行できます。
トピック:
関連項目:
Oracleプリコンパイラのその他の概要は、『Oracle Database概要』を参照してください。
20.6.1 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
という3種類のコレクション型が一連のSQL文でサポートされています。これによって、データを高度に制御できます。 -
ラージ・オブジェクトは、別の一連のSQL文によってアクセスされます。
-
動的SQLのための新しいANSI SQL規格が新しいアプリケーション用にサポートされ、様々なホスト変数を使用してSQL文を実行できます。動的SQLのための従来の手法も、既存のアプリケーションで使用できます。
-
グローバリゼーション・サポートによって、マルチバイト・キャラクタおよびUCS2 Unicodeデータを使用できます。
-
スクロール可能カーソルを使用して、結果セット内を移動できます。たとえば、結果セットの最終行のフェッチ、または結果セット内の絶対位置または相対位置へのジャンプが可能です。
-
接続プールは、いくつかの名前付き接続で共有されているデータベースへの物理接続のグループです。接続プールのオプションを有効化すると、Pro*C/C++アプリケーションのパフォーマンスを最適化できます。接続プールのオプションは、デフォルトでは無効になっています。
関連項目:
Pro*C/C++プリコンパイラの完全な情報は、『Pro*C/C++プログラマーズ・ガイド』を参照してください。
例20-1に、スキーマhr
内のemployees
表を問い合せるCソース・プログラムのコードの一部を示します。
例20-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アプリケーションのテストを開始できます。
20.6.2 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プログラマーズ・ガイド』を参照してください。
例20-2に、スキーマhr
内のemployees
表を問い合せるCOBOLソース・プログラムのコードの一部を示します。
例20-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アプリケーションのテストを開始できます。
20.7 OCIおよびOCCIの概要
Oracle Call Interface(OCI)およびOracle C++ Call Interface(OCCI)は、APIです。これらによって、第三世代言語固有のサブプログラム起動を使用して、Oracle Databaseにアクセスしたり、SQL文実行のすべての過程を制御するアプリケーションを作成できます。これらのAPIは次のものを提供します。
-
システム・メモリーおよびネットワーク接続の効率的な使用によるパフォーマンスと拡張性の向上
-
2層クライアント/サーバーまたは複数層環境での動的セッションおよびトランザクション管理に適した一貫性のあるインタフェース
-
N層認証
-
Oracle Databaseオブジェクトを使用したアプリケーション開発の包括的サポート
-
外部データベースへの接続
-
増加するユーザー数および要求数に対応したサービスを、ハードウェアを追加しなくても提供できるアプリケーション開発
OCIを使用すると、データベース内のデータおよびスキーマをCのようなホスト・プログラミング言語を使用して操作できます。OCCIは、オブジェクト指向のインタフェースで、C++を使用する場合に適しています。これらのAPIは、標準的なデータベース・アクセス関数および検索関数のライブラリを、実行時にアプリケーション内にリンクされる動的ランタイム・ライブラリの形式で提供します。SQLまたはPL/SQLを3GLプログラムに埋め込む必要はありません。
関連項目:
OCIおよびOCCIコールの詳細は、次を参照してください。
トピック:
20.7.1 OCIおよびOCCIのメリット
OCIおよびOCCIは、Oracle Databaseに対する他のアクセス方法に比べて、次のような優れたメリットがあります。
-
アプリケーション設計のすべての面に対する細かな制御。
-
プログラムに対する高度な実行制御。
-
使い慣れた3GLプログラム手法およびアプリケーション開発ツール(ブラウザやデバッガなど)の使用。
-
動的SQL、メソッド4のサポート。
-
様々なプラットフォームにおいて、すべてのOracle Databaseのプログラム・インタフェースが使用可能。
-
コールバックを使用した動的バインドおよび定義。
-
サーバー・メタデータ層を表す記述機能。
-
登録されたクライアント・アプリケーションに対する非同期のイベント通知。
-
配列のデータ操作言語(DML)の機能拡張。
-
コミット・リクエストを文の実行と関連付けてラウンド・トリップを減らす機能。
-
透過的プリフェッチ・バッファを使用して問合せを最適化し、ラウンド・トリップを減らす機能。
-
OCIおよびOCCIハンドルに対する相互排他(mutex)ロックの実装が不要になるスレッド・セーフティ。
-
非ブロック化モードでのサーバー接続コールが実行中か、または完了できない場合、制御がOCIコードに戻る機能。
20.7.2 OCIおよびOCCI関数
OCIとOCCIの両方とも、次の種類の関数があります。
関数の種類 | 目的 |
---|---|
リレーショナル |
データベース・アクセスを管理し、SQL文を処理します。 |
ナビゲーション |
データベースから取得したオブジェクトを操作します。 |
データベースのマッピングおよび操作 |
Oracle Databaseデータ型のデータ属性を操作します。 |
外部サブプログラム |
PL/SQLからCコールバックを作成します(OCIのみ) |
20.7.3 OCIおよびOCCIアプリケーションの手続き型要素および非手続き型要素
OCIおよびOCCIを使用すると、SQLが提供する強力な非手続き型データ・アクセス機能と、CやC++など数多くのプログラミング言語で提供される手続き型機能を組み合せたアプリケーションを開発できます。手続き型言語および非手続き型言語には次のような特性があります。
-
非手続き型言語プログラムでは、操作対象のデータ群は指定されますが、実行される操作およびその操作の実行方法は指定されません。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にあるオブジェクトにアクセスし、操作する機能も提供しています。
20.7.4 OCIアプリケーションまたはOCCIアプリケーションの作成
図20-1に示すとおり、OCIまたはOCCIプログラムは非データベース・アプリケーションと同じ方法でコンパイルおよびリンクします。処理前のステップやプリコンパイル・ステップを別途行う必要はありません。
ノート:
OCIプログラムおよびOCCIプログラムを正しくリンクするには、プラットフォームによってはOCIライブラリおよびOCCIライブラリ以外のライブラリを含める必要があります。必要な追加ライブラリの詳細は、プラットフォーム固有のOracleマニュアルを参照してください。
20.8 プリコンパイラおよびOCIの比較
通常、プリコンパイラ・アプリケーションには同等のOCIアプリケーションより少ないコードが含まれているため、生産性が向上します。
データベースを詳細に制御する必要がある場合は、OCIアプリケーション(純OCIアプリケーションまたはOCIコールが埋め込まれたプリコンパイラ・アプリケーション)の方が適しています。
-
OCIでは、セッションの多重化および移行をより詳細に制御できます。
-
OCIでは、リストを含む任意の構造体に使用できるコールバックを使用して、動的バインドおよび定義が提供されます。
-
OCIにはメタデータを扱う多くのコールがあります。
-
OCIでは、クライアント・アプリケーションに対して非同期のイベントを通知できます。クライアントに対し、他のクライアントに伝播するための通知を生成する手段が提供されます。
-
OCIでは、任意のエラー・メッセージを戻す前に、DML文は配列を使用してできるだけ多くの反復を完了します。
-
特殊な目的のためのOCIコールには、アドバンスト・キューイング、グローバリゼーション・サポート、データ・カートリッジおよび日時データ型のサポートが含まれます。
-
OCIコールは、Pro*C/C++アプリケーションに埋め込むことができます。
20.9 Oracle Data Provider for .NET(ODP.NET)の概要
Oracle Data Provider for .NET(ODP.NET)は、Oracle Database用のデータ・プロバイダの実装です。
ODP.NETはOracle Database固有のAPIを使用して、.NETアプリケーションからデータベース機能およびデータへの高速かつ高信頼アクセスを提供します。また、Microsoft .NET Framework Class Libraryで入手可能なクラスおよびインタフェースを使用し、継承します。
Oracle Provider for OLE DBを使用するプログラマに対して、ADO(ActiveX Data Objects)では簡単なプログラミング・モデルを表すオートメーション・レイヤーを提供します。ADO.NETからも類似したプログラミング・モデルがパフォーマンスの向上のために提供されますが、オートメーション・レイヤーはありません。さらに重要な点として、ADO.NETモデルを使用することで、ODP.NETなどのネイティブ・プロバイダはOracle Database固有の特定の機能およびデータ型を公開できるようになります。
次に、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
で提供されます。