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に接続するコンピューティング環境を意味します。

トピック:

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クライアントで起動できるストアド・プロシージャを開発することができます。

関連項目:

20.4 Oracle Database Javaサポートの概要

この項では、JavaアプリケーションをサポートするOracle Databaseの機能の概要を説明します。データベースには、java.langjava.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コードは相互運用が可能です。

トピック:

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標準機能に対する拡張が含まれています。

トピック:

関連項目:

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);

関連項目:

Oracle SQLJ構文の例および詳細は、『Oracle Database SQLJ開発者ガイド』を参照してください

トピック:

関連項目:

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の実行モデルと類似した実行モデルを使用します。

関連項目:

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の公開

関連項目:

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

20.5 JavaScriptの概要

この項では、Oracle Multilingual Engine (MLE)を使用して、JavaScriptでサーバー側の手続き型ロジックを実行する方法の概要について説明します。

トピック:

この項では、Oracle DatabaseでJavaScriptを実行する方法の概要を示します。より包括的なガイドは、『Oracle Database JavaScript開発者ガイド』を参照してください。

20.5.1 Multilingual Engineの概要

Oracle Database Multilingual Engine (MLE)を使用すると、Oracle Databaseユーザーは、ストアド・プロシージャと動的コード・スニペットを使用して、Oracle DatabaseでJavaScriptを実行できます。

MLEはスマート・データベース(SmartDB)のアプローチを採用しているため、アプリケーション・ロジックとデータは同じデータベース内で共存できます。データベース内でデータを処理することで、大量のデータの処理やサーバー間(データベース、中間層およびクライアント)の情報転送に起因する問題の緩和が容易になります。

SmartDBのアプローチを使用することで、Oracle Database MLEは次の利点を提供します。

  • データベース内でロジックを実行すると、不要なネットワーク経由のデータ転送が除去され、データ集中型の操作のパフォーマンスが向上します。

  • データベース内にビジネス・ルールなどの要件を保存して実行すると、すべてのアプリケーションがルールに従うようになります。それにより、セキュリティとコンプライアンス要件の実装が簡素化されます。

  • 共通に使用される関数を一元的な場所に格納することは、コードの再利用に役立ちます。同時に、コードの複製を回避することもできます。

3層アーキテクチャで不要なリソースを消費するデータ集中型のアプリケーションがある場合は、処理ロジックを中間層からデータベースに移動すると、スループットの高速化、セキュリティの向上、データベースに近い場所で発生するシームレスなデータ処理が可能になります。

MLEは、MLEモジュール、MLE環境およびMLEコール仕様の3種類のスキーマオブジェクトを導入しています。MLEには、こうしたオブジェクトの作成、変更および削除のためのDDL拡張機能が用意されています。この拡張機能は、適切なデータベース権限を持つユーザーが使用できます。このようなオブジェクトには、オブジェクトに関する情報を問い合せることができるディクショナリ・ビューがあります。MLEでは、プログラムの実行時に収集されたランタイム状態を使用することで、実行後にデバッグを実行することもできます。

関連項目:

JavaScriptおよびMLEの詳細は、『Oracle Database JavaScript開発者ガイド』Multilingual Engineの概要に関する項を参照してください。

20.5.2 MLEの概念

MLEモジュール

MLEモジュールは、スキーマ・オブジェクトとしてデータベースに格納される、JavaScriptコードの単位です。

MLE関数

MLE関数は、MLEモジュールによってエクスポートされ、PL/SQLとSQLから関数またはプロシージャとしてコールできるようにされたものです。

MLEコール仕様

MLEコール仕様は、SQLとPL/SQLからコールできるMLE関数を(PL/SQL関数またはプロシージャとして)公開します。

MLE実行コンテキスト

MLE実行コンテキストには、JavaScriptコードの実行に関連付けられたすべてのランタイム状態がカプセル化されます。

MLE環境

MLE環境では、MLE実行コンテキストのプロパティを構成します。

動的MLE

動的MLEは、DBMS_MLE PL/SQLパッケージを使用することで、匿名JavaScriptコード・スニペットを直接実行できます。

20.5.3 MLE実行コンテキストとランタイムの分離の理解

MLE実行コンテキストとは、JavaScriptのためのスタンドアロンの分離されたランタイム環境であり、セッションでのJavaScriptコードの実行に関連付けられたすべてのランタイム状態をカプセル化します。

MLEは実行コンテキストを使用して、MLEモジュール、匿名コード・スニペットおよびデータベースユーザーの間のランタイム状態の分離を強制します。同じセッション内で異なるアプリケーションを個別のコンテキストで分離して、アプリケーション間での干渉を防止します。ランタイム状態の分離は、ローカル以外の変数にグローバル・スコープがあり、その可視性を制御できないJavaScriptなどの言語にとって重要です。

MLEは実行コンテキストを使用して、次のことを確実にします。

  • ある実行コンテキストで実行されているコードは、別の実行コンテキストのランタイム状態を認識または変更できません。

  • 実行コンテキストを共有するすべてのコードには、そのコンテキスト内のすべてのランタイム状態への完全なアクセス権があります。たとえば、事前定義済のグローバル変数にアクセスできます。

  • 異なるデータベース・ユーザーは、互いのランタイム状態を監視できません。

  • すべてのJavaScriptコードは、コンテキストの作成時に有効なユーザー、ロールおよびスキーマを使用して評価されます。

  • それぞれのコンテキストは単一のセッションにバインドされます。

