OR

Overview

The OR operator in COBOL is a logical operator used to combine multiple conditions where at least one condition must be true for the entire expression to evaluate to true. It's essential for creating flexible conditional logic, implementing alternative validation rules, and building complex business logic that accommodates multiple valid scenarios.

Logical Precedence

Operator Precedence Order

  1. 1. NOT (highest precedence)
  2. 2. AND
  3. 3. OR (lowest precedence)

Use parentheses to override default precedence and make complex expressions clear.

Basic OR Operations

Simple OR Conditions

DATA DIVISION.
WORKING-STORAGE SECTION.
01  WS-CUSTOMER-DATA.
    05  WS-CUSTOMER-TYPE    PIC X(10).
    05  WS-ACCOUNT-STATUS   PIC X(8).
    05  WS-BALANCE          PIC S9(8)V99.
    05  WS-CREDIT-RATING    PIC X(5).

PROCEDURE DIVISION.
BASIC-OR-EXAMPLES.
    *> Check if customer is VIP or Premium
    IF WS-CUSTOMER-TYPE = "VIP" OR WS-CUSTOMER-TYPE = "PREMIUM"
        DISPLAY "PRIORITY CUSTOMER DETECTED"
        PERFORM PRIORITY-PROCESSING
    END-IF.
    
    *> Check for inactive account statuses
    IF WS-ACCOUNT-STATUS = "CLOSED" OR 
       WS-ACCOUNT-STATUS = "SUSPENDED" OR
       WS-ACCOUNT-STATUS = "FROZEN"
        DISPLAY "ACCOUNT IS INACTIVE"
        PERFORM INACTIVE-ACCOUNT-HANDLING
    END-IF.
    
    *> Check for high-value customer conditions
    IF WS-BALANCE > 100000 OR WS-CREDIT-RATING = "AAA"
        DISPLAY "HIGH-VALUE CUSTOMER"
        PERFORM SPECIAL-OFFERS
    END-IF.
    
    *> Multiple validation criteria
    IF WS-CUSTOMER-TYPE = SPACES OR 
       WS-ACCOUNT-STATUS = SPACES OR
       WS-BALANCE < 0
        DISPLAY "CUSTOMER DATA VALIDATION FAILED"
        PERFORM ERROR-HANDLING
    END-IF.

Basic OR operations for simple conditional logic.

OR with Class Tests

DATA DIVISION.
WORKING-STORAGE SECTION.
01  WS-INPUT-VALIDATION.
    05  WS-USER-INPUT       PIC X(20).
    05  WS-ALTERNATE-INPUT  PIC X(20).
    05  WS-VALIDATION-FLAG  PIC X VALUE 'N'.

PROCEDURE DIVISION.
VALIDATE-INPUT-DATA.
    *> Accept numeric input from either field
    IF WS-USER-INPUT NUMERIC OR WS-ALTERNATE-INPUT NUMERIC
        DISPLAY "NUMERIC INPUT FOUND"
        MOVE 'Y' TO WS-VALIDATION-FLAG
    ELSE
        DISPLAY "NO NUMERIC INPUT PROVIDED"
        MOVE 'N' TO WS-VALIDATION-FLAG
    END-IF.
    
    *> Check for any alphabetic input
    IF WS-USER-INPUT ALPHABETIC OR WS-ALTERNATE-INPUT ALPHABETIC
        DISPLAY "ALPHABETIC INPUT DETECTED"
        PERFORM PROCESS-TEXT-INPUT
    END-IF.
    
    *> Validate non-empty input
    IF WS-USER-INPUT NOT = SPACES OR WS-ALTERNATE-INPUT NOT = SPACES
        DISPLAY "INPUT PROVIDED"
        PERFORM PROCESS-AVAILABLE-INPUT
    ELSE
        DISPLAY "NO INPUT PROVIDED"
        PERFORM REQUEST-INPUT
    END-IF.

Using OR with class tests for flexible validation.

Complex OR Expressions

Mixed Logical Operators

