Side-by-Side Implementation
All examples are open source and ready to run locally.
📦 DOWNLOAD FROM GITHUBCREATE-EMP.cblOPEN 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
create.sqlINSERT 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
create.jsdb.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)
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.
SELECT
first_name,
last_name,
department,
salary
FROM employees
WHERE id = 'E001';
emp = db.employees
.findOne(
{ _id: "E001" }
)
print(emp.firstName)
print(emp.department)
Task: "Find all Engineering employees"
SEARCH-EMP.cblMOVE 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.
search.sqlSELECT id, first_name, last_name, salary FROM employees WHERE department = 'Engineering' ORDER BY salary DESC;
search.jsdb.employees.find({ department: "Engineering" }) .sort({ salary: -1 })
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
UPDATE employees
SET salary = 90000
WHERE id = 'E001';
Direct update
db.employees.updateOne(
{ _id: "E001" },
{ $set: {
salary: 90000
}}
)
Update operators
AGGREGATE-EMP.cblMOVE 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.
aggregate.sqlSELECT AVG(salary) AS average_salary FROM employees;
aggregate.jsdb.employees.aggregate([ { $group: { _id: null, avgSalary: { $avg: "$salary" }, totalEmployees: { $sum: 1 }, maxSalary: { $max: "$salary" }, minSalary: { $min: "$salary" } } } ])
"Engineering employees earning over $80k, hired after 2019"
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.
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;
db.employees.find({
department: "Engineering",
salary: { $gt: 80000 },
hireDate: {
$gt: new Date(
"2019-12-31"
)
}
}).sort({
hireDate: -1
})
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.
aggregate.sqlSELECT department, COUNT(*) as employee_count, AVG(salary) as avg_salary FROM employees GROUP BY department ORDER BY avg_salary DESC;
aggregate.jsdb.employees.aggregate([ { $group: { _id: "$department", employeeCount: { $sum: 1 }, avgSalary: { $avg: "$salary" } } }, { $sort: { avgSalary: -1 } } ])
| 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!