MLEでは、次の2つの異なるシナリオで実行コンテキストが使用されます。

  • コール仕様。SQLとPL/SQLのMLE関数へのコールに暗黙的な実行コンテキストが使用されます

  • 動的MLE実行。開発者が動的MLEコンテキストを明示的に作成して使用します

MLEコンテキストには、それが作成されたセッションに限定された有効期間があります。セッションの終了時またはリセット時に、そのセッションで作成されたすべてのコンテキストが削除されます。セッションでは、JavaScriptコードを動的MLEスニペットとして実行することも、MLEモジュールからエクスポートされる関数として実行することもできます。

複数のコンテキストを使用する場合は、アプリケーションでは必要なコンテキストのみを作成して、参照されないコンテキストは削除することをお薦めします。

関連項目:

MLE実行コンテキストの詳細は、『Oracle Database JavaScript開発者ガイド』MLE実行コンテキストの概要に関する項を参照してください。

20.5.4 MLE環境の概要

MLE環境を使用すると、MLEが動的MLEスニペットとMLEコール仕様でJavaScriptコードを実行するために使用する実行コンテキストの特定のプロパティを構成できます。

MLE環境では、次のことが可能です。

  • 実行時の実行コンテキストにJavaScript固有の言語オプションを設定します。

  • 実行コンテキストでインポートする特定のMLEモジュールを有効にします。環境を使用すると、開発者はモジュールのインポート(import * from <module-import>)とデータベースに格納されているモジュールの間のマッピングを作成できます。たとえば、create MLE env myEnv imports('a' module module_a);のように、"a"を"module_a"にマップしたMLE環境を作成できます。

MLE環境は、複数の実行コンテキストにわたる管理(作成、変更または削除)と再利用が可能なスキーマ・オブジェクトです。環境を作成する場合は、CREATE MLE ENV DDL文を使用します。また、既存の環境の独立したコピーとして環境を作成することもできます。

ノート:

クローニング後に元の環境で行われた変更は、クローン環境に伝播されません。

ユーザーには、自分のスキーマにMLEモジュールと環境を作成するためのCREATE MLE権限、または任意のスキーマにMLEモジュールと環境を作成するためのCREATE ANY MLE権限が必要です。

環境が明示的に指定されていない場合、MLEはデフォルトのJavaScript固有の言語オプションを構成して、組込みのMLEモジュールをインポートに使用できるようにするデフォルトの環境を(SYSスキーマから)使用します。デフォルトの環境は、動的MLEコンテキストとモジュール・コンテキストに使用されます。

MLE環境に関する情報は、ディクショナリ・ビューの[user | all | dba | cdb]_mle_envsにあります。

関連項目:

20.5.5 JavaScript MLEモジュールの概要

JavaScriptコードは、MLEモジュールとしてデータベースに永続的に格納できます。MLEモジュールは、スキーマ・オブジェクトとしてデータベースに格納されるMLE言語コードの単位であり、単一のMLE言語(この場合はJavaScript)で記述されるコードが含まれています。MLEモジュールを使用すると、MLE関数をエクスポートできます。これは、PL/SQLとSQLから関数またはプロシージャとしてコールできます。

MLEは、ユーザー定義のMLEモジュールと組込みのMLEモジュールをサポートしています。組込みモジュールは、ユーザー定義のMLEモジュールのようにデータベースにデプロイされませんが、MLEランタイムの一部として含まれています。Oracle提供のJavaScriptモジュールは変更できません。

DDL文を使用すると、データベース・オブジェクトとしてMLEモジュールを管理(作成、変更、削除)できます。MLEモジュールなどのスキーマ・オブジェクトに関する情報を取得するには、ディクショナリ・ビューのUSER_MLE_MODULESALL_MLE_MODULESDBA_MLE_MODULESおよびCDB_MLE_MODULESを使用します。

関連項目:

20.5.6 JavaScript MLEコール仕様の概要

コール仕様では、SQLとPL/SQLからコールできるようにJavaScript MLE関数を公開します。セッションでコール仕様を実行するときに、MLEは、コール仕様で指定されたモジュールをロードし、そのモジュールによってエクスポートされたファンクションをコールします。

MLEコール仕様は、CREATE FUNCTIONまたはCREATE PROCEDURE DDL文の構文とともにMLE固有の要素を使用して作成できます。

コール仕様は、DROP FUNCTIONまたはDROP PROCEDURE DDL文を使用して削除できます。

自分のスキーマ内にMLEコール仕様を作成する場合は、CREATE PROCEDURE権限が必要です。また、任意のスキーマ内にMLEコール仕様を作成する場合は、CREATE ANY PROCEDURE権限が必要です。これをコールする場合は、MLEコール仕様に対するEXECUTE権限が必要です。

CREATE FUNCTION | PROCEDURE文の MLE MODULE句では、コール仕様の基になるJavaScript関数をエクスポートするMLEモジュールを指定します。指定したモジュールは常に、作成するコール仕様と同じスキーマ内に存在する必要があります。

MLEには、MLEコール仕様のUSER_MLE_PROCEDURESALL_MLE_PROCEDURESDBA_MLE_PROCEDURESおよびCDB_MLE_PROCEDURESに関する情報を照会できる3つのディクショナリビューが用意されています。

