SQLJ アプリケーションでの変数

他の言語のアプリケーション・プログラムでは、ホスト変数を使用して、アプリケーション・プログラムとデータ・サーバーの間でのデータの受け渡しを行います。 SQLJ プログラムでは、ホスト変数またはホスト式 を使用できます。

ホスト式はコロン (:) で始まります。コロンの後にオプション・パラメーター・モード ID (IN、OUT、または INOUT) が続き、その後に括弧で囲んだ式の節が続きます。

ホスト変数およびホスト式には大文字と小文字の区別があります。

複雑な式とは、配列要素または単一の値に評価されるJava式です。 SQLJ 節での複合式は括弧で囲む必要があります。

変数名に関する制限: SQLJ プログラムでは 2 つのストリングに特殊な意味があります。 それらのストリングを SQLJ プログラムで使用する場合は以下の制限を守ってください。
  • ストリング __sJT_ は SQLJ によって生成される変数名のために予約された接頭部です。 以下のタイプの名前を __sJT_ で始めないでください。
    • ホスト式の名前
    • 実行可能なSQLステートメントを含むブロックで宣言されたJava変数名
    • 実行可能 SQL ステートメントを含むメソッドのパラメーターの名前
    • 実行可能 SQL ステートメントを含むクラス内のフィールドの名前、あるいは実行可能 SQL ステートメントを含むサブクラスまたは囲みクラスを持つクラス内のフィールドの名前
  • ストリング _SJ は SQLJ によって生成されるリソース・ファイルおよびクラスのために予約された接尾部です。 クラス名および入力ソース・ファイル名ではストリング _SJ を使用しないでください。

例:Java識別子の宣言とSELECT文での使用:

この例では、#sql で始まるステートメントには他の言語の SELECT ステートメントと同じ機能があります。 このステートメントは、従業員番号000010の従業員の姓をJava識別子 empname に割り当てます。

String empname;
…
#sql [ctxt] 
  {SELECT LASTNAME INTO :empname FROM EMPLOYEE WHERE EMPNO='000010'};

例:Java識別子の宣言とストアドプロシージャ呼び出しでの使用:

この例では、#sql で始まるステートメントには他の言語の SQL CALL ステートメントと同じ機能があります。 このステートメントは、ストアドプロシージャ A への入力パラメータとして、Java識別子 empno を使用します。 empno の前に置かれたキーワード IN は、 empno が入力パラメータであることを示します。 CALL ステートメントでのパラメーターの場合、IN がデフォルトです。 パラメーターが使用される方法を示す明示的またはデフォルトの修飾子 (IN、OUT、または INOUT) は、ストアード・プロシージャーの CREATE PROCEDURE ステートメントで指定したパラメーター定義の対応する値と一致しなければなりません。

String empno = "0000010";
…
#sql [ctxt] {CALL A (:IN empno)};

例: ホスト ID としての複合式の使用

この例は、複合式 (((int)yearsEmployed++/5)*500) をホスト式として使用します。

#sql [ctxt] {UPDATE EMPLOYEE
        SET BONUS=:(((int)yearsEmployed++/5)*500) WHERE EMPNO=:empID};
SQLJ は複合ホスト式を処理する際に以下のアクションを実行します。
  • ステートメント内の各ホスト式を、それぞれの値をデータベースに割り当てる前に左から右に評価します。
  • 後置演算子を使用した演算などの副作用を、通常のJavaのルールに従って評価します。 すべてのホスト式は、それらの値がデータ・サーバーに渡される前に完全に評価されます。
  • 四捨五入と切り捨てにJavaのルールを使用します。
従って、UPDATE ステートメントが実行される前に yearsEmployed の値が 6 である場合、UPDATE ステートメントによって列 BONUS に割り当てられる値は ((int)6/5)*500、または 500 です。 500 が BONUS に割り当てられた後、yearsEmployed の値が増やされます。