MainframeMaster

COBOL Tutorial

COBOL MOVE Statement

The MOVE statement transfers data from one location to another, performing necessary data type conversions and formatting in COBOL programs.

Syntax

Basic MOVE

cobol
1
MOVE { identifier-1 | literal-1 } TO identifier-2 [, identifier-3]...

MOVE CORRESPONDING

cobol
1
MOVE { CORRESPONDING | CORR } identifier-1 TO identifier-2

Basic MOVE Operations

Simple Data Transfer

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
IDENTIFICATION DIVISION. PROGRAM-ID. MOVE-DEMO. DATA DIVISION. WORKING-STORAGE SECTION. 01 SOURCE-NAME PIC X(20) VALUE "John Smith". 01 DEST-NAME PIC X(30). 01 SOURCE-NUMBER PIC 9(5) VALUE 12345. 01 DEST-NUMBER PIC 9(8). 01 LITERAL-EXAMPLE PIC X(15). PROCEDURE DIVISION. MAIN-PARA. *> Move from variable to variable MOVE SOURCE-NAME TO DEST-NAME. DISPLAY "Moved name: " DEST-NAME. *> Move number to larger field MOVE SOURCE-NUMBER TO DEST-NUMBER. DISPLAY "Moved number: " DEST-NUMBER. *> Move literal to variable MOVE "Hello World" TO LITERAL-EXAMPLE. DISPLAY "Literal move: " LITERAL-EXAMPLE. *> Move to multiple targets MOVE SPACES TO SOURCE-NAME DEST-NAME LITERAL-EXAMPLE. DISPLAY "After SPACES move: '" SOURCE-NAME "'". STOP RUN.

Data Type Conversions

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
IDENTIFICATION DIVISION. PROGRAM-ID. MOVE-CONVERSIONS. DATA DIVISION. WORKING-STORAGE SECTION. 01 NUMERIC-SOURCE PIC 9(5) VALUE 12345. 01 ALPHA-DEST PIC X(10). 01 ALPHA-SOURCE PIC X(10) VALUE "98765". 01 NUMERIC-DEST PIC 9(8). 01 DECIMAL-SOURCE PIC 9(3)V99 VALUE 123.45. 01 INTEGER-DEST PIC 9(5). PROCEDURE DIVISION. MAIN-PARA. *> Numeric to Alphanumeric conversion MOVE NUMERIC-SOURCE TO ALPHA-DEST. DISPLAY "Numeric to Alpha: '" ALPHA-DEST "'". *> Alphanumeric to Numeric conversion MOVE ALPHA-SOURCE TO NUMERIC-DEST. DISPLAY "Alpha to Numeric: " NUMERIC-DEST. *> Decimal to Integer (truncation) MOVE DECIMAL-SOURCE TO INTEGER-DEST. DISPLAY "Decimal to Integer: " INTEGER-DEST. *> Demonstrate padding and truncation MOVE "ABC" TO ALPHA-DEST. *> Left-aligned, right-padded DISPLAY "Short to long: '" ALPHA-DEST "'". MOVE "This is too long" TO ALPHA-DEST. *> Truncated DISPLAY "Long to short: '" ALPHA-DEST "'". STOP RUN.

Special Values and Constants

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
IDENTIFICATION DIVISION. PROGRAM-ID. MOVE-SPECIAL-VALUES. DATA DIVISION. WORKING-STORAGE SECTION. 01 TEXT-FIELD PIC X(20). 01 NUMERIC-FIELD PIC 9(8). 01 SIGNED-FIELD PIC S9(5). PROCEDURE DIVISION. MAIN-PARA. *> Initialize with SPACES MOVE SPACES TO TEXT-FIELD. DISPLAY "SPACES: '" TEXT-FIELD "'". *> Initialize with ZEROS/ZEROES MOVE ZEROS TO NUMERIC-FIELD. DISPLAY "ZEROS: " NUMERIC-FIELD. *> Initialize with HIGH-VALUES MOVE HIGH-VALUES TO TEXT-FIELD. DISPLAY "HIGH-VALUES length: " LENGTH OF TEXT-FIELD. *> Initialize with LOW-VALUES MOVE LOW-VALUES TO TEXT-FIELD. DISPLAY "LOW-VALUES applied". *> Initialize with QUOTES MOVE QUOTES TO TEXT-FIELD. DISPLAY "QUOTES: " TEXT-FIELD(1:5). *> Working with ALL literal MOVE ALL "X" TO TEXT-FIELD. DISPLAY "ALL X: '" TEXT-FIELD "'". MOVE ALL "AB" TO TEXT-FIELD. DISPLAY "ALL AB: '" TEXT-FIELD "'". STOP RUN.