関連項目:

20.5.7 データベースでのJavaScriptの起動

JavaScriptは、次のいずれかの方法で起動できます。

  • MLEモジュール・コールを使用。PL/SQLコードはJavaScriptモジュールでエクスポートされた関数を参照します

  • 動的MLEのDBMS_MLE PL/SQLパッケージを使用。このパッケージで定義されているプロシージャを使用するとJavaScriptコード・スニペットを実行できます

20.5.8 MLEモジュールを使用したJavaScriptの起動

この項では、MLEモジュールの簡単な背景情報と、それらを使用してデータベースでJavaScriptを起動する方法について説明します。

MLEモジュールに関連する完全なドキュメントについては、『Oracle Database JavaScript開発者ガイド』を参照してください。

トピック:

20.5.8.1 MLEモジュール・コンテキストの使用

セッションでコール仕様を実行すると、JavaScriptランタイム・エンジンは、コール仕様でコールするエクスポート済関数(JavaScript関数)が含まれたJavaScriptモジュールをロードします。どのセッションでも、コール仕様でコールする各モジュールの実行コンテキストは、暗黙的にオンデマンドで作成されます。SQLおよびPL/SQLからのMLE関数へのコールは、MLEモジュールとコールが実行されるユーザーに専用の実行コンテキストで実行されます。

MLEでは、実行コンテキストを使用してランタイム状態の分離が維持されます。コール仕様が同じユーザー、モジュールまたは環境を共有しない場合、それらは別個のコンテキストに分離されます。

次に、MLEモジュールで実行コンテキストを使用する際に注意が必要な事項を示します。

  • 実行コンテキストは、異なるユーザーと異なるMLEモジュールのランタイム状態を分離します。異なるデータベース・ユーザーにかわって同じMLEモジュールのコードが実行される場合、個別の実行コンテキストも含まれます。

  • MLEは、MLEモジュールとMLE環境の組合せごとに専用の実行コンテキストを作成します。そのため、異なるモジュールまたは異なる環境を指定する2つのコール仕様は別個のモジュール・コンテキストで実行され、互換性のないモジュールが相互に干渉することがなくなります。

  • 同じセッション内で、MLEは複数のモジュール・コンテキストを使用してコール仕様を実行できます。

  • モジュールのランタイム表現はステートフルです。状態は、JavaScriptモジュール自体の変数や、モジュール内のコードにアクセスできるグローバル・スコープの変数などの要素で構成されます。

関連項目:

MLEモジュールの実行コンテキストの詳細は、『JavaScript開発者ガイド』MLE実行コンテキストの概要に関する項を参照してください

20.5.8.2 コール仕様の環境の指定

MLEコール仕様では、MLEコール仕様を実行するモジュール・コンテキストの環境をオプションで定義できます。モジュール・コンテキストの環境を定義する場合は、MLEコール仕様の作成時にENV句を含めます。

CREATE PROCEDURE scott.print_hello(name IN VARCHAR2) AS
 MLE MODULE scott."mymodule"
 ENV scott."myenv"
 SIGNATURE 'printHello';

scott.printプロシージャへのすべてのコールは、scott.mymoduleモジュールがロードされるモジュール・コンテキストで実行されます。さらに、そのモジュール・コンテキストはscott.myenv環境に従って構成されます。

モジュール・コンテキストは環境ごとに分離されます。2つのコール仕様が同じモジュールを参照していても、環境が異なる場合は、それぞれの環境で構成された個別のモジュール・コンテキストが作成されます。

関連項目:

MLEモジュールのMLE環境の追加に関する詳細は、『JavaScript開発者ガイド』MLEモジュールの環境の指定に関する項を参照してください

20.5.8.3 JavaScript MLEモジュールの管理

適切な権限があると、SQL DDL文を使用してMLEモジュールをスキーマ・オブジェクトとして作成できます。DDL文を使用すると、JavaScriptモジュールを追加、変更または削除できます。

CREATE MLE MODULE DDL文を使用して、MLEモジュールを作成します。

ALTER MLE MODULE DDL文を使用して、既存のモジュールの属性を変更します。

DROP MLE MODULE DDL文を使用して、モジュールを削除します。

例20-1 MLEモジュールの作成

CREATE MLE MODULE scott."jsmodule"
 LANGUAGE JAVASCRIPT
 AS export function func() { ... }

例20-2 MLEモジュールの置換え

CREATE OR REPLACE MLE MODULE scott."jsmodule"
 LANGUAGE JAVASCRIPT
 AS export function func() { ... }

例20-3 MLEモジュールの削除

DROP MLE MODULE scott."jsmodule"

関連項目:

20.5.8.3.1 組込みのJavaScript MLEモジュール

MLEには、SYSスキーマに存在する一連の組込みモジュールが用意されています。たとえば、MLE-js-oracledb (MLE JavaScript SQLドライバ)、MLE-js-bindings (PL/SQLと動的MLEコンテキスト間の値の交換に使用)、MLE-js-plsqltypes (SQLラッパー・型の定義)などがあります。

組込みのMLEモジュールは、どの実行コンテキストでもインポートできます。こうしたモジュールはデータベースにデプロイされませんが、MLEランタイムの一部として含まれます。

20.5.8.4 MLEモジュールを使用したJavaScriptコードの実行

