CODE EXAMPLES

Side-by-Side Implementation

📦 GET THE CODE

All examples are open source and ready to run locally.

📦 DOWNLOAD FROM GITHUB

Example 1: CREATE - Add New Employee

COBOL (11 lines)

CREATE-EMP.cbl
OPEN I-O EMPLOYEE-FILE. MOVE "E001" TO EMP-ID. MOVE "John" TO EMP-FIRST-NAME. MOVE "Smith" TO EMP-LAST-NAME. MOVE "Engineering" TO EMP-DEPARTMENT. MOVE 85000.00 TO EMP-SALARY. MOVE "2020-01-15" TO EMP-HIRE-DATE. WRITE EMPLOYEE-RECORD. IF WS-SUCCESS DISPLAY "Employee created" END-IF. CLOSE EMPLOYEE-FILE.

⚙️ Explicit field-by-field assignment
⚙️ Manual file open/close
⚙️ Status checking required

SQL (2 lines)

create.sql
INSERT INTO employees (id, first_name, last_name, department, salary, hire_date) VALUES ('E001', 'John', 'Smith', 'Engineering', 85000.00, '2020-01-15');

⚡ Single declarative statement
⚡ Automatic constraint validation
⚡ Database handles storage

MongoDB (7 lines)

create.js
db.employees.insertOne({ _id: "E001", firstName: "John", lastName: "Smith", department: "Engineering", salary: 85000, hireDate: new Date("2020-01-15") })

📦 JSON-like structure
📦 Flexible - can add extra fields
📦 Rich data types (Date objects)

Example 2: READ - Find Employee by ID

COBOL

OPEN INPUT EMPLOYEE-FILE.
MOVE "E001" TO EMP-ID.
READ EMPLOYEE-FILE
    KEY IS EMP-ID.
IF WS-SUCCESS
    DISPLAY "Name: "
        EMP-FIRST-NAME
        " " EMP-LAST-NAME
    DISPLAY "Dept: "
        EMP-DEPARTMENT
ELSE IF WS-NOT-FOUND
    DISPLAY "Not found"
END-IF.
CLOSE EMPLOYEE-FILE.

SQL

SELECT
    first_name,
    last_name,
    department,
    salary
FROM employees
WHERE id = 'E001';

MongoDB

emp = db.employees
    .findOne(
        { _id: "E001" }
    )

print(emp.firstName)
print(emp.department)

Example 3: SEARCH - Find by Department

Task: "Find all Engineering employees"

COBOL - Sequential Scan (14 lines)

SEARCH-EMP.cbl
MOVE 0 TO WS-COUNT. OPEN INPUT EMPLOYEE-FILE. PERFORM UNTIL WS-EOF READ EMPLOYEE-FILE NEXT RECORD AT END SET WS-EOF TO TRUE NOT AT END IF EMP-DEPARTMENT = "Engineering" DISPLAY EMP-ID " - " EMP-FIRST-NAME " " EMP-LAST-NAME ADD 1 TO WS-COUNT END-IF END-READ END-PERFORM. DISPLAY "Total found: " WS-COUNT. CLOSE EMPLOYEE-FILE.

SQL - Declarative Query (3 lines)

search.sql
SELECT id, first_name, last_name, salary FROM employees WHERE department = 'Engineering' ORDER BY salary DESC;

MongoDB - Query Document (2 lines)

search.js
db.employees.find({ department: "Engineering" }) .sort({ salary: -1 })

Example 4: UPDATE - Modify Salary

COBOL

OPEN I-O
    EMPLOYEE-FILE.
MOVE "E001" TO EMP-ID.
READ EMPLOYEE-FILE
    KEY IS EMP-ID.
IF WS-SUCCESS
    MOVE 90000.00
        TO EMP-SALARY
    REWRITE
        EMPLOYEE-RECORD
END-IF.
CLOSE EMPLOYEE-FILE.

Read → Modify → Rewrite

SQL

UPDATE employees
SET salary = 90000
WHERE id = 'E001';

Direct update

MongoDB

db.employees.updateOne(
    { _id: "E001" },
    { $set: {
        salary: 90000
    }}
)

Update operators

Example 5: AGGREGATE - Calculate Average Salary

COBOL - Manual Calculation (12 lines)