MOVE CORRESPONDING

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
IDENTIFICATION DIVISION. PROGRAM-ID. MOVE-CORRESPONDING. DATA DIVISION. WORKING-STORAGE SECTION. 01 EMPLOYEE-INPUT. 05 EMP-ID PIC 9(8) VALUE 12345678. 05 EMP-NAME PIC X(30) VALUE "Jane Doe". 05 EMP-DEPT PIC X(10) VALUE "SALES". 05 EMP-SALARY PIC 9(6)V99 VALUE 55000.00. 05 EMP-BONUS PIC 9(4)V99 VALUE 2500.00. 01 EMPLOYEE-RECORD. 05 EMP-ID PIC 9(8). 05 EMP-NAME PIC X(25). *> Different size 05 EMP-DEPT PIC X(15). *> Different size 05 EMP-SALARY PIC 9(6)V99. 05 EMP-START-DATE PIC X(10). *> Not in source 05 EMP-STATUS PIC X(6). *> Not in source 01 EMPLOYEE-SUMMARY. 05 EMP-ID PIC 9(8). 05 EMP-NAME PIC X(20). 05 TOTAL-COMP PIC 9(7)V99. PROCEDURE DIVISION. MAIN-PARA. DISPLAY "Original Employee Input:". DISPLAY "ID: " EMP-ID OF EMPLOYEE-INPUT. DISPLAY "Name: " EMP-NAME OF EMPLOYEE-INPUT. DISPLAY "Dept: " EMP-DEPT OF EMPLOYEE-INPUT. DISPLAY "Salary: " EMP-SALARY OF EMPLOYEE-INPUT. *> Move corresponding fields MOVE CORR EMPLOYEE-INPUT TO EMPLOYEE-RECORD. *> Set non-corresponding fields manually MOVE "2024-01-15" TO EMP-START-DATE. MOVE "ACTIVE" TO EMP-STATUS. DISPLAY " ". DISPLAY "Employee Record after MOVE CORR:". DISPLAY "ID: " EMP-ID OF EMPLOYEE-RECORD. DISPLAY "Name: '" EMP-NAME OF EMPLOYEE-RECORD "'". DISPLAY "Dept: '" EMP-DEPT OF EMPLOYEE-RECORD "'". DISPLAY "Salary: " EMP-SALARY OF EMPLOYEE-RECORD. DISPLAY "Start Date: " EMP-START-DATE. DISPLAY "Status: " EMP-STATUS. *> Create summary record MOVE CORR EMPLOYEE-INPUT TO EMPLOYEE-SUMMARY. ADD EMP-SALARY OF EMPLOYEE-INPUT EMP-BONUS OF EMPLOYEE-INPUT GIVING TOTAL-COMP OF EMPLOYEE-SUMMARY. DISPLAY " ". DISPLAY "Employee Summary:". DISPLAY "ID: " EMP-ID OF EMPLOYEE-SUMMARY. DISPLAY "Name: '" EMP-NAME OF EMPLOYEE-SUMMARY "'". DISPLAY "Total Compensation: " TOTAL-COMP OF EMPLOYEE-SUMMARY. STOP RUN.

Advanced MOVE Scenarios