MLEモジュールでは、次の方法でJavaScriptコードを使用できます。

  • コール仕様を作成して、MLEモジュールからエクスポートされた関数を公開できます。そうしたMLE関数は、SQLとPL/SQLからPL/SQL関数やプロシージャをコールする場合と同様にコールできます。

  • import文を使用すると、JavaScriptで記述されている別のMLEコードにJavaScript MLEモジュールをインポートできます。

20.5.8.4.1 MLE JavaScriptファンクションのコール

SQLとPL/SQLから、MLEコール仕様を使用するとMLE JavaScript関数を公開できます。MLE関数は、通常のPL/SQL関数やプロシージャをコールできるどの場所からでもコールできます。

例:

create or replace mle module example_module language javascript as
export function string2obj(inputString) {
    if ( inputString === undefined ) {
        throw `must provide a string in the form of key1=value1;...;keyN=valueN`;
    }

    let myObject = {};

    if ( inputString.length === 0 ) {
        return myObject;
    }

    const kvPairs = inputString.split(";");

    kvPairs.forEach( pair => {
        const tuple = pair.split("=");
        if ( tuple.length === 1 ) {
            tuple[1] = false;
        } else if ( tuple.length != 2 ) {
            throw "parse error: you need to use exactly one '=' between key and value and not use '=' in either key or value";
        }
        myObject[tuple[0]] = tuple[1];
    });
    return myObject;
}
/

 

create or replace function p_string_to_JSON(p_str varchar2) return JSON
as mle module example_module signature 'string2obj(string)';
/


declare
    l_json   JSON;
    l_string VARCHAR2(100);

begin
    l_string := 'a=1;b=2;c=3;d';
    l_json := p_string_to_JSON(l_string);
    dbms_output.put_line(json_serialize(l_json PRETTY));
end;
/

次に出力を示します。

{
  "a" : "1",
  "b" : "2",
  "c" : "3",
  "d" : false
}

関連項目:

『Oracle Database JavaScript開発者ガイド』MLE JavaScript関数のコールに関する項

20.5.8.4.2 JavaScript MLEモジュールのインポート

MLEモジュールの機能は、そのMLEモジュール外の別のMLE言語コードで再利用できます。既存の実行コンテキストのMLE言語コードは、言語のネイティブ・インポート・メカニズム(JavaScriptのimport()など)を使用することで、MLEモジュールのコードをインポートできます(コードが同じMLE言語の場合)。

MLEでのモジュールのインポートには、次の項目が含まれます。

  • MLEモジュール内のモジュール機能を別のMLEモジュールの実行コンテキストにインポートする

  • 動的MLE実行コンテキストで実行されるコードスニペットにMLEモジュールをインポートする

次に、別のMLEモジュールからMLE関数をインポートするMLEモジュールの例を示します。

create or replace mle env default_export_env 
    imports ('defaultExportModule' module default_export_module);

create mle module default_import_module language javascript as
import myMathClass from "defaultExportModule";

export function mySum(){
    const result = myMathClass.sum(4, 2);
    console.log(`the sum of 4 and 2 is ${result}`);
}
/

関連項目:

『JavaScript開発者ガイド』MLE JavaScriptモジュールのインポートの概要に関する項

20.5.9 動的MLE実行を使用したJavaScriptの起動

この項では、動的MLE実行の簡単な背景情報と、それを使用してデータベースでJavaScriptを起動する方法について説明します。

動的MLE実行に関連する完全なドキュメントについては、『Oracle Database JavaScript開発者ガイド』を参照してください。

トピック:

20.5.9.1 動的MLE実行の概要

ノート:

動的MLEの実行は、フレームワーク(APEX)とサーバー・テクノロジ(REPL)で作業する開発者に適しています。その他のすべてのユースケースには、JavaScriptの実行にMLEモジュールと環境を使用するようにお薦めします。

JavaScript MLEモジュールのかわりに動的MLE実行の方法を使用すると、JavaScriptコード・スニペットは、最初にMLEモジュールとしてデプロイする必要なく、DBMS_MLEパッケージを使用して直接実行できるようになります。動的MLE実行は、動的SQLの実行に使用されるDBMS_SQLパッケージに似ています。

動的MLE実行では、データベースにJavaScriptコードを格納することなく、JavaScriptコード・スニペットを起動できます。コードは、MLEモジュールとしてデプロイされるのではなく、VARACHAR2またはCLOB (大量のコードの場合)として提供されます。コードは、DBMS_MLEパッケージに渡され、このパッケージで評価されて実行されます。

PL/SQLと動的MLEスニペットの間で値を渡すには、DBMS_MLEパッケージで提供される関数を使用して、適切な実行コンテキストでグローバル変数を読み書きします。

20.5.9.2 動的MLE実行コンテキストの使用

MLEを使用すると、各動的MLEスニペットに使用する実行コンテキストを明示的に制御できます。動的MLE実行コンテキストは、DBMS_MLE.create_context()関数を使用して明示的に作成します。

FUNCTION create_context(
  environment IN VARCHAR2 DEFAULT NULL
) RETURN context_handle_t;

