実列と仮想列の違いは、次のような例を考えるとわかりやすいでしょう。

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という「実」列

8

COMPNOという「仮想」列

2

DIVNUMという「仮想」列

2

COSTCTという「仮想」列

4

もちろんこれだけでは充分でありません。各「仮想」列が、実列であるCHTACCからどのように「派生」するかを定義する必要があります。

この場合、定義方法には次の2通りがあります。

  • 仮想列の拡張定義ファンクションを用いる方法。実列から仮想列を派生させる、あるいは逆に仮想列から実列の値を求めるために、最も多く使われている方法です。
  • プログラムを作成し、列に設定する方法。複雑な変換処理が必要な場合に向いた、柔軟性の高い方法ですが、特定のプラットフォームに依存してしまいます。

この例の場合、実列CHTACCの部分文字列を抽出する「仮想列の拡張定義」ファンクションで実現するか、または文字列の分割処理をRPG/400で記述することになります。

実際に定義すると、COMPNO、DIVNUM、COSTCTの各列がACCMSTテーブルに存在するようになります。もちろんこれはそう見えるだけであって、実際に物理的な列があるわけではありません。「仮想」列と呼ばれるのはこのためです。

これらの仮想列は、ACCMSTテーブルからデータを読み込む際にのみ使います。テーブルに対する書き込み/更新時には使われません。

その直前に、3つの値を連結してCHTACCの値を更新してしまうので、仮想列の内容をテーブルに保存する必要はないのです。この性質が、状況によっては非常に役立ちます。



次のトピックも参照してください。

仮想列の応用例

仮想列の考え方

  • No labels