概要
AS400のデータファイルには、相対レコード番号というものが付与されており、この番号を使ってレコードを一意に特定する事ができる。
OracleでいうとROWIDに相当する物で、OSが自動的に割り振り、基本的には(SQL文等では)変更する事はできない。
AS400のコマンドでデータファイルを扱う際には、レコードを特定するためにパラメータに指定したりするが、SQLでデータ操作をする時に使いたい場合がある。どうしたらよいのだろうか?
どんな時に使いたいか?
AS400上に構築されたシステムは、リレーショナルデータベースが流行る前から存在していたりする。
そんなわけで、ユニークキーを設定する意識がほとんどなかったりする。
キーは設定されていても、全く同じ内容のレコードが平気で登録されていたりするのだ。
そういう場合、「一番最後に登録されたレコードが現行。古いのは更新する前の履歴。」みたいな仕様だったりする。
RPGでプログラムすると、同じキーが設定されているレコードを順番にカーソル移動させていって、最後のレコードを使う。みたいな感じになる。
SQLを使って同じ事をしようとすると、「最後のレコード」の見分けがつかなくて困ってしまう事になる。
こういう時に、「相対レコード番号が一番大きいレコード」を「最後のレコード」として使う事ができる。
SQLからはrrn関数を使う
SQLからはrrn関数を使う事で、相対レコード番号を知る事ができる。
相対レコード番号は、データが登録された順に付与されるので、例えば下記のようにすると相対レコード番号を含めた結果を得る事ができる。
SELECT
rrn(file)
,file.*
FROM
lib.datafile file
WHERE
cusno = 497
ORDER BY
rrn(file);