次に、動的MLE実行コンテキストを使用する際に注意が必要な点を示します。

  • 同じ実行コンテキストで、複数の動的MLEスニペットを評価できます。

  • 同じコンテキストで評価されたスニペットは、コンテキスト内のすべてのグローバル変数にアクセスできます。

  • あるコンテキストで評価されたスニペットの実行状態は、別のコンテキストで評価されたスニペットから完全に分離されます。

  • 各動的MLEコンテキストは、特定のデータベース・ユーザーの代理として作成されます。

  • 動的MLEコンテキスト・ハンドルでは、実行コンテキストを識別します。この実行コンテキストは、このハンドルで実行されるアクションにのみ使用されます。

  • 動的実行コンテキストは、DBMS_MLE.create_context()関数を使用して作成できます。この関数は、コール元ユーザーのために実行コンテキストを返します。

  • 動的MLEコンテキストで評価されるすべてのMLEコードは、そのコンテキストが作成されたユーザーの権限で実行されます。

  • それぞれのコンテキストは単一のセッションにバインドされます。異なるセッションの動的MLEスニペットは、ランタイム状態を共有できません。

関連項目:

動的MLE実行コンテキストの詳細は、『JavaScript開発者ガイド』MLE実行コンテキストの概要に関する項を参照してください

20.5.9.3 動的MLEコンテキストの環境の指定

動的MLEコンテキストの作成時には、オプション・パラメータとして環境オブジェクトのスキーマ名を指定できます。

DECLARE
  ctx DBMS_MLE.context_handle_t;
BEGIN
  ctx := DBMS_MLE.create_context(environment => 'SCOTT.myenv');
  ...
END;

DBMS_MLE.create_context関数への環境パラメータを省略した場合、実行コンテキストで実行されるコードはMLE組込みモジュールのみをインポートできます。

ノート:

DBMS_MLE.create_context関数に文字列として渡される環境名は大/小文字が区別されます。この環境名は有効なスキーマ名であることが必要です。環境名が暗黙的に大文字に変換されることはありません。

関連項目:

環境の詳細は、『JavaScript開発者ガイド』を参照してください。

20.5.9.4 動的MLE実行を使用したJavaScriptコードの実行

JavaScriptコード・スニペットは、DBMS_MLE PL/SQLパッケージで定義されているプロシージャを使用して実行できます。

DBMS_MLEパッケージを使用すると、次のことを実行できます。

  • 動的MLE実行コンテキストを作成します。

  • JavaScriptコード・スニペットは、文字列としてVARCHAR2またはCLOBで指定します。

  • 動的MLE実行コンテキストでコードを実行します。

  • PL/SQLエンジンとMLEエンジンの間で変数を渡します。PL/SQLの値を動的MLE実行コンテキストにエクスポートします。この値は、そのコンテキストで実行されているコード・スニペットで使用可能になり、動的MLE実行コンテキストからPL/SQLに値をインポートできます。

  • 実行コンテキストの割当てを解除します

動的MLEスニペットは、モジュール間のインポートを使用してMLEモジュールをインポートして、SQL文を実行できます。DBMS_MLEパッケージのプロシージャと関数をコールするには、EXECUTE DYNAMIC MLE権限が必要です。DBMS_MLEを使用して作成した動的MLE実行コンテキストは、コール元ユーザーの権限で作成されています。DBMS_SYS_MLEに対するEXECUTE権限を持つユーザーは、DBMS_SYS_MLEパッケージにアクセスできます。こうしたユーザーは任意のデータベース・ユーザーのかわりに動的MLE実行コンテキストを作成できます。

DBMS_MLE.create_context()関数をコールすると、動的MLEコードの実行コンテキストを作成できます。この関数は、言語オプションを指定するオプションのパラメータを受け取り、作成したコンテキストへのハンドルを返します。

関連項目:

20.5.9.4.1 インラインでのJavaScriptコードの実行

次の例では、動的MLE実行コンテキストを作成し、そのコンテキストでQ-Quote演算子を使用してJavaScriptスニペットを実行します。

DECLARE 
    l_ctx     dbms_mle.context_handle_t; 
    l_snippet CLOB; 
BEGIN 
    l_ctx := dbms_mle.create_context(); 
    l_snippet := q'~ 
// the q-quote operator allows for much more readable code 
console.log(`The use of the q-quote operator`);
console.log(`greatly simplifies provision of code inline`); 
~'; 
    dbms_mle.eval( 
                 l_ctx, 
                 'JAVASCRIPT', 
                 l_snippet 
    ); 
    dbms_mle.drop_context(l_ctx); 
EXCEPTION 
    WHEN OTHERS THEN 
        dbms_mle.drop_context(l_ctx); 
        RAISE; 
END; 
/
20.5.9.4.2 ファイルを使用したJavaScriptコードの実行

JavaScriptコードの別の指定方法は、BFILE演算子を使用してCLOBを読み取る方法であり、PL/SQLコードはJavaScriptコードから分離されています。

関連項目:

ファイルを使用してJavaScriptを実行する方法を示す例は、『JavaScript開発者ガイド』ファイルからのJavaScriptコードのロードに関する項を参照してください。

20.5.10 MLEでJavaScriptを操作するための権限

MLEは、データベース権限を使用してMLE機能へのアクセスを保護します。その権限は必要に応じて追加または再利用します。管理者は、ユーザーとロールの両方またはどちらかに必要な権限を付与できます。MLE JavaScriptコードを操作するために必要な最小権限とは、データベースでJavaScriptコードを実行する権限です。ユーザーがMLEスキーマ・オブジェクトを作成、変更または削除できるようにする権限は、ANYキーワードを指定した権限と同じように制限する必要があります。

