Programmeren in COBOL/Embedded SQL: verschil tussen versies

Verwijderde inhoud Toegevoegde inhoud
Pagina aangemaakt: "{{Programmeren in COBOL}} In COBOL kan SQL-code opgenomen worden om gegevens uit databanken te gebruiken en te bewerken. Een voorbeeld is DB2 ..."
 
singleton UPDATE + singleton INSERT + FETCH FIRST ROW ONLY + omzetting DB2->COBOL-variabelen + UPDATE met CURSOR + SQLCODE
Regel 3:
 
==Singleton SELECT==
Indien we slechts '''één''' rij zullen lezen:
{{code
|Taal=COBOL + embedded SQL
|Titel=Singleton SELECT
|Code=<pre>
Regel 21:
ACCEPT studid
EXEC SQL
SELECT achtern INTO :achternaam
FROM leerlingen
WHERE sid = :studid
END-EXEC
DISPLAY "De gezochte persoon heeft als achternaam " achternaam
Regel 28 ⟶ 29:
</pre>
}}
De COBOL-variabelen worden in de SQL-statements voorafgegaan door een dubbelpunt. Op dezelfde manier kan een UPDATE of INSERT uitgevoerd worden:
{{code
 
|Taal=COBOL + embedded SQL
==CURSOR==
|Titel=Singleton UPDATE
Bij meerdere rijen, laat een CURSOR ons toe om de opgevraagde tabel die door het [[w:DBMS|DBMS]] bijgehouden wordt, rij per rij op te vragen. Next zoals bij het werken met bestanden, moet de query geopend (OPEN), gelezen (FETCH) en weer gesloten (CLOSE) worden.
|Code=<pre>
EXEC SQL
UPDATE leerlingen
SET achtern = :achternaam
WHERE sid = :studid
END-EXEC
</pre>
}}
{{code
|Taal=COBOL + embedded SQL
|Titel=Singleton INSERT
|Code=<pre>
EXEC SQL
INSERT
INTO leerlingen (sid, achtern)
VALUES (:studid, :achternaam)
END-EXEC
</pre>
}}
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'''.
{{code
|Taal=COBOL + embedded SQL
|Titel=FETCH FIRST ROW ONLY
|Code=<pre>
EXEC SQL
SELECT achtern INTO :achternaam
FROM leerlingen
WHERE sid = :studid
FETCH FIRST ROW ONLY
END-EXEC
</pre>
}}
 
==SELECT met CURSOR==
Bij '''meerdere''' rijen, laat een CURSOR ons toe om de opgevraagde tabel die door het [[w:DBMS|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.
{{code
|Taal=COBOL + embedded SQL
|Titel=Meervoudige SELECT
|Code=<pre>
Regel 51 ⟶ 86:
EXEC SQL
DECLARE crs CURSOR FOR
SELECT voorn
FROM leraars
WHERE vak = 'WISKUNDE'
END-EXEC.
 
Regel 74 ⟶ 110:
}}
 
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 gegenereerd bestand kan ook met INCLUDE opgehaald worden. Op die manier moet de programmeur niet uitvissen van welk overeenkomstig COBOL-datatype de DB2-variabelen zijn.
{{code
|Taal=COBOL + embedded SQL + embedded SQL
|Titel=leraar-tabel-declaratie (voor INCLUDE)
|Code=<pre>
01 leraar.
02 lid PIC 9(3).
02 voorn PIC X(10).
02 vak PIC X(10).
 
EXEC SQL
DECLARE leraars
( lid SMALLINT NOT NULL,
voorn CHAR(10),
vak CHAR(10)
)
END-EXEC.
</pre>
}}
 
Hieronder een overzicht van hoe DB2-variabelen kunnen omgezet worden naar COBOL-variabelen:
{|class="wikitable"
|+
!SQL-DB2 !! COBOL
|-
|<pre>var CHAR(4),</pre>||<pre>var PIC X(4).</pre>
|-
|<pre>SMALLINT,</pre>||<pre>PIC S9(4) COMP.</pre>
|-
|<pre>DECIMAL (9,2),</pre>||<pre>PIC S9(7)V9(2) COMP-3.</pre>
|-
|<pre>var VARCHAR (60),</pre>||
<pre>
01 var.
49 lengte PIC S9(4) COMP.
49 tekst PIC X(60).
</pre>
|}
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.
{{code
|Taal=COBOL + embedded SQL
|Titel=Meervoudige UPDATE
|Code=<pre>
EXEC SQL
DECLARE crs CURSOR FOR
SELECT voorn
FROM leraars
WHERE vak = 'WISKUNDE'
FOR UPDATE OF vak
END-EXEC.
</pre>...<pre>
EXEC SQL
OPEN crs
END-EXEC
EXEC SQL
FETCH crs INTO :voornaam
END-EXEC
PERFORM update UNTIL SQLCODE NOT = 0
EXEC SQL
CLOSE crs
END-EXEC
update.
EXEC SQL
UPDATE leraars
SET vak = 'MEETKUNDE'
WHERE CURRENT OF crs
END-EXEC
EXEC SQL
FETCH crs INTO :voornaam
END-EXEC
.
</pre>
}}
 
==NULLs==
Databanksystemen kennen naast (alfa)numerieke waarden, ook het concept "NULL", met alle problemen van dien (zie [[w:driewaardige logica|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 ... "
{{code
|Taal=COBOL + embedded SQL
|Titel=NULL-indicator
|Code=<pre>
01 naam PIC X(10).
01 naam-i PIC S9(4) COMP.
01 postnr PIC 9(4).
01 post-i PIC S9(4) COMP.
</pre>...<pre>
EXEC SQL
SELECT dorpnaam, postnummer
INTO :naam:naam-i, :postnr:post-i
FROM dorpen
WHERE postnummer = :postnr
END-EXEC
 
</pre>
}}
{{code
|Taal=COBOL + embedded SQL
|Titel=NULL-indicator-rij
|Code=<pre>
01 dorp.
02 naam PIC X(10).
02 postnr PIC 9(4).
01 indicator PIC S9(4) COMP OCCURS 2.
</pre>...<pre>
EXEC SQL
SELECT dorpnaam, postnummer
INTO :naam:indicator(1), :postnr:indicator(2)
FROM dorpen
WHERE postnummer = :postnr
END-EXEC
 
</pre>
}}
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):
{{code
|Taal=COBOL + embedded SQL
|Titel=NULL-indicator-test
|Code=<pre>
01 leesbare-code PIC S9(3).
</pre>...<pre>
MOVE SQLCODE TO leesbare-code
IF SQLCODE < 0
DISPLAY 'Even Apeldoorn bellen: error ' leesbare-code
ELSE
DISPLAY 'Alles OK'
END-IF
 
</pre>
}}
Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.