Integration
Migrate legacy mainframe VSAM student records into Ellucian Banner via COBOL copybook parsing, data validation, and Banner API bulk loading.
This engagement migrates student enrollment, program, and historical academic data from a legacy IBM mainframe running COBOL programs against VSAM (Indexed Sequential) files into Ellucian Banner's Oracle-based data model. The project begins with reverse-engineering COBOL copybook definitions (FD entries, REDEFINES clauses, OCCURS DEPENDING ON statements) to build authoritative field mappings for Banner's STUDENTS, SGASTDN, SARADAP, and SHATERM tables.
The transformation layer handles EBCDIC-to-ASCII character conversion, packed-decimal (COMP-3) decoding, and date canonicalization from legacy Julian or 6-digit formats into Banner's Gregorian standards. A staging schema is used for dual-write validation before final cutover.
The hardest part is preserving relational integrity when migrating historical registrations and grades across term boundaries while Banner's triggers, sequences, and shared key constraints are enforced — particularly when legacy IDs must be cross-referenced with Banner's generated surrogate keys.
A working piece from this integration — no sign-up. The full build handles the edge cases, safeguards, and cutover.
/* COBOL Copybook: STUDENT-REC copybook defines VSAM input layout */
01 STUDENT-REC.
05 S-ID PIC X(09).
05 S-LAST-NAME PIC X(30).
05 S-FIRST-NAME PIC X(20).
05 S-DOB PIC 9(08) COMP-3.
05 S-SSN PIC X(11).
05 S-ETHNIC-CODE PIC X(02).
05 S-ADMIT-TERM PIC 9(06).
05 S-PROGRAM-CODE PIC X(08).
/* Banner STVETHN (ethnicity), SGBSTDN (student base), SPRIDEN (person) */
/* Step 1: JCL to unload VSAM to sequential with Cobol copybook */
//STEP1 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//OUTFILE DD DSN=HLQ.VSAM.OUTPUT,DISP=(NEW,PASS),RECFM=FB,LRECL=94
//SYSIN DD *
REPRO INFILE(VSAM.IN) OUTFILE(OUTFILE)
/* Step 2: Batch load control file for Banner SQL*Loader equivalent */
LOAD DATA
INFILE 'student_vsam.dat' "str '\n'"
INTO TABLE GLBEXTR APPEND
FIELDS TERMINATED BY '|'
TRAILING NULLCOLS
(
GLBEXTR_PIDM CONSTANT -1,
GLBEXTR_TABLE_NAME CONSTANT 'SPRIDEN',
GLBEXTR_COLUMN_NAME CONSTANT 'SPRIDEN_SURID',
GLBEXTR_SEQ_NUM SEQUENCE (MAX,1),
GLBEXTR_VALUE CHAR,
GLBEXTR_USER_ID CONSTANT 'MIGRATION',
GLBEXTR_ACTIVITY_DATE SYSDATE
)
/* Step 3: Field mapping table for SPRIDEN population */
/* VSAM Byte Offset → Banner Column → Transform Logic */| VSAM Position | COBOL Field | Banner Table.Column | Transform |
|---|---|---|---|
| 1-9 | S-ID | SPRIDEN.SPRIDEN_SURID | Trim, Uppercase |
| 10-39 | S-LAST-NAME | SPRIDEN.SPRIDEN_LAST_NAME | Proper case |
| 40-59 | S-FIRST-NAME | SPRIDEN.SPRIDEN_FIRST_NAME | Proper case |
| 64-71 | S-DOB | SPRIDEN.SPRIDEN_BIRTH_DATE | TO_DATE(:raw, 'YYYYMMDD') |
| 72-82 | S-SSN | SPRIDEN.SPRIDEN_SSN | SSNCRYPT function |
| 83-84 | S-ETHNIC-CODE | STVETHN.STVETHN_CODE | Join lookup, default 'UK' |
| 85-90 | S-ADMIT-TERM | SGBSTDN.SGBSTDN_TERM_CODE_EFF | Direct map |
| 91-98 | S-PROGRAM-CODE | SORLCUR.SORLCUR_PROGRAM | Match STVPROG |
How we'd take this from discovery to a production-safe cutover — the phases, the canonical mapping, and the edge cases that bite.
Migrating legacy mainframe student records from VSAM into Ellucian Banner requires parsing COBOL copybook record layouts, transforming packed-decimal and date formats, and loading through Banner's staging infrastructure. The following pathway assumes VSAM KSDS files keyed on student ID with sequential extraction to an intermediate dataset, Banner 8 or 9 on Oracle, and the use of Banner's SDBSTDN staging tables for student term data.
BNKSTU or equivalent import utility to populate Banner staging tables (e.g., SDBSTDN, SDBADDR). Disable Banner triggers and rule-based validation during bulk load, then re-enable for post-load checks. Load addresses before students due to referential integrity.| VSAM / COBOL Field | Description | Banner Target Table | Banner Column | Notes |
|---|---|---|---|---|
STU-ID |
Student identifier (9-digit alphanumeric) | SPBPERS |
SPBPERS_SPRIDEN_ID |
Join via SPRIDEN for canonical ID; strip leading zeros or pad as needed |
STU-LAST-NAME |
Family name (25-char alphanumeric) | SPBPERS |
SPBPERS_LAST_NAME |
Trim trailing spaces; uppercase required |
STU-DATE-BIRTH (COMP-3) |
Packed-decimal Julian date CYYDDD | SPBPERS |
SPBPERS_BIRTH_DATE |
Convert CYYDDD → Oracle DATE using custom function; century flag handles 1900/2000 |
STU-ADDR-LINE-1 (OCCURS 2) |
Mailing address lines | SPRADDR |
SPRADDR_STREET_LINE1 / _LINE2 |
First occurrence maps to LINE1; second to LINE2; null-fill absent occurrences |
STU-TERM-CODE |
Enrollment term (e.g., 202410) | SGBSTDN |
SGBSTDN_TERM_CODE |
Must exist in STVTERM; verify term type (fall/spring/short) matches enrollment record |
STU-ETHNIC-CODE |
Legacy ethnicity indicator (1-char) | GORPRGE |
GORPRGE_ETAT_CODE |
Map legacy code to Banner ETHNICITY_TERM; insert one row per race category; handle "U" (unknown) |
STU-STATUS (COMP-3) |
Active/graduated/dropped code | SGBSTDN |
SGBSTDN_STST_CODE |
Map mainframe status codes (A=active, G=graduated, D=dropped) to Banner STST_CODE values; verify STVSTST contains target codes |
SPBPERS, SPRADDR, SGBSTDN, GORPRGE) using expdp with FLASHBACK_SCN. Retain the VSAM cluster backup on tape for 90 days. Execute the final incremental extraction immediately before the load; apply the same staged validation pipeline. Upon successful post-load reconciliation (record counts within 0.01% tolerance, 100% of sampled fields match source), promote the staging records from a shadow schema to the production Banner owner. If a rollback is required, drop and re-import the pre-migration snapshot; re-enable VSAM as the system of record and resynchronize any updates that occurred during the window. Schedule a post-cutover job to rebuild any Banner-derived summary tables (e.g., enrollment aggregates) that are not automatically refreshed by triggers. Reading the reference is free. Delivering it under liability — with the safeguards that keep production running through the cutover — is what we do.