自分のスキーマでJavaScriptコードを実行できるようにするには、ユーザー・アカウントに次のオブジェクト権限付与が発行されている必要があります。

GRANT EXECUTE ON JAVASCRIPT TO <role | user>

DBMS_MLEを使用してJavaScriptの動的実行を含めるには、追加の権限が必要です。

GRANT EXECUTE DYNAMIC MLE TO <role | user>

ノート:

権限を付与するときに、MLEはDBMS_MLEパッケージに基づいた動的MLE実行と、MLEモジュールと環境に基づいたMLE実行を区別します。

関連項目:

20.5.10.1 MLEユーザー権限
権限名 説明:

CREATE MLE

自分のスキーマでのモジュールまたは環境の作成または置換

CREATE ANY MLE

任意のスキーマでのモジュールまたは環境の作成または置換

ALTER ANY MLE

任意のスキーマでのモジュールまたは環境の変更

DROP ANY MLE

任意のスキーマでのモジュールまたは環境の削除

CREATE PROCEDURE

自分のスキーマでのコール仕様の作成または置換

CREATE ANY PROCEDURE

任意のスキーマでのコール仕様の作成または置換

DROP ANY PROCEDURE

任意のスキーマでのコール仕様の削除

EXECUTE DYNAMIC MLE

任意の動的MLE機能の実行

EXECUTE ON <mle-call-specification>

指定のMLEコール仕様の実行

EXECUTE ON <mle-language>

指定のMLE言語のコール仕様または動的MLEスニペットの実行

EXECUTE ON <mle-module>

参照MLEモジュールに対するコール仕様の実行、または環境でのインポートとしてのモジュールの定義

EXECUTE ON <mle-env>

モジュール・コンテキストまたは動的MLEコンテキストを構成するための指定のMLE環境の使用

20.5.11 サポートされているその他のMLE機能

次に、MLE (JavaScript)がサポートしているその他の機能を示します。

MLE JavaScript SQLドライバからのSQLおよびPL/SQLのコール

MLE JavaScript SQLドライバを使用すると、JavaScriptコード内からSQL文およびPL/SQLブロックを実行するためにJavaScriptを使用できます。JavaScriptには、JavaScript固有のSQLドライバAPIがあります。このAPIは、それに対応するクライアント側ドライバのAPIと密接に連携しています。たとえば、JavaScript MLE SQLドライバは、Node.jsのnode-oracledbアドオンのAPIと同様のAPIを提供します。

関連項目:

『JavaScript開発者ガイド』MLE SQLドライバからのPL/SQLおよびSQLのコールに関する項

JavaScriptからのstdoutおよびstderrへのアクセス

MLEでは、JavaScriptコードから標準出力およびエラー・ストリームに書き込まれたデータにアクセスする機能が提供されます。これらのストリームは、データベース・セッション内で、データベース・ユーザー、MLEモジュールおよび動的MLEコンテキストごとに個別に制御できます。実行したJavaScriptコードがstdoutstderrに書き込む情報は、多くの場合、デバッグや分析に役立つものです。DBMS_MLEパッケージでは、DBMS_OUTPUTまたはユーザー指定のCLOBのどちらかに、stdoutstderrをマッピングできます。

関連項目:

『JavaScript開発者ガイド』JavaScriptからのstdoutおよびstderrへのアクセスに関する項

MLE JavaScriptコードでのSODAコレクション

任意のSimple Oracle Document Access (SODA)実装を使用して、ほぼあらゆる種類のドキュメント(ビデオ、イメージ、サウンド、およびその他のバイナリ・コンテンツを含む)について、作成、読取り、更新、削除(CRUD)操作を実行できます。SODAはNoSQL形式のAPIのセットであり、Oracle Databaseでドキュメント(特にJSON)のコレクションを作成および格納できるようになります。さらに、そうしたコレクションの取得や照会もできるようになります。

関連項目:

『JavaScript開発者ガイド』MLE JavaScriptコードでのSODAコレクションの操作に関する項

MLE JavaScriptモジュールの実行後のデバッグ

MLEには、標準の出力デバッグに加えて、JavaScriptソース・コードに対して実行後のデバッグを行うオプションが用意されています。実行後のデバッグでは、プログラムの実行中にランタイム状態を効率的に収集できます。コードの実行が完了したら、収集されたデータを使用してプログラムの動作を分析し、注意が必要なバグを検出できます。

関連項目:

『JavaScript開発者ガイド』MLE JavaScriptモジュールの実行後デバッグに関する項

20.6 PL/SQL、JavaまたはJavaScriptの選択

Oracle Databaseは、サーバー側でPL/SQL、JavaおよびJavaScriptをサポートしています。また、クライアント側でプリコンパイラとAPIを使用することで、アプリケーションにSQLブロックとPL/SQLブロックを埋め込むことができます。Oracle Databaseから最大のメリットを得るために、プログラマはOracle Databaseでサーバー側プログラミングを選択する必要があります。アプリケーション・ロジックの実行をデータに近づけることで、ネットワーク・ラウンドトリップを回避し、一元的に格納された関数でコードを再利用し、すべてのアプリケーションの整合性を確保するためにデータベース内でビジネス・ルールを強制できます。

