実列と仮想列の違いは、次のような例を考えるとわかりやすいでしょう。
ACCMSTという口座テーブルがあり、そこに次のような、CHTACCという8桁の列があるとします。
+---+---+---+---+---+---+---+---+
| 0 | 8 | 6 | 3 | 4 | 3 | 1 | 2 |
+---+---+---+---+---+---+---+---+
この例は口座番号が 08634312 の場合を示します。実際には、口座番号は次の 3 つの部分に分かれています。
1. 2 桁の企業番号 (08)
2. 2 桁の部門番号 (63)
3. 4 桁の原価部門番号 (4312)
企業番号、部門番号、原価部門番号とも、口座番号から直接求められるので、COMPNO、DIVNUM、COSTCTという仮想列を定義することを考えてもよさそうです。
するとACCMSTテーブルは次のような定義になります。
|
もちろんこれだけでは充分でありません。各「仮想」列が、実列であるCHTACCからどのように「派生」するかを定義する必要があります。
この場合、定義方法には次の2通りがあります。
この例の場合、実列CHTACCの部分文字列を抽出する「仮想列の拡張定義」ファンクションで実現するか、または文字列の分割処理をRPG/400で記述することになります。
実際に定義すると、COMPNO、DIVNUM、COSTCTの各列がACCMSTテーブルに存在するようになります。もちろんこれはそう見えるだけであって、実際に物理的な列があるわけではありません。「仮想」列と呼ばれるのはこのためです。
これらの仮想列は、ACCMSTテーブルからデータを読み込む際にのみ使います。テーブルに対する書き込み/更新時には使われません。
その直前に、3つの値を連結してCHTACCの値を更新してしまうので、仮想列の内容をテーブルに保存する必要はないのです。この性質が、状況によっては非常に役立ちます。
次のトピックも参照してください。