DATA DIVISION.
WORKING-STORAGE SECTION.
01  WS-TRANSACTION-DATA.
    05  WS-TRANS-TYPE       PIC X(8).
    05  WS-TRANS-AMOUNT     PIC 9(8)V99.
    05  WS-CUSTOMER-TYPE    PIC X(10).
    05  WS-APPROVAL-LEVEL   PIC 9.
    05  WS-BUSINESS-HOURS   PIC X VALUE 'Y'.

PROCEDURE DIVISION.
COMPLEX-AUTHORIZATION-LOGIC.
    *> Complex approval logic with mixed operators
    IF (WS-TRANS-TYPE = "PAYMENT" OR WS-TRANS-TYPE = "TRANSFER") AND
       (WS-TRANS-AMOUNT <= 5000 OR 
        (WS-CUSTOMER-TYPE = "VIP" AND WS-APPROVAL-LEVEL >= 3))
        DISPLAY "TRANSACTION PRE-APPROVED"
        PERFORM AUTO-PROCESS-TRANSACTION
    ELSE
        DISPLAY "MANUAL APPROVAL REQUIRED"
        PERFORM QUEUE-FOR-APPROVAL
    END-IF.
    
    *> Emergency processing conditions
    IF WS-TRANS-TYPE = "EMERGENCY" OR
       (WS-TRANS-TYPE = "MEDICAL" AND WS-CUSTOMER-TYPE = "PRIORITY") OR
       (NOT WS-BUSINESS-HOURS AND WS-APPROVAL-LEVEL = 9)
        DISPLAY "EMERGENCY PROCESSING ACTIVATED"
        PERFORM EMERGENCY-AUTHORIZATION
    END-IF.
    
    *> Risk assessment with multiple criteria
    IF (WS-TRANS-AMOUNT > 10000 OR WS-CUSTOMER-TYPE = "NEW") AND
       (WS-TRANS-TYPE = "WITHDRAWAL" OR WS-TRANS-TYPE = "WIRE") AND
       NOT (WS-APPROVAL-LEVEL >= 5 OR WS-CUSTOMER-TYPE = "VERIFIED")
        DISPLAY "HIGH RISK TRANSACTION DETECTED"
        PERFORM ENHANCED-VERIFICATION
    END-IF.

Complex expressions combining OR with AND and NOT operators.

Nested Conditions with Parentheses

DATA DIVISION.
WORKING-STORAGE SECTION.
01  WS-ELIGIBILITY-DATA.
    05  WS-AGE              PIC 99.
    05  WS-INCOME           PIC 9(8)V99.
    05  WS-CREDIT-SCORE     PIC 999.
    05  WS-EMPLOYMENT-TYPE  PIC X(15).
    05  WS-YEARS-EMPLOYED   PIC 99.

PROCEDURE DIVISION.
DETERMINE-LOAN-ELIGIBILITY.
    *> Complex eligibility with grouped conditions
    IF (WS-AGE >= 18 AND WS-AGE <= 65) AND
       ((WS-INCOME >= 50000 AND WS-CREDIT-SCORE >= 650) OR
        (WS-INCOME >= 75000 AND WS-CREDIT-SCORE >= 600) OR
        (WS-EMPLOYMENT-TYPE = "GOVERNMENT" AND WS-YEARS-EMPLOYED >= 5))
        DISPLAY "LOAN ELIGIBILITY: APPROVED"
        PERFORM CALCULATE-LOAN-TERMS
    ELSE
        DISPLAY "LOAN ELIGIBILITY: DENIED"
        PERFORM PROVIDE-ALTERNATIVES
    END-IF.
    
    *> Special program eligibility
    IF (WS-CREDIT-SCORE >= 750 OR 
        (WS-CREDIT-SCORE >= 700 AND WS-INCOME >= 100000)) AND
       (WS-EMPLOYMENT-TYPE = "PERMANENT" OR 
        WS-EMPLOYMENT-TYPE = "GOVERNMENT" OR
        (WS-EMPLOYMENT-TYPE = "CONTRACT" AND WS-YEARS-EMPLOYED >= 3))
        DISPLAY "SPECIAL PROGRAM ELIGIBILITY: QUALIFIED"
        PERFORM OFFER-PREMIUM-RATES
    END-IF.
    
    *> Risk category assessment
    IF (WS-CREDIT-SCORE < 600 OR WS-INCOME < 30000) OR
       (WS-EMPLOYMENT-TYPE = "TEMPORARY" OR WS-YEARS-EMPLOYED < 1) OR
       (WS-AGE < 21 OR WS-AGE > 60)
        DISPLAY "RISK CATEGORY: HIGH"
        PERFORM HIGH-RISK-PROCESSING
    ELSE IF (WS-CREDIT-SCORE < 700 OR WS-INCOME < 60000) OR
            (WS-EMPLOYMENT-TYPE = "CONTRACT")
        DISPLAY "RISK CATEGORY: MEDIUM"
        PERFORM MEDIUM-RISK-PROCESSING
    ELSE
        DISPLAY "RISK CATEGORY: LOW"
        PERFORM LOW-RISK-PROCESSING
    END-IF.