アプリケーションに使用する言語の選択は、主にアプリケーションまたはプロジェクトの種類と、どのように言語を使用するとメリットを得られるかによって異なります。PL/SQL、JavaおよびJavaScriptには独自の長所があり、Oracle Databaseで使用すると相互に補完します。

PL/SQL、JavaおよびJavaScriptは、SQLとPL/SQLのコール・シグネチャを通じてサーバー内でシームレスに相互運用されます。PL/SQLを使用して開発する場合は、JavaまたはJavaScriptのコードを呼び出すことも、PL/SQLからJavaまたはJavaScriptの関数を参照することもできます。Javaを使用して開発する場合は、分散CORBAまたはEnterprise Java BeansクライアントからPL/SQLパッケージの呼出しができます。JavaScriptを使用して開発する場合は、マルチリンガル・エンジン(MLE) JavaScript SQLドライバ(mle-js-oracledb)を使用することでJavaScript内からPL/SQLとSQLをコールできます。

表20-1に示すように、PL/SQLパッケージには、JavaおよびJavaScriptに相当するものがあります。

表20-1 PL/SQLパッケージと相当するJavaおよびJavaScript

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

DBMS_ALERT

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

mle-js-oracledbのコール。

DBMS_DDL

JDBCを使用します。

mle-js-oracledbに、この機能があります。

DBMS_JOB

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

JavaScriptを使用したジョブのスケジュールには、組込みのJavaScript SQLドライバを使用したDBMS_SCHEDULER.create_job()のコールが必要です。

DBMS_LOCK

JDBCでコールします。

mle-js-oracledbのコール。

DBMS_MAIL

JavaMailを使用します。

mle-js-oracledbのコール。

DBMS_OUTPUT

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

console.logを使用します。

DBMS_PIPE

JDBCでコールします。

mle-js-oracledbのコール。

DBMS_SESSION

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

ほとんどの場合は、mle-js-oracledbを使用するとALTER SESSION文を実行できます。例: myConnection.execute(`alter session set events 'sql_trace wait=true'`);

ノート:

ALTER SESSIONを直接コールするには、セッション属性やセット・イベントなどの設定を変更するための追加の権限が必要になることがあります。

DBMS_SNAPSHOT

JDBCでコールします。

mle-js-oracledbのコール。

DBMS_SQL

JDBCを使用します。

mle-js-oracledbを使用します。

DBMS_TRANSACTION

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

mle-js-oracledbを使用して、ALTER SESSION文を実行します。

DBMS_UTILITY

JDBCでコールします。

mle-js-oracledbのコール。

UTL_FILE

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

mle-js-oracledbのコール。

ノート:

DBMS_JOBパッケージはDBMS_SCHEDULER パッケージによって置き換えられており、Oracle Databaseの今後のリリースではDBMS_JOBのサポートは削除される可能性があります。特に、システム・ロードを管理するジョブを管理する場合、ユーザーのパッケージの実行権限を取り消して、DBMS_JOBを無効にすることが推奨されます。

詳細は、「DBMS_SCHEDULER」および『Oracle Database管理者ガイド』DBMS_JOBからDBMS_SCHEDULERへの移行」を参照してください。

トピック:

20.6.1 PL/SQLとJavaおよびJavaScriptの類似性

ここで説明するように、オブジェクト指向の機能はPL/SQL、JavaおよびJavaScriptで共通です:

  • Javaはクラス指向であり、JavaScriptにはクラスベースの継承があります。PL/SQLには明示的なクラスの概念はありませんが、クラスはオブジェクト型として定義できます。これにより、コンストラクタ、継承、多相性、置換など、オブジェクト指向のすべての機能が提供されます。

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

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

これらの言語のその他の共通点は、プログラムを効果的および効率的に実行できるように、それぞれが提供するパッケージとライブラリです。

20.6.2 PL/SQLの利点

Oracle Databaseの上に非常に安全で保守しやすい高パフォーマンスのアプリケーションを構築する場合は、PL/SQLを使用する必要があります。SQLの拡張機能であるPL/SQLでは、すべてのSQLデータ型、データ・カプセル化、情報隠蔽、オーバーロードおよび例外処理がサポートされます。

PL/SQLを使用する利点は次のとおりです:

  • SQLデータ型はPL/SQLで簡単に使用でき、データ型変換は不要です。

  • SQL操作は、特に大量のデータが関与する場合やアプリケーションのデータ検証要件が高い場合、PL/SQLによって高速になります。

  • コード開発は、通常、PL/SQLで高速になります(開発ツールまたは開発環境を使用している場合)。PL/SQLには、表にSQL操作を実行するためのパッケージ・ベースのストアド・プロシージャと関数が用意されているため、プログラムとデータベースの間のネットワーク・トラフィックが削減され、データ集中型のアプリケーションの時間が節約されます。

  • アプリケーション・ロジックを一元化することで、組込みAPIによるセキュリティと生産性の向上が得られ、それが複雑なデータ構造を簡素化し、セキュリティ機能の実装に役立ちます。

  • Pl/SQLを使用する場合は、堅牢なアプリケーションの作成にローコード開発プラットフォームのOracle APEXを使用できます。

  • 開発に利用できる、Oracle提供パッケージおよびサード・パーティ・ライブラリによる大規模なユーザー・ベースもあります。

ノート:

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