Reference Modification

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
IDENTIFICATION DIVISION. PROGRAM-ID. MOVE-REFERENCE-MOD. DATA DIVISION. WORKING-STORAGE SECTION. 01 FULL-NAME PIC X(30) VALUE "John Michael Smith". 01 FIRST-NAME PIC X(10). 01 MIDDLE-INITIAL PIC X. 01 LAST-NAME PIC X(15). 01 FORMATTED-NAME PIC X(25). 01 PHONE-NUMBER PIC X(14) VALUE "(555) 123-4567". 01 AREA-CODE PIC X(3). 01 EXCHANGE PIC X(3). 01 NUMBER PIC X(4). PROCEDURE DIVISION. MAIN-PARA. DISPLAY "Original: '" FULL-NAME "'". *> Extract parts of the name MOVE FULL-NAME(1:4) TO FIRST-NAME. MOVE FULL-NAME(6:1) TO MIDDLE-INITIAL. MOVE FULL-NAME(14:5) TO LAST-NAME. DISPLAY "First Name: '" FIRST-NAME "'". DISPLAY "Middle Initial: '" MIDDLE-INITIAL "'". DISPLAY "Last Name: '" LAST-NAME "'". *> Build formatted name: Last, First M. STRING FUNCTION TRIM(LAST-NAME) ", " FUNCTION TRIM(FIRST-NAME) " " MIDDLE-INITIAL "." DELIMITED BY SIZE INTO FORMATTED-NAME. DISPLAY "Formatted: '" FORMATTED-NAME "'". *> Extract phone number parts MOVE PHONE-NUMBER(2:3) TO AREA-CODE. *> Skip ( MOVE PHONE-NUMBER(7:3) TO EXCHANGE. *> Skip ) and space MOVE PHONE-NUMBER(11:4) TO NUMBER. *> Skip - DISPLAY "Phone breakdown:". DISPLAY "Area Code: " AREA-CODE. DISPLAY "Exchange: " EXCHANGE. DISPLAY "Number: " NUMBER. STOP RUN.

Group and Elementary Items

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
IDENTIFICATION DIVISION. PROGRAM-ID. MOVE-GROUP-ITEMS. DATA DIVISION. WORKING-STORAGE SECTION. 01 SOURCE-DATE. 05 SRC-YEAR PIC 9(4) VALUE 2024. 05 SRC-MONTH PIC 9(2) VALUE 03. 05 SRC-DAY PIC 9(2) VALUE 15. 01 DEST-DATE. 05 DEST-YEAR PIC 9(4). 05 DEST-MONTH PIC 9(2). 05 DEST-DAY PIC 9(2). 01 FORMATTED-DATE PIC X(10). 01 CUSTOMER-DATA. 05 CUST-ID PIC 9(8) VALUE 12345678. 05 CUST-INFO. 10 CUST-NAME PIC X(25) VALUE "ABC Corporation". 10 CUST-TYPE PIC X(8) VALUE "BUSINESS". 05 CUST-BALANCE PIC 9(8)V99 VALUE 15000.50. 01 BACKUP-CUSTOMER PIC X(49). *> Same size as CUSTOMER-DATA PROCEDURE DIVISION. MAIN-PARA. DISPLAY "Moving group items:". *> Move entire group MOVE SOURCE-DATE TO DEST-DATE. DISPLAY "Dest Year: " DEST-YEAR. DISPLAY "Dest Month: " DEST-MONTH. DISPLAY "Dest Day: " DEST-DAY. *> Move group as alphanumeric MOVE SOURCE-DATE TO FORMATTED-DATE. DISPLAY "Date as string: '" FORMATTED-DATE "'". *> Backup entire customer record MOVE CUSTOMER-DATA TO BACKUP-CUSTOMER. DISPLAY "Customer backed up". *> Modify original MOVE "XYZ Industries" TO CUST-NAME. MOVE 25000.75 TO CUST-BALANCE. *> Restore from backup MOVE BACKUP-CUSTOMER TO CUSTOMER-DATA. DISPLAY "Restored customer: " CUST-NAME. DISPLAY "Restored balance: " CUST-BALANCE. STOP RUN.