Using parentheses to control precedence in complex OR expressions.

OR in Business Logic

Status Checking and Validation

DATA DIVISION.
WORKING-STORAGE SECTION.
01  WS-ACCOUNT-INFO.
    05  WS-ACCOUNT-STATUS   PIC X(10).
    05  WS-PAYMENT-STATUS   PIC X(10).
    05  WS-LAST-ACTIVITY    PIC 9(8).
    05  WS-BALANCE          PIC S9(8)V99.

01  WS-SYSTEM-CONTROLS.
    05  WS-MAINTENANCE-MODE PIC X VALUE 'N'.
    05  WS-EMERGENCY-MODE   PIC X VALUE 'N'.
    05  WS-READONLY-MODE    PIC X VALUE 'N'.

PROCEDURE DIVISION.
CHECK-ACCOUNT-ACCESSIBILITY.
    *> Account is accessible if it's active or pending
    IF WS-ACCOUNT-STATUS = "ACTIVE" OR 
       WS-ACCOUNT-STATUS = "PENDING" OR
       WS-ACCOUNT-STATUS = "REVIEW"
        DISPLAY "ACCOUNT IS ACCESSIBLE"
        PERFORM NORMAL-ACCOUNT-OPERATIONS
    ELSE
        DISPLAY "ACCOUNT ACCESS RESTRICTED"
        DISPLAY "STATUS: " WS-ACCOUNT-STATUS
        PERFORM RESTRICTED-ACCESS-HANDLING
    END-IF.
    
    *> Payment processing availability
    IF WS-PAYMENT-STATUS = "CURRENT" OR
       WS-PAYMENT-STATUS = "GRACE" OR
       (WS-PAYMENT-STATUS = "LATE" AND WS-BALANCE > 0)
        DISPLAY "PAYMENT PROCESSING AVAILABLE"
        PERFORM ENABLE-PAYMENT-OPTIONS
    ELSE
        DISPLAY "PAYMENT PROCESSING RESTRICTED"
        PERFORM PAYMENT-RESTRICTION-NOTICE
    END-IF.

CHECK-SYSTEM-AVAILABILITY.
    *> System is unavailable in certain modes
    IF WS-MAINTENANCE-MODE = 'Y' OR 
       WS-EMERGENCY-MODE = 'Y' OR
       WS-READONLY-MODE = 'Y'
        
        DISPLAY "SYSTEM AVAILABILITY LIMITED"
        
        IF WS-MAINTENANCE-MODE = 'Y'
            DISPLAY "  REASON: MAINTENANCE MODE"
            PERFORM MAINTENANCE-MESSAGE
        END-IF
        
        IF WS-EMERGENCY-MODE = 'Y'
            DISPLAY "  REASON: EMERGENCY MODE"
            PERFORM EMERGENCY-MESSAGE
        END-IF
        
        IF WS-READONLY-MODE = 'Y'
            DISPLAY "  REASON: READ-ONLY MODE"
            PERFORM READONLY-MESSAGE
        END-IF
        
        PERFORM LIMITED-OPERATIONS
    ELSE
        DISPLAY "SYSTEM FULLY OPERATIONAL"
        PERFORM FULL-OPERATIONS
    END-IF.

Business logic using OR for status and availability checks.

Exception and Error Handling

