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-VAL
Multiple 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