READ 文

構文

READ  dynamic.array  FROM [file.variable,]  record.ID [ON ERROR 
 statements]
{THEN  statements [ELSE  statements] | ELSE  statements} 
{READL | READU} dynamic.array FROM [file.variable,] record.ID [ON ERROR  statements] [LOCKED  statements] 
{THEN  statements [ELSE  statements] | ELSE  statements} 
READV dynamic.array FROM [file.variable,] record.ID,  field#  
[ON ERROR  statements]
{THEN statements [ELSE  statements] | ELSE  statements} 
{ READVL | READVU } dynamic.array  FROM [file.variable,] record.ID, field# 
 [ON ERROR  statements] [LOCKED  statements] 
{THEN statements [ELSE  statements] | ELSE  statements}

説明

READ 文を使用すると InfoSphere® DataStage® ファイルからのレコードの内容を dynamic.array に割り当てることができます。

表 1. 各種 READ 文の用途
以下のステートメントを使用... 以下を実行...
READ レコードを読み取る。
READL 共有レコード・ロックを取得してレコードを読み取る。
READU 更新レコード・ロックを取得してレコードを読み取る。
READV フィールドを読み取る。
READVL 共有レコード・ロックを取得してフィールドを読み取る。
READVU 更新レコード・ロックを取得してフィールドを読み取る。

file.variable は、開いているファイルを指定します。file.variable が指定されていない場合、デフォルトのファイルが仮定されます (デフォルトのファイルの詳細については、OPEN ステートメントを参照してください)。 このファイルにアクセスできず、開くこともできない場合、プログラムはランタイム・エラー・メッセージを表示して強制終了します。

record.ID が指定したファイルにある場合、dynamic.array は、レコードの内容に設定され、THEN 文が実行されます。ELSE 文は無視されます。 THEN ステートメントが指定されていない場合、プログラムは続けて次のステートメントを実行します。record.ID がない場合、dynamic.array は、空白ストリングに設定され、ELSE 文が実行されます。THEN 文は無視されます。

file.variablerecord.ID、または field# が NULL 値として評価されると、READ ステートメントは正しく実行されずプログラムはランタイム・エラー・メッセージを出力して終了します。

ファイルが表である場合、プログラムの実効ユーザーは、ファイル内のレコードを読み取るための SQL SELECT 権限が必要です。プログラムの実効ユーザーについては、AUTHORIZATION ステートメントを参照してください。

分散ファイル

ファイルが分散ファイルである場合、READ ステートメントのあとに STATUS 関数を実行し、処理の結果を判別します。処理結果には以下があります。

-1
パーティショニング・アルゴリズムの評価が整数になりません。
-2
パート番号が無効です。

NLS モード

NLS が有効になっている場合、入出力処理を実行する READ およびそのほかの BASIC ステートメントでは、入力ファイルの適切なマップに基づいて外部データが内部文字セットにマッピングされます。

ファイルに、マップできない文字が含まれている場合、ELSE 文が実行されます。

READ 文の結果は、次のすべての影響を受けます。

STATUS 関数で返される値には以下があります。

3 マップできない文字がレコード ID にあります。

4 マップできない文字が、レコードのデータにあります。1

ON ERROR 節

READ ステートメントには、オプションで ON ERROR 節を指定できます。 その構文は、ELSE 節の構文と同様です。 ON ERROR 節を使用すると、READ ステートメントの処理中に致命的エラーが発生したとき、プログラムを強制終了させる代わりに実行する処理を指定できます。

致命的エラーが発生して、ON ERROR 節が指定されていない場合、または無視された場合 (アクティブなトランザクション時など) には、次のことが発生します。

致命的エラーは、次のいずれかが発生すると起こり得ます。

ON ERROR 節が使用される場合、STATUS 関数によって返される値はエラー番号です。

LOCKED 節

LOCKED 節が使用できるのは、READL 文、READU 文、READVL 文、および READVU 文です。その構文は、ELSE 節の構文と同様です。

LOCKED 節を使用すると、ほかのユーザーが設定したロックとの競合によって READ ステートメントが実行できなくなった状態を処理できます。 以下の競合ロックのいずれか 1 つがあると、LOCKED 節が実行されます。

表 2. LOCKED 節の実行をもたらす条件
ステートメント これが要求されるロック... 競合
READL READVL 共有レコード・ロック 排他ファイル・ロック、更新レコード・ロック
READU READVU 更新レコード・ロック 排他ファイル・ロック、意図的ファイル・ロック、共有ファイル・ロック、更新レコード・ロック、共有レコード・ロック

ロックの競合が発生した場合、READ ステートメントに LOCKED 節が指定されていないと、プログラムはファイルが解放されるまで待機します。