DATA DIVISION.
WORKING-STORAGE SECTION.
01  WS-ERROR-CONDITIONS.
    05  WS-FILE-STATUS      PIC XX.
    05  WS-NETWORK-STATUS   PIC XX.
    05  WS-DATABASE-STATUS  PIC XX.
    05  WS-MEMORY-STATUS    PIC XX.

01  WS-RETRY-CONTROLS.
    05  WS-RETRY-COUNT      PIC 99 VALUE 0.
    05  WS-MAX-RETRIES      PIC 99 VALUE 3.

PROCEDURE DIVISION.
HANDLE-SYSTEM-ERRORS.
    *> Check for any critical system errors
    IF WS-FILE-STATUS = "30" OR WS-FILE-STATUS = "35" OR
       WS-NETWORK-STATUS = "99" OR 
       WS-DATABASE-STATUS = "FAIL" OR
       WS-MEMORY-STATUS = "LOW"
        
        DISPLAY "CRITICAL SYSTEM ERROR DETECTED"
        PERFORM DETERMINE-ERROR-TYPE
        PERFORM INITIATE-RECOVERY-PROCEDURES
    END-IF.
    
    *> Recoverable error conditions
    IF WS-FILE-STATUS = "37" OR WS-FILE-STATUS = "39" OR
       WS-NETWORK-STATUS = "TIMEOUT" OR
       WS-DATABASE-STATUS = "BUSY"
        
        IF WS-RETRY-COUNT < WS-MAX-RETRIES
            ADD 1 TO WS-RETRY-COUNT
            DISPLAY "RECOVERABLE ERROR - RETRY " WS-RETRY-COUNT
            PERFORM WAIT-AND-RETRY
        ELSE
            DISPLAY "MAX RETRIES EXCEEDED"
            PERFORM ESCALATE-ERROR
        END-IF
    END-IF.

DETERMINE-ERROR-TYPE.
    IF WS-FILE-STATUS = "30" OR WS-FILE-STATUS = "35"
        DISPLAY "  ERROR TYPE: FILE ACCESS"
        PERFORM FILE-ERROR-RECOVERY
    END-IF.
    
    IF WS-NETWORK-STATUS = "99"
        DISPLAY "  ERROR TYPE: NETWORK FAILURE"
        PERFORM NETWORK-ERROR-RECOVERY
    END-IF.
    
    IF WS-DATABASE-STATUS = "FAIL"
        DISPLAY "  ERROR TYPE: DATABASE CONNECTION"
        PERFORM DATABASE-ERROR-RECOVERY
    END-IF.
    
    IF WS-MEMORY-STATUS = "LOW"
        DISPLAY "  ERROR TYPE: MEMORY SHORTAGE"
        PERFORM MEMORY-ERROR-RECOVERY
    END-IF.

Using OR for comprehensive error condition checking.

OR with Condition Names

88-Level Conditions

DATA DIVISION.
WORKING-STORAGE SECTION.
01  WS-TRANSACTION-PROCESSING.
    05  WS-TRANS-STATUS     PIC X(10).
        88  TRANS-PENDING   VALUE "PENDING".
        88  TRANS-APPROVED  VALUE "APPROVED".
        88  TRANS-REJECTED  VALUE "REJECTED".
        88  TRANS-CANCELLED VALUE "CANCELLED".
        88  TRANS-PROCESSING VALUE "PENDING" "APPROVED".
        88  TRANS-COMPLETED VALUE "APPROVED" "REJECTED" "CANCELLED".
    
    05  WS-CUSTOMER-LEVEL   PIC X(8).
        88  CUSTOMER-VIP    VALUE "VIP".
        88  CUSTOMER-GOLD   VALUE "GOLD".
        88  CUSTOMER-SILVER VALUE "SILVER".
        88  CUSTOMER-PREMIUM VALUE "VIP" "GOLD".
        88  CUSTOMER-VALUED VALUE "VIP" "GOLD" "SILVER".

