SQLRecord ステレオタイプ

SQLRecord ステレオタイプは、レコード・パーツをリレーショナル・データベースで使用するために特殊化します。

ステレオタイプ (ステレオタイプを参照) は、レコード・レベルとフィールド・レベルで固有のプロパティーを提供します。getreplace などの EGL データ・アクセス文のターゲットとしてこのタイプの変数を使用すると、 特定の振る舞いを起動します。

EGL では、データベースからの情報に基づいて SQLRecord パーツを自動的に作成できます。 詳しくは、「EGL プログラマー・ガイド」の『データ・アクセス・アプリケーションの作成』を参照してください。

SQLRecord ステレオタイプを基にする各カスタム・レコード・タイプには、以下のオプション・プロパティーがあります。
tableNames
各要素が、レコード定義に関連付ける SQL テーブルを特定する 2 次元配列。 オプションで、そのテーブルのテーブル・ラベル (SQL 別名) を指定できます (このトピック内の『テーブル・ラベル』を参照)。 テーブル名を指定しなかった場合、このプロパティーはデフォルトの SQL レコード名になります。 以下のコード例は、データ・アクセス文で CustomerRecord 変数を使用するときには、必ず「顧客」というデータベース表が使用されていると想定するように EGL に通知するものです。
Record CustomerRecord type SQLRecord
  { tableNames = [["Customer"]] }
  ...
end
defaultSelectCondition
デフォルト SQL 文にある WHERE 文節の一部となる条件を指定します。 WHERE 文節は、SQL レコードを EGL の execute 文、open 文、 または get 文で使用する際に便利です。

たいていの場合、SQL デフォルト選択条件は第 2 条件を補足します。この第 2 条件は、SQL レコード内のキー・フィールド値と、SQL テーブルのキー列の関連付けが基礎となります。

#sqlCondition ディレクティブを使用して条件を指定します。 詳しくは、#sqlCondition ディレクティブを参照してください。

tableNameVariables
以下の例にあるように、実行時のコンテンツがアクセス先のデータベース表を判別する、1 つ以上の変数を指定できます。
myTable STRING;
Record CustomerRecord type SQLRecord
  { tableNameVariables = [["myTable"]] }
  ...
end

myCustomer CustomerRecord;

  function main()
    myTable = requestTableName();
    get myCustomer;
    displayCustomer(myCustomer);
  end    
EGL ステートメント get myCustomer は、変数 myTable によって指定されたデータベース表からデータを読み取ります。 myTable 変数を使用することで、類似した列を持つ複数の表が扱えます。 このロジックによって、アクセスする表が決定されます。表ごとに新規の EGL コードを作成する必要はありません。
tableNameVariables は、2 次元配列をとることに注意してください。 テーブル名を保持する変数のほかにテーブル・ラベルを指定するために第 2 次元を使用します ( このトピック内の『テーブル・ラベル』を参照)。
{ tableNameVariables = [["myTable", "T1"], 
                        ["myOtherTable", "T2"]] }
keyItems
この配列は、キーを構成するレコード内の 1 つ以上のフィールドを識別します。 このキーは、データベース表内の対応するフィールドを一致させるために使用されます。 これらの各フィールドを指定するには、非修飾参照を使用する必要があります。 例えば、myRecord.myItem ではなく、myItem を使用します。 EGL ステートメント内では、他のすべてのフィールドと同じようにキー・フィールドを参照できることに留意してください。get 文または open 文で usingKeys キーワードを指定することによって、これらのキー値をオーバーライドできます。
fieldsMatchColumns
すべてのフィールドの型、長さ、小数点以下の桁数、および NULL 可能性が対応するデータベース列の特性に正確に一致する場合は、このプロパティーを YES に設定します。このプロパティーを使用して、Java™ 用に生成した EGL プログラムがデータベースからデータを取得するときに実行する整合性検査をバイパスし、処理速度を改善します。 デフォルトは NO です。

テーブル・ラベル

tableNames または tableNameVariables 配列内の各要素に、テーブル・ラベルを入れることができます。 DB2® バージョン 7 は、18 文字までの長さの表ラベルをサポートします。また、DB2 バージョン 8 では、表ラベルの長さに関する制限はありません。 SQL では別名 と呼ばれるこのラベルを使用することにより、SQL の JOIN ステートメントを使用して複数のテーブルを結合する際に、同じ名前を持つ 2 つの列を区別することができます。 以下に、tableNames 配列の例を示します。
package com.CompanyB.CustomerPackage;

Record CustomerRecord type SQLRecord 
{ tableNames=[["Customer", "T1"]], keyItems=["customerNumber"] }
	customerNumber INT {column = "customer_number"};
	customerName STRING {column = "customer_name"};
	customerBalance DECIMAL(9,2) {column = "customer_balance"};
end

Record OrderRecord type SQLRecord 
{ tableNames=[["Orders", "T2"]], keyItems=["orderNumber"] }
	orderNumber INT {column = "order_number"};
	customerNumber INT {column = "customer_number"};
	orderTotal DECIMAL(9,2) {column = "order_total"};
end

program CustomerTest type BasicProgram 
	myCustomer CustomerRecord; 
	myOrder OrderRecord;

	function main()
		myCustomer.customerNumber = 1001;
		get myCustomer with
			#sql{
				select
					customer_name, order_total
				from Customer T1, Orders T2
				join Orders on T1.customer_number = T2.customer_number
				where
					T1.customer_number = :myCustomer.customerNumber
			}
			into myCustomer.customerName, myCustomer.customerBalance;  
	end
	
end

customerNumber フィールドは、Customer テーブルの主キーであり、Order テーブルの外部キーです。 ただし、2 つのテーブルを結合後、T1 または T2 の指定を使用して、コードがどちらの customerNumber を参照するかを指定する必要があります。


フィードバック