プライマリ・コンテンツに移動
Oracle® Database開発ガイド
12c リリース1 (12.1)
B71295-06
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次
索引へ移動
索引

前
 
次
 

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

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

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

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

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

内容は次のとおりです。

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

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

内容は次のとおりです。


参照:

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

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

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


参照:

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

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

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


参照:

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

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

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


参照:

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

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

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

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

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

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

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


参照:

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

内容は次のとおりです。

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

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

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

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

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

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

17.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言語リファレンス』を参照してください。


17.4 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ユーザーズ・ガイド』


17.4.1 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 Database 12cリリース1 (12.1.0.1)から、Oracle JVMでは、最新のJava Standard Editionを完全にサポートしています。最新のJava標準との互換性により、アプリケーションのポータビリティが向上し、クライアント側Javaクラスをデータベースで直接実行できるようになりました。


参照:

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

  • 最新のJava Standard Editionのサポートの詳細は、『Oracle Database Java開発者ガイド』を参照してください


17.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コードは相互運用が可能です。詳細は、17.4.4項を参照してください。

内容は次のとおりです。


参照:

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

17.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開発者ガイドおよびリファレンス』を参照してください。


17.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ソケットをオープンするため、ソケットをサポートするブラウザでのみ実行できます。

17.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は、アプリケーションおよびブラウザ間のアクセスをサポートするミドルウェア・サービスおよびツール製品を提供します。

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

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

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

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

17.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(); 

17.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()の文字列の指定は異なります。

17.4.3 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バージョン6以上であれば、どの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 SQLJ開発者ガイド』を参照してください

内容は次のとおりです。


参照:

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

17.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データ型の拡張機能が含まれています。

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

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

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

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

17.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は相互運用が可能です。

  • Oracle JPublisherはカスタムJavaクラスを生成します。このクラスは、SQLJまたはJDBCのアプリケーションでOracle Database ADTおよびコレクション型にマップできます。

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

17.4.5 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ユーザーズ・ガイド』を参照してください。


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

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

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

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


参照:

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

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


17.4.7 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概要』を参照してください。

17.5 PL/SQLまたはJavaの選択

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

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

表17-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エントリ・ポイントを使用します。


内容は次のとおりです。

17.5.1 PL/SQLとJavaの類似性

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

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

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

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

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

17.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提供パッケージおよびサード・パーティ・ライブラリによる大規模なユーザー・ベースもあります。

17.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を使用します。

17.6 プリコンパイラの概要

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

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

内容は次のとおりです。


参照:

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

17.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++プリコンパイラのプログラマーズ・ガイドを参照してください。

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

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

17.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プログラマーズ・ガイド』を参照してください。

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

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

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

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

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

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

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


内容は次のとおりです。

17.7.1 OCIおよびOCCIのメリット

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

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

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

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

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

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

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

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

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

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

  • コミット・リクエストを文の実行と関連付けてラウンド・トリップを減らす機能。

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

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

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

17.7.2 OCIおよびOCCIファンクション

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

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

17.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にあるオブジェクトにアクセスし、操作する機能も提供しています。

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

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

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

図17-1の説明は次にあります。
「図17-1 OCIまたはOCCIの開発過程」の説明


注意:

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

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

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

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

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

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

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

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

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

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

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

17.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 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で提供されます。

17.10 OraOLEDBの概要

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


参照:

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