AGGREGATE-EMP.cbl
MOVE 0 TO WS-TOTAL, WS-COUNT. OPEN INPUT EMPLOYEE-FILE. PERFORM UNTIL WS-EOF READ EMPLOYEE-FILE NEXT RECORD AT END SET WS-EOF TO TRUE NOT AT END ADD EMP-SALARY TO WS-TOTAL ADD 1 TO WS-COUNT END-READ END-PERFORM. DIVIDE WS-TOTAL BY WS-COUNT GIVING WS-AVERAGE ROUNDED. DISPLAY "Average salary: $" WS-AVERAGE. CLOSE EMPLOYEE-FILE.

SQL - Built-in Functions (1 line)

aggregate.sql
SELECT AVG(salary) AS average_salary FROM employees;

MongoDB - Aggregation Pipeline (10 lines)

aggregate.js
db.employees.aggregate([ { $group: { _id: null, avgSalary: { $avg: "$salary" }, totalEmployees: { $sum: 1 }, maxSalary: { $max: "$salary" }, minSalary: { $min: "$salary" } } } ])

Example 6: COMPLEX QUERY - Multiple Conditions

"Engineering employees earning over $80k, hired after 2019"

COBOL

PERFORM UNTIL WS-EOF
    READ EMPLOYEE-FILE
        NEXT RECORD
    AT END
        SET WS-EOF TO TRUE
    NOT AT END
        IF EMP-DEPARTMENT
            = "Engineering"
        AND EMP-SALARY
            > 80000
        AND EMP-HIRE-DATE
            > "2019-12-31"
            DISPLAY EMP-ID
                " - "
                EMP-FIRST-NAME
        END-IF
    END-READ
END-PERFORM.

SQL

SELECT
    id,
    first_name,
    last_name,
    salary
FROM employees
WHERE
    department = 'Engineering'
    AND salary > 80000
    AND hire_date > '2019-12-31'
ORDER BY
    hire_date DESC;

MongoDB

db.employees.find({
    department: "Engineering",
    salary: { $gt: 80000 },
    hireDate: {
        $gt: new Date(
            "2019-12-31"
        )
    }
}).sort({
    hireDate: -1
})

Example 7: GROUP BY Department

COBOL - Control Break Logic (~25 lines)

Requires sorted file first
* Requires file sorted by department MOVE SPACES TO WS-CURRENT-DEPT. PERFORM UNTIL WS-EOF READ EMPLOYEE-FILE NEXT RECORD AT END SET WS-EOF TO TRUE PERFORM PRINT-DEPT-STATS NOT AT END IF EMP-DEPARTMENT NOT = WS-CURRENT-DEPT IF WS-CURRENT-DEPT NOT = SPACES PERFORM PRINT-DEPT-STATS END-IF MOVE EMP-DEPARTMENT TO WS-CURRENT-DEPT MOVE 0 TO WS-DEPT-COUNT, WS-DEPT-TOTAL END-IF ADD 1 TO WS-DEPT-COUNT ADD EMP-SALARY TO WS-DEPT-TOTAL END-READ END-PERFORM. PRINT-DEPT-STATS. DIVIDE WS-DEPT-TOTAL BY WS-DEPT-COUNT GIVING WS-DEPT-AVERAGE. DISPLAY WS-CURRENT-DEPT ": " WS-DEPT-COUNT " employees, avg $" WS-DEPT-AVERAGE.

SQL - Built-in GROUP BY (5 lines)

aggregate.sql
SELECT department, COUNT(*) as employee_count, AVG(salary) as avg_salary FROM employees GROUP BY department ORDER BY avg_salary DESC;

MongoDB - $group Pipeline (10 lines)

aggregate.js
db.employees.aggregate([ { $group: { _id: "$department", employeeCount: { $sum: 1 }, avgSalary: { $avg: "$salary" } } }, { $sort: { avgSalary: -1 } } ])

📊 CODE COMPLEXITY SUMMARY

Operation COBOL Lines SQL Lines MongoDB Lines Winner
Create Record 11 2 🏆 7 SQL
Find by ID 9 2 1 🏆 MongoDB
Search 14 3 2 🏆 MongoDB
Update 12 2 🏆 4 SQL
Calculate Avg 12 1 🏆 10 SQL
Group By 25 5 🏆 10 SQL

SQL wins on conciseness for set-based operations!

📚 EXPLORE MORE

🏠 HOME 📖 INTRODUCTION ⚖️ COMPARISON 🚨 ANTI-PATTERNS 💎 CONCLUSIONS