SQLJ で SQL ステートメントを Java™ プログラムに組み込むことができます。 SQLJ は、IBM® Corporation、Microsoft® Corporation、Sun Microsystems、および Oracle など、データベースおよびアプリケーション・サーバー・ソフトウェアの主要なプロバイダーの共同事業体によって開発された ANSI 規格です。
SQLJ 変換プログラムは、SQLJ ソース・ファイルを標準 Java ソース・ファイルと SQLJ シリアライズ・プロファイルに変換します。このプロファイルは、静的 SQL に関する情報を SQLJ ソースの中にカプセル化します。 この変換プログラムは、組み込み SQL ステートメントを SQLJ ランタイム・ライブラリーの呼び出しに置き換えることにより、SQLJ 文節を標準 Java ステートメントに変換します。 SQLJ カスタマイズ・スクリプトは、SQLJ プロファイルをデータベースにバインドし、1 つまたは複数のデータベース・パッケージを生成します。 Java ファイルはコンパイルされ、データベース上で (パッケージを使用して) 実行されます。 SQLJ ランタイム環境は、純粋な Java に実装された SQLJ ランタイム・ライブラリーで構成されています。 SQLJ ランタイム・ライブラリーは、DB2® などのターゲット・データベース用の JDBC ドライバーを呼び出します。
ワークベンチで SQLJ を使用してアプリケーションを作成し、SQLJ をサポートする任意のデータベース (たとえば、DB2 または Oracle) に対してそれらのアプリケーションを実行できます。組み込みカスタマイズ機能は、DB2 にのみ使用できます。
ワークベンチには、以下の SQLJ 機能があります。
SQLJ と JDBC は、どちらも Java アプリケーションにリレーショナル・データベースへのアクセス機能を提供しますが、以下のような相違点があります。
一般に、動的 SQL は静的 SQL より柔軟性があり、前もって SQL ステートメントを作成する必要がありません。 静的 SQL は、SQL ステートメントの実行に必要な作業の多くをデータベースが実行時以前に完了しているので、効率が優れています。
動的 SQL は、たとえば、実行時までテーブルの列数や列の型がわからないような場合に、テーブルの照会と更新を行う機能を提供します。 JDBC で動的 SQL を使用することにより、Java プログラムは実行時に SQL ステートメントを作成できます。
動的 SQL を使用した場合、データベース・アクセスと許可は、実行時に判別されます。 アプリケーションのユーザーは、必要なすべてのデータベース特権を持っている必要があり、データベースは、必要なデータにアクセスする最適の方法を実行時に判別する必要があります。 しかし、静的 SQL の場合、アクセスと許可はカスタマイズおよびバインド時に判別されます。 バインド・プロセスを実行するユーザーの特権が、アプリケーションで何ができるかを決定します。 データベースは、データにアクセスする最適の方法をカスタマイズおよびバインド時に判別するので、実行時のパフォーマンスが向上します。
多くのアプリケーションでは、データベース・メタデータ (たとえば、テーブル名、列名) が実行時に変更されないので、SQL ステートメントを動的に作成する必要はありません。 そのようなアプリケーションでは、動的 SQL よりパフォーマンスの高い静的 SQL を使用できます。
静的 SQL の使用による高パフォーマンス以外に、SQLJ には JDBC による以下の利点があります。
SQLJ にはできなくて、JDBC にできることが 1 つあります。それは、動的 SQL ステートメントを実行することです。 ただし、アプリケーションで動的 SQL を使用する必要がある場合は、SQLJ 文節を使用して、プログラムに JDBC コードをインクルードすることができます。
SQLJ 文節は、Java コードの中に組み込まれます。 各文節は、記号 #sql で始まります。 次の SQLJ 文節は、WHERE 文節内に Java 変数がある SELECT ステートメントの例です。
#sql [ctx] cursor1 = {SELECT EMP_ACT.EMPNO FROM EMP_ACT WHERE EMP_ACT.PROJNO = :strProjNo};
DB2 の SQLJ サポートは、SQLJ ANSI 規格をベースにしています。以下の種類の SQL 構成体を、SQLJ プログラムの中で使用できます。