Table and Array Operations

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
IDENTIFICATION DIVISION. PROGRAM-ID. MOVE-TABLES. DATA DIVISION. WORKING-STORAGE SECTION. 01 SOURCE-SCORES OCCURS 5 TIMES PIC 9(3). 01 DEST-SCORES OCCURS 5 TIMES PIC 9(3). 01 HIGH-SCORES OCCURS 3 TIMES PIC 9(3). 01 INDEX-VAR PIC 9(2). 01 EMPLOYEE-TABLE. 05 EMPLOYEE-REC OCCURS 3 TIMES. 10 EMP-ID PIC 9(5). 10 EMP-NAME PIC X(20). 10 EMP-SALARY PIC 9(6)V99. 01 TEMP-EMPLOYEE. 05 TEMP-ID PIC 9(5). 05 TEMP-NAME PIC X(20). 05 TEMP-SALARY PIC 9(6)V99. PROCEDURE DIVISION. MAIN-PARA. *> Initialize source scores MOVE 85 TO SOURCE-SCORES(1). MOVE 92 TO SOURCE-SCORES(2). MOVE 78 TO SOURCE-SCORES(3). MOVE 96 TO SOURCE-SCORES(4). MOVE 89 TO SOURCE-SCORES(5). *> Copy all scores PERFORM VARYING INDEX-VAR FROM 1 BY 1 UNTIL INDEX-VAR > 5 MOVE SOURCE-SCORES(INDEX-VAR) TO DEST-SCORES(INDEX-VAR) END-PERFORM. *> Copy top 3 scores MOVE SOURCE-SCORES(2) TO HIGH-SCORES(1). *> 92 MOVE SOURCE-SCORES(4) TO HIGH-SCORES(2). *> 96 MOVE SOURCE-SCORES(5) TO HIGH-SCORES(3). *> 89 DISPLAY "Source scores:". PERFORM VARYING INDEX-VAR FROM 1 BY 1 UNTIL INDEX-VAR > 5 DISPLAY "Score " INDEX-VAR ": " SOURCE-SCORES(INDEX-VAR) END-PERFORM. DISPLAY "High scores:". PERFORM VARYING INDEX-VAR FROM 1 BY 1 UNTIL INDEX-VAR > 3 DISPLAY "High " INDEX-VAR ": " HIGH-SCORES(INDEX-VAR) END-PERFORM. *> Initialize employee table MOVE 10001 TO EMP-ID(1). MOVE "Alice Johnson" TO EMP-NAME(1). MOVE 55000.00 TO EMP-SALARY(1). MOVE 10002 TO EMP-ID(2). MOVE "Bob Smith" TO EMP-NAME(2). MOVE 62000.00 TO EMP-SALARY(2). *> Move table element to working area MOVE EMPLOYEE-REC(1) TO TEMP-EMPLOYEE. DISPLAY "Temp employee: " TEMP-NAME " - $" TEMP-SALARY. STOP RUN.

Data Movement Rules

Source TypeTarget TypeConversion RuleExample
NumericNumericRight-aligned, zero-filled123 → 00123
AlphanumericAlphanumericLeft-aligned, space-filled"ABC" → "ABC "
NumericAlphanumericConvert to characters123 → "123 "
AlphanumericNumericMust contain valid digits"123" → 123
GroupGroupAlphanumeric moveByte-by-byte copy

Common Patterns

Initialization Patterns

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
*> Initialize multiple fields MOVE SPACES TO FIELD1 FIELD2 FIELD3. MOVE ZEROS TO COUNTER1 COUNTER2 TOTAL. *> Initialize structures MOVE SPACES TO CUSTOMER-RECORD. MOVE ZEROS TO NUMERIC-FIELDS. *> Conditional initialization IF FIRST-TIME = 'Y' MOVE SPACES TO WORKING-AREA MOVE ZEROS TO COUNTERS MOVE 'N' TO FIRST-TIME END-IF.

Backup and Restore

cobol
1
2
3
4
5
6
7
8
9
10
*> Backup current record MOVE CUSTOMER-RECORD TO CUSTOMER-BACKUP. *> Process and modify PERFORM PROCESS-CUSTOMER. *> Restore if error IF ERROR-OCCURRED = 'Y' MOVE CUSTOMER-BACKUP TO CUSTOMER-RECORD END-IF.

Best Practices

Do

  • Initialize variables before use
  • Use MOVE CORRESPONDING for structured data
  • Validate data after type conversions
  • Use meaningful field names
  • Consider field size compatibility

Don't

  • Move non-numeric data to numeric fields
  • Assume automatic type validation
  • Ignore truncation in small fields
  • Mix group and elementary moves carelessly
  • Forget about data alignment rules

Related COBOL Statements

  • INITIALIZE - Set fields to default values
  • SET - Assign values to index and pointer items
  • STRING - Concatenate and move character data
  • UNSTRING - Parse and move data fields
  • INSPECT - Examine and replace characters