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.
Use parentheses to override default precedence and make complex expressions clear.
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.
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.
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.
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.
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.
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.
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.
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.
| Condition A | Condition B | A OR B | A AND B | NOT A |
|---|---|---|---|---|
| TRUE | TRUE | TRUE | TRUE | FALSE |
| TRUE | FALSE | TRUE | FALSE | FALSE |
| FALSE | TRUE | TRUE | FALSE | TRUE |
| FALSE | FALSE | FALSE | FALSE | TRUE |
Multiple valid status values
IF STATUS = "A" OR STATUS = "P"Multiple error conditions
IF ERROR-CODE = "01" OR ERROR-CODE = "02"Value outside acceptable range
IF VALUE < MIN-VAL OR VALUE > MAX-VALMultiple valid processing paths
IF MODE = "AUTO" OR MODE = "MANUAL"Logical AND for all conditions true
Logical negation operator
Conditional execution structure
Condition names for readable logic