20.6.3 Javaの利点

Javaは次の場合に使用できます:

  • アプリケーションがERPシステム、RMIサーバー、Java/J2EEまたはWebサービスと相互作用する必要がある。

  • 次の理由により、アプリケーションの一部を中間層で開発する必要がある:

    • ビジネス・ロジックが複雑または高計算負荷であり、SQLへの直接アクセスは小から中程度。

    • 中間層駆動のプレゼンテーション・ロジックを実装する予定。

    • アプリケーションには、透過的なJava永続性が必要。

    • アプリケーションには、コンテナ管理のインフラストラクチャ・サービスが必要。

このため、アプリケーションをデータベース層と中間層にパーティション化する必要がある場合は、アプリケーション部分を必要に応じて中間層に移行し、Java/J2EEを使用します。

Javaを使用する利点は次のとおりです:

  • Javaは、ビジネス・ニーズの変化に応じて簡単に更新できる、コンポーネントベースでネットワーク中心のアプリケーションを作成するために使用できます。

  • Javaはオープン分散アプリケーション用に使用できます。ユーザーは業界全体で利用可能な多くのJavaベース開発ツールの恩恵を受けることができます。

  • Javaには固有のメカニズムがあります。たとえば、Javaにはセキュリティ・メカニズム、自動ガベージ・コレクタ、型安全性メカニズム、バイト・コード検証機能、およびJava 2セキュリティが組み込まれています。

  • Javaでは、組込みの配列境界チェック、組込みのネットワーク・アクセス・クラス、および有用な多数の即時使用可能なクラスを含むAPIなど、高速の開発機能が組み込まれています。

  • Javaには、データベースで再利用できる、多数のクラス・ライブラリ、ツール、およびサード・パーティ・クラス・ライブラリを備えています。

  • JavaはCORBA(クライアントに様々なコンピュータ言語を持つことができます)およびEnterprise Java Beansを使用できます。CORBAまたはEnterprise Java Beansクライアントから、PL/SQLパッケージの呼出しが可能です。

  • Javaによって、XMLツール、Internet File SystemまたはJavaMailを実行できます。

  • Oracle Java仮想マシン(JVM)は、インプレース・データの処理(Webサービス、Hadoopサーバー、サード・パーティ・データベースおよびレガシー・システムのコール)や、サード・パーティJavaライブラリの実行、Javaベースの言語(Jython、Groovy Kotlin、Clojure、Scala、JRuby)の実行に使用できます。

  • Javaはセキュリティに関して堅牢な言語であるため、データベース内で安全に使用できます。

20.6.4 JavaScriptの利点

高速実行のエンドツーエンド・アプリケーションを開発するための簡単なスクリプトを検討している場合は、JavaScriptが優先的な言語です。MLEサポートにより、JavaScriptで記述されたストアド・プロシージャとユーザー定義関数はOracle Database内で実行できます。

JavaScriptを使用した場合の利点は次のとおりです:

  • MLEにより、サーバー側JavaScriptの実行はデータベースと緊密に統合され、コードはデータとSQL実行の近くのデータベース・セッションのプロセス内で実行されます。この統合により、JavaScriptとSQLおよびPL/SQLの間で効率的なデータ交換が可能になります。

  • Oracle DatabaseでJavaScriptを使用すると、自己最適化コードを提供するGraalVMによるJust-In-Time (JIT)コンパイラを利用できるため、コードは処理するデータに適応させることができます。

  • PL/SQLでロジックを記述することなく、既存のJavaScriptコードを使用してOracleデータベースに対して直接実行できます。

  • JavaScriptモジュール内の関数を参照するストアド・プロシージャを作成できます。または、CREATE PROCEDUREまたはCREATE FUNCTION DDL文内で、JavaScriptコード自体をインライン化したストアド・プロシージャを作成できます。

  • JavaScriptは、オープンソース・パッケージの広大なエコシステムを維持する巨大なコミュニティのサポートがあり、プロジェクトに統合できる可能性があります。

  • JavaScriptは開始も開発も簡単です。

  • JavaScriptは、Oracle APEXアプリケーションのサーバー側プログラミング言語として使用できます。

20.7 プリコンパイラの概要

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

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

トピック:

関連項目:

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

20.7.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-4に、スキーマhr内のemployees表を問い合せるCソース・プログラムのコードの一部を示します。

例20-4 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.7.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-5に、スキーマhr内のemployees表を問い合せるCOBOLソース・プログラムのコードの一部を示します。

例20-5 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.8 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プログラムに埋め込む必要はありません。

トピック:

20.8.1 OCIおよびOCCIのメリット

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

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

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

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

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

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

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

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

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

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

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

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

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

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

20.8.2 OCIおよびOCCI関数

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

関数の種類 目的

リレーショナル

データベース・アクセスを管理し、SQL文を処理します。

ナビゲーション

データベースから取得したオブジェクトを操作します。

データベースのマッピングおよび操作

Oracle Databaseデータ型のデータ属性を操作します。

外部サブプログラム

PL/SQLからCコールバックを作成します(OCIのみ)

20.8.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.8.4 OCIアプリケーションまたはOCCIアプリケーションの作成

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

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

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

ノート:

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

20.9 プリコンパイラおよびOCIの比較

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

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

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

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

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

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

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

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

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

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

20.11 OraOLEDBの概要

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