4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AS400(DB2)の相対レコード番号をSQLで使う

Last updated at Posted at 2019-01-24

概要

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);

参考になったサイト

IBM AS400 iSeries - sort order of select statement

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?