LOCKED 節が使用される場合、STATUS 関数によって返される値は、競合ロックを所有するユーザーの端末番号です。

ロックの解除

共有レコード・ロックは、CLOSERELEASE、または STOP ステートメントを使用して解除できます。更新レコード・ロックは、CLOSE、DELETEMATWRITE、RELEASE、 STOP、WRITE、または WRITEV ステートメントを使用して解除できます。

トランザクション内で取得または昇格したロックは、以前の文が処理された場合でも解除されません。

すべてのレコード・ロックは、コマンド・プロンプトに戻ると解放されます。

READL 文と READU 文

READL 構文を使用すると、共有レコード・ロックを取得してからレコードを読み取ることができます。 この場合、ほかのプログラムからも、ロックなしまたは共有レコード・ロックでこのレコードを読み取ることができます。

READU ステートメントを使用すると、更新レコード・ロックを取得してからレコードを読み取ることができます。 更新レコード・ロックを取得すると、ロックを解放するまでの間、ほかのユーザーがそのレコードを更新するのを防ぐことができます。

更新レコード・ロックが取得できるのは、そのレコードに対する共有レコード・ロックが存在していない場合だけです。 ほかの共有レコード・ロックが存在していなければ、共有レコード・ロックを所有するユーザーからの要求によって、更新レコード・ロックに昇格できます。

READ の代わりに READU を使用すると、複数のユーザーまたはプログラムが同時に同じレコードを修正するのを防ぐことができます。

READV 文、READVL 文、および READVU 文

READV ステートメントを使用すると、InfoSphere DataStage ファイル・レコード内のフィールドの内容を dynamic.array に割り当てることができます。

READVL ステートメントを使用すると、共有レコード・ロックを取得してから、レコードのフィールドを読み取ることができます。 READVL ステートメントは、READL ステートメントおよび READV ステートメントのすべての仕様に準拠しています。

READVU ステートメントを使用すると、更新レコード・ロックを取得してから、レコードのフィールドを読み取ることができます。 READVU ステートメントは、READU ステートメントおよび READV ステートメントのすべての仕様に準拠しています。

field# は、READV、READVL、および READVU 文を使用する場合にのみ指定できます。field# には、レコードから読み取るフィールドの索引番号を指定します。 field# 0 を使用して、レコードが存在するかどうかを判別できます。フィールドが存在しない場合、dynamic.array には、空白ストリングの値が割り当てられます。

PICK、IN2、および REALITY フレーバー

PICK、IN2、および REALITY フレーバー・アカウントでは、record.ID または field# が存在しない場合、dynamic.array はその値を保存し、空白ストリングに設定されることはありません。この場合、ELSE 文が実行され、THEN 文は無視されます。INFORMATION または IDEAL フレーバー・アカウントで、PICK、IN2、および REALITY フレーバーの READ ステートメントを指定するには、$OPTIONS ステートメントの READ.RETAIN オプションを使用します。

OPEN '','SUN.MEMBER' TO FILE ELSE STOP
FOR ID=5000 TO 6000
   READ MEMBER FROM FILE, ID THEN PRINT ID ELSE NULL
NEXT ID
OPEN '','SUN.SPORT' ELSE STOP 'CANT OPEN "SUN.SPORT"'
READ ID FROM "853333" ELSE
   PRINT 'CANT READ ID "853333" ON FILE "SUN.SPORT"'
END
X="6100"
READ PERSON FROM FILE,X THEN PRINT PERSON<1> ELSE
   PRINT "PERSON ":X:" NOT ON FILE"
END

次の例では、ファイル SUN.MEMBER のレコード N をロックし、フィールド 3 (STREET) を読み取ってフィールドの値を表示しています。

OPEN '','SUN.MEMBER' TO FILE ELSE STOP
FOR N=5000 TO 6000
   READVU STREET FROM FILE,N,3 THEN PRINT STREET ELSE 
NULL
   RELEASE
NEXT
OPEN "DICT","MYFILE" TO DICT.FILE ELSE STOP
OPEN "","MYFILE" ELSE STOP ; *USING DEFAULT FILE 
VARIABLE
READU ID.ITEM FROM DICT.FILE,"@ID" ELSE 
   PRINT "NO @ID"
   STOP
END

次のプログラム出力が得られます。

5205
5390
CANT READ ID "853333" ON FILE "SUN.SPORT"
MASTERS
4646 TREMAIN DRIVE
670 MAIN STREET

14 が返されるのは、NLSREADELSE パラメーターが 1 に設定されている場合だけです。NLSREADELSE が 0 の場合は値が返されず、データが消失してランタイム・エラー・メッセージが表示されます。