# Programmeren in COBOL/Embedded SQL

In COBOL kan SQL-code opgenomen worden om gegevens uit databanken te gebruiken en te bewerken. Een voorbeeld is DB2 op mainframe (z/OS). De precompiler haalt alle blokken die beginnen met EXEC SQL en eindigen met END-EXEC eruit, en laat ze door DB2 binden.

## Singleton SELECT

Indien we slechts één rij zullen lezen:
COBOL + embedded SQL-code: Singleton SELECT
De COBOL-variabelen worden in de SQL-statements voorafgegaan door een dubbelpunt. Op dezelfde manier kan een UPDATE of INSERT uitgevoerd worden:
COBOL + embedded SQL-code: Singleton UPDATE
COBOL + embedded SQL-code: Singleton INSERT
Indien je er niet zeker van bent of je slechts één resultaat zal hebben (omdat je niet selecteert op basis van een unieke index (zoals een primaire sleutel), dan kan je gebruik maken van FETCH FIRST ROW ONLY.
COBOL + embedded SQL-code: FETCH FIRST ROW ONLY

## SELECT met CURSOR

Bij meerdere rijen, laat een CURSOR ons toe om de opgevraagde tabel die door het DBMS bijgehouden wordt, rij per rij op te vragen. Zoals bij het werken met bestanden, moet de query geopend (OPEN), gelezen (FETCH) en weer gesloten (CLOSE) worden. Bij OPEN wordt hij in het geheugen geladen en beschikbaar gehouden tot het CLOSE-commando dit geheugen weer vrijmaakt.
COBOL + embedded SQL-code: Meervoudige SELECT
In bovenstaand programma wordt met INCLUDE extra COBOL-code van elders opgehaald door de precompiler. SQLCA (SQL communication area) wordt automatisch door het DBMS gegenereerd en bevat de foutcode SQLCODE en . Een tabeldefinitie kan met een commando (DCLGEN) aangemaakt worden, samen met de declaratie van de gelijknamige overeenkomstige COBOL-variabelen. Dit gegenereerde bestand kan ook met INCLUDE opgehaald worden. Op die manier hoeft de programmeur niet uit te vissen van welk overeenkomstig COBOL-datatype de DB2-variabelen zijn.
COBOL + embedded SQL + embedded SQL-code: leraar-tabel-declaratie (voor INCLUDE)
Hieronder een overzicht van hoe DB2-variabelen kunnen omgezet worden naar COBOL-variabelen:
| SQL-DB2 | COBOL |
| var CHAR(4), | var PIC X(4). |
| SMALLINT, | PIC S9(4) COMP. |
| DECIMAL (9,2), | PIC S9(7)V9(2) COMP-3. |
| var VARCHAR (60), | 01 var. 49 lengte PIC S9(4) COMP. 49 tekst PIC X(60). |
Merk op dat bij een VARCHAR, de overeenkomstige COBOL-variabele opgesplitst wordt in twee level-49 variabelen waarvan de eerst de 2 extra bytes voorstelt die de eigenlijke lengte van het veld bijhouden.

## UPDATE met CURSOR

Het volstaat om FOR UPDATE OF variabele toe te voegen, zodat er een update-lock (U; zie locking) op de tabel geplaatst wordt door DB2. Hierdoor kunnen andere gebruikers niet tegelijkertijd deze rij wijzigen, waardoor inconsistente data zouden ontstaan. Met WHERE CURRENT OF crs kan je dan aanduiden waar er iets moet veranderen.
COBOL + embedded SQL-code: Meervoudige UPDATE

## NULLs

Databanksystemen kennen naast (alfa)numerieke waarden, ook het concept "NULL", met alle problemen van dien (zie driewaardige logica). Bij embedded SQL kan een extra NULL-indicator gedefinieerd worden, die -1 wordt indien er een NULL overgedragen wordt tussen het databanksysteem en COBOL: "01 indicator PIC S9(4) COMP." In een SQL-statement wordt dan de indicator onmiddellijk na de variabele geplaatst (met of zonder spatie ertussen): "... INTO :voornaam:indicator ... "
COBOL + embedded SQL-code: NULL-indicator
COBOL + embedded SQL-code: NULL-indicator-rij
Omdat SQLCODE uit SQLCA van het datatype COMP is, en dus niet toonbaar is, moet je ze eerst overbrengen naar een zelf te definiëren variabele van het type PIC S9(3):
COBOL + embedded SQL-code: NULL-indicator-test

## Dynamische SQL

Sommige programma's moeten telkens een andere SQL-code uitvoeren. Denk maar aan het programma waarmee je SQL leert en verschillende SQL-statements uittest. Met PREPARE kan je een SQL-statement stap voor stap opbouwen; Met IMMEDIATE kan je een SQL-statement onmiddellijk uitvoeren:
COBOL + embedded SQL-code: PREPARE