バージョン 4.2.5
 —  ステートメント  —

UPDATE

ストラクチャードモード構文

UPDATE [RECORD] [IN] [STATEMENT] [(r)]

レポーティングモード構文

UPDATE [RECORD] [IN] [STATEMENT] [(r)]        
             
 

SET

     
  WITH

SAME [RECORD]

  USING {operand1=operand2}

このドキュメントでは、次のトピックについて説明します。

構文図で使用されている記号については、「構文記号」を参照してください。

関連ステートメント:ACCEPT/REJECT | AT BREAK | AT START OF DATA | AT END OF DATA | BACKOUT TRANSACTION | BEFORE BREAK PROCESSING | DELETE | END TRANSACTION | FIND | GET | GET SAME | GET TRANSACTION DATA | HISTOGRAM | LIMIT | PASSW | PERFORM BREAK PROCESSING | READ | RETRY | STORE

関連機能グループ:「データベースへのアクセスと更新


機能

UPDATE ステートメントは、データベースレコードの 1 つ以上のフィールドを更新するために使用します。 更新するレコードは、FINDGETREAD(または Adabas の場合は STORE)ステートメントで事前に選択されている必要があります。

ホールド状態

UPDATE ステートメントの使用により、対応する FINDREAD ステートメントで選択された各レコードはホールド状態になります。

詳細については、「レコードホールドロジック(『プログラミングガイド』)を参照してください。

Top of page

制限事項

Top of page

データベース固有の考慮事項

DL/I

UPDATE ステートメントは、DL/I データベースのセグメントを更新するために使用できます。 必要に応じて、UPDATE ステートメントで指定された全フィールドを収容できるようにセグメント長は拡張されます。

マルチプルバリューフィールドまたはピリオディックグループが可変長として定義されている場合、UPDATE ステートメントに指定されたオカレンスのみがセグメントに書き込まれます。

DL/I AIX フィールド名は、UPDATE ステートメントでは使用できません。 ただし、AIX フィールドから成るソースフィールドを参照することにより、AIX フィールドを更新することができます。

DL/I シーケンスフィールドは DL/I 制限のために更新できません。

GSAM 制限により、UPDATE ステートメントは GSAM データベースには使用できません。

VSAM

VSAM プライマリキーは VSAM 制限のために更新できません。

DL/I AIX フィールド名は、UPDATE ステートメントでは使用できません。 ただし、AIX フィールドから成るソースフィールドを参照することにより、AIX フィールドを更新することができます。

SQL

UPDATE ステートメントは、データベーステーブルの行を更新するために使用できます。 このステートメントは SQL の UPDATE WHERE CURRENT OF CURSOR(位置決め UPDATE)に相当し、最後に読み込まれた行のみを更新できます。

プログラム内で変更された列(フィールド)のみが、プログラム外(マップの入力フィールドなど)で変更された可能性のある(実際に変更されている必要はない)列に加えて更新されます。 他のすべてのプラットフォームでは、すべての列が更新されます。

ほとんどの SQL データベースで、FIND SORTED BY ステートメントや READ LOGICAL ステートメントによって読み込まれた行は更新できません。

Top of page

構文説明

オペランド定義テーブル:

オペランド 構文要素 フォーマット ステートメント参照 ダイナミック定義
operand1   S A     A   N P I F B D T L       不可 不可
operand2 C S A     A   N P I F B D T L       不可

構文要素の説明:

(r)
ステートメント参照:

表記 (r) を使用して、更新するレコードが選択されたステートメントを示すことができます。 r は、ソースコード行番号またはステートメントラベルとして指定できます。

参照指定がなければ、UPDATE ステートメントでは、一番内側のアクティブな READ または FIND 処理ループが参照されます。 アクティブな READ または FIND ループがない場合、このステートメントより前の最後の GET(または STORE)ステートメントが参照されます。

注意:
UPDATE ステートメントは、参照している READ または FIND ループ内に指定する必要があります。

USING SAME

この節は、DEFINE DATA ステートメントを使用している場合は許可されません。UPDATE ステートメントは DEFINE DATA ステートメント内の定義に従って常にビュー全体を参照するからです。

レコードバッファまたはフォーマットバッファのレイアウトは、OBTAIN ステートメントを使用して宣言できます。

USING SAME は、レポーティングモードで UPDATE ステートメントが参照するステートメントで読み込まれたフィールドと同じフィールドを更新に使用することを示します。 この場合、各データベースフィールドに割り当てられた最新の値がフィールドの更新に使用されます。 新しい値の割り当てがなければ、古い値が使用されます。

更新するフィールドがマルチプルバリューフィールドやピリオディックグループの配列範囲で、この配列範囲に変数インデックスを使用する場合、最新の範囲が更新されます。 つまり、レコードが読み込まれた後で、かつ UPDATE USING SAME(レポーティングモード)または UPDATE(ストラクチャードモード)の各ステートメントの実行前にインデックス変数が変更されると、更新される範囲は読み込み時の範囲と同じではなくなります。

SET/WITH operand1=operand2

この節は、レポーティングモードで更新するフィールドと値を指定するために使用します。

この節は、DEFINE DATA ステートメントを使用している場合は許可されません。UPDATE ステートメントは DEFINE DATA ステートメント内の定義に従って常にビュー全体を参照するからです。

注意:
DL/I データベースの場合:SET/WITH 節を使用する場合、I/O(センシティブ)フィールドのみを指定できます。 セグメントシーケンスフィールドは更新できません(代わりに DELETE および STORE を使用する必要があります)。

Top of page

** Example 'UPDEX1S': UPDATE (structured mode)                          
**                                                                      
** CAUTION: Executing this example will modify the database records!    
************************************************************************
DEFINE DATA LOCAL                                                       
1 EMPLOY-VIEW VIEW OF EMPLOYEES                                         
  2 NAME                                                                
  2 FIRST-NAME                                                          
  2 CITY                                                                
*                                                                       
1 #NAME (A20)                                                           
END-DEFINE                                                              
*                                                                       
INPUT 'ENTER A NAME:' #NAME (AD=M)                                      
IF #NAME = ' '                                                          
  STOP                                                                  
END-IF                                                                  
*                                                                       
FIND EMPLOY-VIEW WITH NAME = #NAME                                      
  IF NO RECORDS FOUND                      
    REINPUT WITH 'NO RECORDS FOUND'  MARK 1
  END-NOREC                                
  INPUT 'NAME:      ' NAME (AD=O) /        
        'FIRST NAME:' FIRST-NAME (AD=M) /  
        'CITY:      ' CITY (AD=M)           
  UPDATE                                   
  END TRANSACTION                        
END-FIND                                   
*                                          
END  

プログラム SUBEX1S の出力:

ENTER A NAME: BROWN
            

名前を入力して確認した後:

NAME: BROWN
FIRST NAME: KENNETH
CITY: DERBY

レポーティングモードの例はライブラリ SYSEXRM のプログラム UPDEX1R を参照してください。

Top of page