PROCEDURE DIVISION.
PROCESS-WITH-CONDITIONS.
    *> Check if transaction can be processed
    IF TRANS-PENDING OR TRANS-APPROVED
        DISPLAY "TRANSACTION IS PROCESSABLE"
        PERFORM PROCESS-TRANSACTION
    END-IF.
    
    *> Alternative syntax using condition names
    IF TRANS-PROCESSING
        DISPLAY "TRANSACTION IN PROCESSING STATE"
        PERFORM MONITOR-PROGRESS
    END-IF.
    
    *> Customer level checking
    IF CUSTOMER-VIP OR CUSTOMER-GOLD
        DISPLAY "PREMIUM CUSTOMER DETECTED"
        PERFORM PREMIUM-SERVICE
    END-IF.
    
    *> Using predefined condition name
    IF CUSTOMER-PREMIUM
        DISPLAY "PREMIUM CUSTOMER (USING CONDITION NAME)"
        PERFORM PREMIUM-SERVICE
    END-IF.
    
    *> Complex condition combinations
    IF (TRANS-APPROVED OR TRANS-PENDING) AND CUSTOMER-VALUED
        DISPLAY "VALUED CUSTOMER WITH ACTIVE TRANSACTION"
        PERFORM PRIORITY-PROCESSING
    END-IF.

Using OR with 88-level condition names for readable code.

Performance Considerations

Short-Circuit Evaluation

DATA DIVISION.
WORKING-STORAGE SECTION.
01  WS-PERFORMANCE-DATA.
    05  WS-EXPENSIVE-CHECK  PIC X VALUE 'N'.
    05  WS-QUICK-CHECK      PIC X VALUE 'N'.
    05  WS-FUNCTION-RESULT  PIC 9(6).

PROCEDURE DIVISION.
OPTIMIZED-OR-CONDITIONS.
    *> Place most likely true condition first for efficiency
    IF WS-QUICK-CHECK = 'Y' OR WS-EXPENSIVE-CHECK = 'Y'
        DISPLAY "CONDITION MET - QUICK CHECK FIRST"
        PERFORM PROCESS-RESULT
    END-IF.
    
    *> Order conditions by probability of being true
    IF WS-CUSTOMER-TYPE = "STANDARD" OR      *> Most common (80%)
       WS-CUSTOMER-TYPE = "PREMIUM" OR       *> Less common (15%)
       WS-CUSTOMER-TYPE = "VIP"              *> Rare (5%)
        PERFORM CUSTOMER-PROCESSING
    END-IF.
    
    *> Avoid expensive operations when possible
    IF WS-SIMPLE-FLAG = 'Y' OR 
       (WS-COMPLEX-FLAG = 'Y' AND EXPENSIVE-FUNCTION() = 100)
        PERFORM CONDITIONAL-PROCESSING
    END-IF.

EXPENSIVE-FUNCTION.
    *> Simulate expensive computation
    PERFORM VARYING WS-INDEX FROM 1 BY 1 UNTIL WS-INDEX > 1000
        COMPUTE WS-FUNCTION-RESULT = WS-FUNCTION-RESULT + WS-INDEX
    END-PERFORM.
    DIVIDE WS-FUNCTION-RESULT BY 1000 GIVING WS-FUNCTION-RESULT.

Optimizing OR conditions for better performance.

Truth Tables and Logic

Condition ACondition BA OR BA AND BNOT A
TRUETRUETRUETRUEFALSE
TRUEFALSETRUEFALSEFALSE
FALSETRUETRUEFALSETRUE
FALSEFALSEFALSEFALSETRUE

Best Practices

  • Use parentheses to clarify complex OR expressions
  • Place most likely true conditions first for performance
  • Use condition names (88-level) for better readability
  • Document complex logical expressions with comments
  • Avoid deeply nested OR conditions - break into separate IF statements when needed

Common Patterns

Status Validation

Multiple valid status values

IF STATUS = "A" OR STATUS = "P"

Error Detection

Multiple error conditions

IF ERROR-CODE = "01" OR ERROR-CODE = "02"

Range Checking

Value outside acceptable range

IF VALUE < MIN-VAL OR VALUE > MAX-VAL

Alternative Processing

Multiple valid processing paths

IF MODE = "AUTO" OR MODE = "MANUAL"

Related Concepts

AND Operator

Logical AND for all conditions true

NOT Operator

Logical negation operator

IF Statement

Conditional execution structure

88-Level Items

Condition names for readable logic