Datenbank-Programmierung 1. COBOL
Datenbank-Programmierung 1. COBOL
Datenbank-Programmierung 1. COBOL
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Prof. Dr. rer.nat.habil. Bernhard Thalheim<br />
Information Systems Engineering<br />
Institute of Computer Science<br />
Christian-Albrechts-University Kiel<br />
Olshausenstr. 40<br />
D - 24098 Kiel<br />
<br />
Vorlesung <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> SS 2013<br />
WInf-DBProg: <strong>Datenbank</strong>-<strong>Programmierung</strong> (080014)<br />
1 <strong>COBOL</strong> COmmon Business Oriented Language<br />
etwa 50 % der mainframe-Anwendungen<br />
heute noch 25 - 30 % aller Software-Produkte erstellt<br />
etwa 55 - 60 % aller Altsysteme<br />
1959: <strong>1.</strong> Version; 1960: CODASYL-Standard; COnference on DAta SYstems Languages<br />
Cobol 68, Cobol 74, Cobol 85<br />
Gliederung dieser Vorlesung<br />
<strong>1.</strong> allgemeine Struktur<br />
2. Verarbeitung<br />
3. sequentielle Files<br />
4. indexsequentielle Files<br />
Literatur:<br />
J. Wendt, <strong>COBOL</strong>: Einführung in PC-Spracherweiterungen und Übungen. Wiesbaden, Gabler, 1991<br />
H.-J. Höcker, Einführung in die strukturierte <strong>COBOL</strong>-<strong>Programmierung</strong> mit Mikrocomputeranwendungen. Berlin, De Gryuter,<br />
1989.<br />
H.-R. Göpfrich, Wirtschaftsinformatik II: Strukturierte <strong>Programmierung</strong> in <strong>COBOL</strong>. 4. Auflage, Stuttgart, Gustav Fischer,<br />
199<strong>1.</strong><br />
K. Jamin, H. Urban, Programmiersprache <strong>COBOL</strong>, eine strukturierte Einführung. Rowohlt, 1989.<br />
Strukturierte <strong>Programmierung</strong> auch mit <strong>COBOL</strong> möglich<br />
• Abstraktion, Strukturierung, Modularisierung, Trennung von Essenz und Inkarnation (Unabhängigkeit),<br />
konstruktive Voraussicht (Änderbarkeit, Wartbarkeit)<br />
• Black box versus white box versus glas box<br />
• Strukturierte Entwicklung, schrittweise Verfeinerung, Spezifikation durch Nassi-Shneiderman-Struktogramme
CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 2<br />
Gliederung von Programmen<br />
• Erkennungsteil (Identification Division)<br />
i.a. Name = Programmnamen<br />
• Maschinenteil (Environment Division)<br />
Programmumgebung, Umdefinitionen<br />
• Datenteil (Data Division)<br />
File-Section, Arbeitsvariable, Verbindungsteil (für<br />
Unterprogramme)<br />
• Prozedurteil (Procedure Division)<br />
Definition sequentiell, Abarbeitung sequentiell, in<br />
Sections etc. gliederbar<br />
Gliederung der einzelnen Teile<br />
• Division besteht aus Sections<br />
• Section besteht aus Paragraphen<br />
• Paragraph besteht aus mehreren Sätzen<br />
• Satz besteht aus mehreren Anweisungen<br />
• Anweisung besteht aus mehreren Wörtern<br />
IDENTIFICATION DIVISION.<br />
*************************<br />
program-id. HAUPT.<br />
author. Alfons Zitterbacke.<br />
DATA DIVISION.<br />
*************************<br />
File Section<br />
*------------------------<br />
Working-Storage Section<br />
*------------------------<br />
01 datum-aus.<br />
05 tag pic 99.<br />
05 filler pic x value ".".<br />
05 monat pic 99.<br />
05 filler pic xxx value ".19"<br />
05 jahr pic 99.<br />
01 datum-ein.<br />
05 jahr pic 99.<br />
05 monat pic 99.<br />
05 tag pic 99.<br />
PROCEDURE DIVISION.<br />
************************<br />
haupt.<br />
accept datum-ein from date.<br />
move corr datum-ein to datum-aus<br />
display "Heute ist der " datum-a<br />
stop run.<br />
ENIVIRONMENT DIVISION.<br />
*************************<br />
Configuration Section<br />
*------------------------<br />
source-computer. vax.<br />
object-computer. vax.<br />
special-names. decimal point is comma.<br />
Input-Output Section<br />
*------------------------<br />
File-Control. ....
CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 3<br />
Programme<br />
• Quellcode<br />
• Objekt-Datei<br />
Übersetzung mit <strong>COBOL</strong>-Compiler<br />
<strong>COBOL</strong> name.cob<br />
fehlerhafter Quellcode in<br />
• Binärcode<br />
Erzeugung mit Linker<br />
LINK name.obj<br />
Ablaub mit üblicher Umgebung<br />
RUN name.exe<br />
name.cob<br />
name.obj<br />
name.lis<br />
name.exe<br />
<strong>COBOL</strong>-Worte<br />
• alphanumerischer Zeichensatz<br />
+ - * / = $ , ; : . ( ) < > ¨<br />
i.a. weniger als 30 Zeichen<br />
beginnend mit Buchstaben ohne Leerzeichen<br />
• reservierte Schlüsselwörter<br />
ADD 100 TO ergebnis ON SIZE ERROR display ¨Overflow ¨.<br />
• Literale als Zeichenketten, die Wert selbst definieren<br />
numerische Literale (+34.45 bzw. +34,45),<br />
alphanumerische Literale ( ¨Guten Tag ¨),<br />
figurative Konstanten (Zero, Zeroes, Zeros (Wert Null);<br />
Space, Spaces (Wert: Blank);<br />
All (Wiederholung eines Literals);<br />
Quote (Anführungszeichen) )
CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 4<br />
Datenvereinbahrung<br />
Stufennummer Feldname | FILLER PICTURE IS Maske<br />
[ Zusatzklausel ] ...<br />
Stufennummern als (exklusive) Baumstruktur<br />
FILLER als Fülsel zur Ausgabe<br />
Datenname OF Datengruppen-Name<br />
PIC bzw. PICTURE als alphanumerische oder numerische Daten:<br />
pic xx. pic x(20). pic 9. pic 9(5).<br />
ACCEPT name [ FROM OS-Grundtyp ]<br />
MOVE [ CORRESPONDING ] name1 TO name2<br />
DISPLAY name<br />
mit Zeilenumbruch<br />
PROCEDURE DIVISION.<br />
*********************<br />
Anfang.<br />
display "Ihr Vorname ?"<br />
accept Vorname.<br />
display "Ihr Nachname ?"<br />
accept Nachname.<br />
display Vorname.<br />
display Nachname.<br />
move Nachname to Einbuchstabe.<br />
Klaus<br />
display Einbuchstabe.<br />
Z<br />
move 1234 to Zahl5. 01234<br />
display Zahl5.<br />
move Zahl5 to Zahl3. 234<br />
display Zahl3. 234<br />
stop run.<br />
Zitterbacke<br />
Klaus_________<br />
Zitterbacke___<br />
Vorzeichen mit S Dezimalpunkt mit V<br />
pic 9V9999. 12345 wird zu <strong>1.</strong>2345<br />
pic S9V9(4). 12345 wird zu +<strong>1.</strong>2345
CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 5<br />
Sendemasken und Empfangsmasken<br />
Punkt mit .<br />
Symbole + und - für Vorzeichen<br />
Unterdrückung führender Nullen mit Z<br />
01 Sender pic 9(5). 01 Empfang pic 9(3).999.<br />
01 Sender1 pic S9V9(4). 01 Empfang1 pic +9.9(4).<br />
Sendemaske Sendeinhalt Empfangsmaske Empfangsinhalt<br />
9(5) 12345 9.999 5.000<br />
9(5) 12345 9(3).999 345.000<br />
9(2)V9(3) 12.345 9(3).9(2) 012.34<br />
9(5) 00012 ZZZZ9 12<br />
9(3)V99 012.34 Z(3).99 12.34<br />
99V9(3) 0<strong>1.</strong>234 Z.9(3) <strong>1.</strong>234<br />
S9V9(4) <strong>1.</strong>2345 +9.9(4) +<strong>1.</strong>2345<br />
S9V9(4) <strong>1.</strong>2345 9.9(4)- <strong>1.</strong>2345<br />
S9(3)V9(3) -12.345 Z(2)9(3).9(3)- 012.345-<br />
Zusätze in PICTURE-Klauseln:<br />
01 Anrede pic x(10) value "Herr/Frau".<br />
01 Filler pic x(9) value all "=".<br />
01 Zahl1 pic 99 value zeroes.<br />
01 Leer pic x(79) value spaces.<br />
01 Feld1 pic S9(4) sign is leading.<br />
01 Feld2 pic x(20) just.<br />
01 Zahl2 pic 9(3) blank when zero.<br />
02 Anschrift pic x(59).<br />
02 Adresse1 redefines Anschrift.<br />
03 Ort pic x(35).<br />
03 Land pic x(24).<br />
VALUE: mit Wertezuweisung<br />
SIGN IS LEADING: Vorzeichen wird dazugezählt<br />
SIGN IS TRAILING: Vorzeichen dazugezählt, am Ende<br />
JUSTIFIED: rechtsbündig<br />
BLANK (WHEN) ZERO: führende Nullen als Leerzeichen<br />
REDEFINES: weitere Strukturdefinitionen hinzufügbar
CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 6<br />
Arithmetische Anweisungen<br />
ADD Name1 | Literal1 ... TO Name2 [ Rounded ] ...<br />
[ GIVING Name3 [ ROUNDED ] ]<br />
[ ON SIZE ERROR unbedAnweisung ]<br />
add 1 to Feld2 Feld2 := Feld2 + 1<br />
add 1,2 to Feld1 giving Erg1, Erg2 Erg1,Erg2 := Feld1 +1+<br />
SUBTRACT ... FROM ... [ GIVING ... ] [ ON ... ]<br />
MULTIPLY ... BY ... [ GIVING ... ] [ ON ... ]<br />
DIVIDE ... INTO | BY ... [ GIVING ... ] [ ON ... ]<br />
divide 2 into Erg1 Erg1 := Erg1 / 2<br />
divide X1 by X2 giving X3 X3 := X1/X2<br />
remainder X4 on size error "undef" X4 := rest (X1/X2)<br />
COMPUTE Name [ ROUNDED ] ... = arithmAusdr [ ON ... ]<br />
Steueranweisungen<br />
STOP RUN<br />
IF Beding THEN Anweis1 ... | NEXT SENTENCE λ<br />
ELSE Anweis2 ... | NEXT SENTENCE<br />
Bedingungen: Vergleichsbedingungen (Name, Literal, arithm. Ausdr.)<br />
Vorzeichenbedingung<br />
if a+b *2 is [not] positive negative zero<br />
Klassenbedingungen<br />
if a is [not] numeric alphabetic<br />
zus.-ges. komplexe Beding.<br />
GO TO label(section, paragraph)<br />
GO TO ... DEPENDING ON auswahlwert<br />
PERFORM label1 [THROUGH label2] [ x TIMES]<br />
wie GO TO mit Rückkehr, evt. nur bis label2<br />
PERFORM ... UNTIL beding<br />
dürfen sich nicht überlappen<br />
X. perform A thru E. stop run.<br />
A. ... B. perform C thru G. ?????<br />
Y. ... perform K thru P.<br />
K. ... T. perform M thru S. ok.
CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 7<br />
IDENTIFICATION DIVISION.<br />
****************************<br />
program-id. MENU2.<br />
author. Zitterbacke.<br />
ENVIRONMENT DIVISION.<br />
****************************<br />
Configation Section<br />
*---------------------------<br />
source-computer. vax.<br />
object-computer. vax.<br />
DATA DIVISION.<br />
****************************<br />
Working-Storage Section<br />
*---------------------------<br />
01 ein-name pic x(30).<br />
01 sterne pic x(80) value all "*"<br />
01 bestaet pic x.<br />
01 anzeigezeile-<strong>1.</strong><br />
02 filler pic x(30) value spaces.<br />
02 name pic x(19).<br />
02 filler pic x(19) value spaces.<br />
...<br />
01 datum-ein.<br />
02 jahr pic x(2).<br />
02 monat pic x(2).<br />
02 tag pic x(2).<br />
01 datum-aus.<br />
02 tag pic x(2).<br />
02 filler pic x value".".<br />
02 monat pic x(2).<br />
02 filler pic x(3) value ".19".<br />
02 jahr pic x(2).<br />
01 flag pic x.<br />
01 text3 pic x(70) value<br />
"Modul z.Z. nicht verfuegbar"<br />
...<br />
PROCEDURE DIVISION.<br />
****************************<br />
BS Section<br />
*---------------------------<br />
Namenseingabe.<br />
display spaces.<br />
display "Name?:".<br />
display spaces.<br />
accept ein-name.<br />
move ein-name to name.<br />
*--Aufnahme Systemdaten--<br />
accept datum-ein from date.<br />
move corr datum-ein to datum-aus.<br />
....<br />
Ausgabe.<br />
*--Ausgabe Begruessung--<br />
display sterne. display spaces.<br />
display anzeigezeile-<strong>1.</strong><br />
diaplay "Datum -->" datum-aus.<br />
......<br />
display "Mit bestaetigen".<br />
accept bestaet.<br />
Haupt Section<br />
*---------------------------<br />
Steuerung.<br />
move 0 to flag.<br />
perform Eingabe until flag=<strong>1.</strong><br />
Ende.<br />
display "Programmende".<br />
stop run.<br />
Module Section<br />
*---------------------------<br />
Eingabe.<br />
*--Aufbau Auswahlbildschirm--<br />
display spaces. display spaces.<br />
display"*** Hauptmenue ***".<br />
display "1 Kundenstamm".<br />
display "2 Kundenauftrag".<br />
display "3 Programmende".<br />
display "Ihre Auswahl ?:".<br />
accept auswahl.<br />
*--Abfangen Falscheingaben--<br />
if auswahl not numeric<br />
then display "Fehler"<br />
if auswahl numeric and auswahl>3<br />
then display "Fehler"<br />
*--Menu-Punkt-Auswahl--<br />
if auswahl=1 then perform Blind.<br />
if auswahl=2 then perfom Blind.<br />
if asuwahl=3 then move 1 to flag.<br />
Blind.<br />
display ....<br />
display "Mit bestaetigen".<br />
accept bestaet.
CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 8<br />
Erweiterung um CALL<br />
Verlinken mit LINK ProgListe<br />
CALL UProg USING Parameter<br />
Parameterübergabe als Liste<br />
ohne Typenkontrolle<br />
Hauptprogramm<br />
IDENTIFICATION DIVISION.<br />
****************************<br />
program-id. HAUPT.<br />
ENVIRONMENT DIVISION.<br />
****************************<br />
Configuation Section<br />
*---------------------------<br />
source-computer. vax.<br />
object-computer. vax.<br />
DATA DIVISION.<br />
****************************<br />
Working-Storage Section<br />
*---------------------------<br />
01 alpha pic x(5).<br />
01 beta pic x(5).<br />
PROCEDURE DIVISION.<br />
****************************<br />
Steuerung.<br />
move "11111" to alpha.<br />
move "22222" to beta.<br />
call "UNTER"<br />
using alpha, beta.<br />
display "Testende".<br />
Ende.<br />
stop run.<br />
Unterprogramm<br />
Aufruf mit der üblichen Stack-Architektur<br />
Steuerung wie bei PERFORM<br />
EXIT PROGRAM als letzte<br />
Anweisung<br />
IDENTIFICATION DIVISION.<br />
****************************<br />
program-id. UNTER.<br />
ENVIRONMENT DIVISION.<br />
****************************<br />
Configuation Section<br />
*---------------------------<br />
source-computer. vax.<br />
object-computer. vax.<br />
DATA DIVISION.<br />
****************************<br />
Working-Storage Section<br />
*---------------------------<br />
01 text pic x(13)<br />
value "Unterprogramm".<br />
Linkage Section<br />
*---------------------------<br />
01 gamma pic x(5).<br />
01 delta pic x(5).<br />
PROCEDURE DIVISION using delta, gam<br />
****************************<br />
Anzeige.<br />
display text. display gamma.<br />
display delta.<br />
Zurueck.<br />
exit program.
CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 9<br />
Dateien<br />
• mit Strukturdefinition<br />
nach Data Division Definition<br />
wesentlich ist jedoch nur die Länge und Datengrundtyp<br />
• READ immer mit vollständigen Datensatz<br />
• analog WRITE nur auf Gruppe 01<br />
Organisationsformen<br />
• sequentielle Dateien<br />
Abarbeitung in der Reihenfolge der Sätze<br />
Anhängen von neuen Sätzen<br />
• Random-Dateien<br />
direkte Ablage an physischer Adresse<br />
Sätze über Schlüssel angesprochen<br />
• relative Dateien<br />
Schlüssel - automatisch vergebene Positionsnummer<br />
Nummern in automatisch generierter Zeigertabelle<br />
• indexsequentielle Dateien<br />
Zugriff über Schlüsselwerte<br />
Benutzung eines (oder mehrere) Index<br />
Charakterisierung von Dateien<br />
• Datenträger (Platte ... Diskette)<br />
• Dateiorganisation<br />
• Zugriffsarten (ACCESS MODE: sequentiell, random, dynamic)
CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 10<br />
Sequentielle Dateien<br />
SELECT datei-variable ASSIGN TO datei-name<br />
[ ORGANIZATION IS SEQUENTIAL ]<br />
ENVIRONMENT DIVISION.<br />
********************************<br />
...<br />
Input-Output Section.<br />
*-------------------------------<br />
File-Control.<br />
select Kunden assign to "sys$disk: KUNDEN"<br />
organization is sequential.<br />
select Auftrag assign to "sys$disk:AUFTRAG"<br />
organization is sequential.<br />
DATA DIVISION.<br />
********************************<br />
File Section.<br />
*-------------------------------<br />
FD Kunden label record standard.<br />
01 Kunden-Satz.<br />
02 Kundennummer pic x(4).<br />
02 Name.<br />
03 Nachname pic x(30).<br />
03 Vorname pic x(20).<br />
02 Adresse.<br />
03 Strasse pic x(30).<br />
....<br />
FD Auftrag label record standard.<br />
01 Auftrag-Satz.<br />
...<br />
FD - File Description<br />
LABEL RECORD STANDARD - historisch
CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 11<br />
Verarbeitung sequentieller Dateien<br />
• OPEN, CLOSE Datei-Variable<br />
• INPUT bzw. OUTPUT als read-only bzw. write-only<br />
Umkehroperation führt zu Programmabsturz<br />
existierende Datei (read) bzw. nicht-existierende (write)<br />
OPEN OUTPUT auf existierende Datei führt zum Löschen dieser<br />
OPEN INPUT auf nicht-existierende Datei: erfolglose Anweisung<br />
• I-O analog mit read und rewrite<br />
• OPEN EXTEND Öffnen einer existierenden Datei<br />
write als neuen letzten Satz<br />
read führt zu Programmabsturz<br />
bei OPEN nicht gelöscht, sondern erweitert<br />
• READ datei-variable RECORD [ INTO datei-struktur-variable ]<br />
[ AT END unbedingteAnweis ]<br />
datei-variable ist zeigt auf INPUT bzw. I-O Datei<br />
INTO nicht nur in den Puffer sondern Zuweisung<br />
AT END (of file) können Fehleranweisungen ausgeführt werden<br />
PROCEDURE DIVISION.<br />
*****************************<br />
Anfang. .... move "n" to flag. ....<br />
open input Kunden.<br />
accept FamName.<br />
perform Lesen until flag = "j".<br />
close Kunden. stop run.<br />
Lesen.<br />
read Kunden record at end display "Dateiende"<br />
move "j" to flag.<br />
if flag not = "j" and FamName = Nachname then<br />
display Kundennummer " " Name.<br />
display "Korrekte Person ? (j/n)".<br />
accept flag.<br />
bzw. Lesen mit Datei-Struktur-Variable<br />
01 Kunde. ...<br />
read Kunden record into Kunde at end display ...
CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 12<br />
• WRITE datei-variable [ FROM datei-struktur-variable ]<br />
OUTPUT-Datei: neu erzeugt; Extend-Datei: angefügt falls Datei existierte<br />
dati-variable aus dem FD-Puffer beschrieben<br />
write Kunden from Kunde.<br />
• REWRITE datei-variable [ FROM datei-struktur-variable ]<br />
Zurückschreiben eines existierenden Datensatzes<br />
im I-O-Modus<br />
nach vorherigem READ<br />
FD Kunden label record standard.<br />
01 Kunden-Satz.<br />
02 Kundennummer pic x(4).<br />
02 Nachname pic x(30).<br />
....<br />
PROCEDURE DIVISION.<br />
****************************<br />
Anfang.<br />
open I-O Kunden. ...<br />
Aendern.<br />
read Kunden record<br />
at end display "Fehlt"<br />
accept Nachname.<br />
rewrite Kunden-Satz.<br />
move 1 to flag.
CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 13<br />
• Drucklistenerstellung<br />
Listenkopf mit Kopfzeilen, Listenrumpf mit Seiten (Kopf-, Rumpf-, Fußzeilen), Listenfuß<br />
mit Fußzeilen<br />
FD Liste label record standard<br />
linage is 56 lines<br />
with footing at 51<br />
lines at top 5<br />
limes at bottom 5.<br />
01 Ausgabe-Satz pic x(80).<br />
* Seitenlaenge<br />
* Gesamtlaenge 66 Zeilen<br />
Working-Storage Section.<br />
*-----------------------------<br />
01 Titelzeile.<br />
02 filler pic x(60) value "Gehalt".<br />
02 datum pic 99.99.99.<br />
01 Kopfzeile. ...<br />
01 Fusszeile. ...<br />
01 Rumpfzeile.<br />
02 Name pic x(27).<br />
02 filler pic x(3).<br />
03 Gehalt pic 9(5).<br />
01 Endezeile. ...<br />
WRITE datei-variable [ FROM datei-struktur-variable ]<br />
[ BEFORE | AFTER ADVANCING<br />
{ PAGE | { variable | zahl } [LINES] } ]<br />
• Sortieren in sequentiellen Dateien<br />
SORT Sort-Datei-Name ON<br />
{ ASCENDING | DESCENDING } KEY Schluessel<br />
USING Input-Datei-Name GIVING Output-Datei-Name
CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 14<br />
Indexsequentielle Dateien<br />
auf Grundlage automatisch generierter Index-Datei<br />
Zugriffsarten<br />
• sequentieller Zugriff<br />
Verarbeitung in der Reihenfolge der Index-Datei (ACCESS SEQUENTIAL)<br />
• wahlfreier Zugriff<br />
Verarbeitung in beliebiger Reihenfolge (ACCESS RANDOM)<br />
• dynamischer Zugriff<br />
Verarbeitung sequentiell und wahlfei (ACCESS DYNAMIC)<br />
SELECT datei-variable ASSIGN TO datei-name<br />
[ ORGANIZATION IS INDEXED ]<br />
[ RECORD KEY IS Feldname ]<br />
[ ACCESS MODE IS<br />
SEQUENTIAL | RANDOM | DYNAMIC ]<br />
ENVIRONMENT DIVISION<br />
*****************************<br />
....<br />
Input-Output-Section.<br />
*----------------------------<br />
File-Control.<br />
select Kunden assign to<br />
"sys$disk:KUNDEN"<br />
organisation is sequential.<br />
select Auftrag1 assign to<br />
"sys$disk: AUFTRAG1"<br />
organization is indexed<br />
record key is Auftragnr<br />
access mode is dynamic.<br />
....<br />
DATA DIVISION.<br />
*****************************<br />
....
CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 15<br />
FD Auftrag1 label record standard.<br />
01 Auftrag1-Satz.<br />
02 Kundennr pic x(4).<br />
02 Auftragnr pic x(4).<br />
02 Artikelnr pic x(4).<br />
02 Menge pic x(4).<br />
02 Preis pic x(4).<br />
Anweisungen zur Verarbeitung:<br />
• OPEN-Anweisung<br />
OPEN INPUT | OUTPUT | EXTEND | I-O Datei-Name<br />
• OPEN OUTPUT öffnet Ausgabedatei, evt. mit Neuanlegen,<br />
bei Existenz Löschung<br />
bei WRITE auch Bearbeitung der Index-Datei<br />
• OPEN INPUT öffnet Eingabedatei<br />
• OPEN EXTEND öffnet Eingabedatei im ACCESS SEQUENTIAL Modus<br />
• OPEN I-O öffnet existierende Datei zum Schreiben und Lesen<br />
open input Kunden.<br />
open output Auftrag.<br />
open I-O Bearbeiter.<br />
open extend Personal.<br />
• CLOSE-Anweisung zum Schließen<br />
CLOSE<br />
Datei-Name<br />
close Kunden, Auftrag, Personal.<br />
• READ-Anweisung liest Satz in den Puffer, der durch FD-Anweisung definiert wurde<br />
• sequentielle Datei mit ACCESS SEQUENTIAL
CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 16<br />
READ Datei-Name RECORD [ INTO Daten-Name ]<br />
[ AT END unbedingteAnweisung ]<br />
File-Control.<br />
select Kunden1 assign to "sys$disk: KUNDEN1"<br />
organization is indexed<br />
record key is Kundennr access mode is sequential.<br />
FD Kunden1 label record standard.<br />
01 Kunden1-Satz.<br />
02 Kundennr pic x(4).<br />
02 Nachname pic x(30).<br />
Working-Storage Section.<br />
01 flag pic x.<br />
PROCEDURE DIVISION.<br />
*****************************<br />
Anfang.<br />
move spaces to flag.<br />
open input Kunden<strong>1.</strong><br />
perform Lesen until flag="n".<br />
close Kunden1 . stop run.<br />
Lesen.<br />
read Kunden1 record<br />
at end display "Dateiende" move "n" to flag.<br />
if flag not = "n" then<br />
display "Kd.Nr.: " Kundennr<br />
display "Name: " Nachname.<br />
Lesen in der Reihenfolge der Indexdatei!<br />
• sequentielle Datei mit ACCESS DYNAMIC<br />
READ Datei-Name NEXT RECORD [ INTO Daten-Name ]<br />
[ AT END unbedingteAnweis ]<br />
mit NEXT: sequentieller Zugriff<br />
• wahlfreies READ bei ACCESS RANDOM mit aktuellem Inhalt des Schlüsselfeldes<br />
READ Datei-Name RECORD [ INTO Daten-Name ]<br />
[ INVALID KEY unbedingteAnweis ]<br />
Index-Datei wird durchmustert; bei matching wird Datensatz, auf den Indexeintrag<br />
zeigt, in FD Puffer eingelesen<br />
bei INTO-Lesen wird außerdem noch in die Variable eingelesen
CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 17<br />
File-Control.<br />
select Kunde1 ... access is random.<br />
PROCEDURE DIVISION.<br />
*****************************<br />
Eingabe.<br />
display "Geben Sie eine ". display "Kundennummer ein:".<br />
accept Kundennr.<br />
Anfang.<br />
open input Kunden<strong>1.</strong> move 0 to flag.<br />
perform Lesen.<br />
close Kunden<strong>1.</strong><br />
if flag = 0 then display "Positiv" else display "Negativ"<br />
display "Programmende". stop run.<br />
Lesen.<br />
read Kunden1 record invalid key move 1 to flag.<br />
• wahlfreies READ mit Sekundärschlüsseln<br />
müssen nicht identifizieren<br />
SELECT Datei-Name ASSIGN TO Speicher-Literal<br />
[ ORGANIZATION IS INDEXED ]<br />
[ RECORD KEY IS TeilFeld1 [ OF Feld1 ]]<br />
[ ALTERNATE RECORD KEY IS TeilFeld2 [ OF Feld2]<br />
[ WITH DUPLICATES ]] ...<br />
[ ACCESS MODE IS SEQUENTIAK | RANDOM | DYNAMIC ]<br />
READ Datei-Name RECORD [ INTO Daten-Name ]<br />
[ KEY IS Name2 ]<br />
[ INVALID KEY unbedingte Anweis ]<br />
• WRITE-Anweisung für Ausgabe eines Satzes in indexsequentielle Datei (OUTPUToder<br />
I-O-Datei) bzw. in sequentielle Datei (EXTEND-Datei)<br />
WRITE Datensatz [ FROM Variable ]<br />
[ INVALID KEY unbedingteAnweis ]<br />
Einsortierung in Index nach Primärschlüssel, in Datei meist durch Anhängen (Schlüsselwert<br />
existent!)<br />
• START-Anweisung zur Behandlung von nicht-eindeutigen Sekundärschlüssel-Einträgen
CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 18<br />
START Datei-Name [ KEY IS = Daten-Name ]<br />
[ INVALID KEY unbedingteAnweis ]<br />
select Kunden1 assign to "sys$disk:KUNDEN1"<br />
organization is indexed record key is Kundennr<br />
alternate record key is Nachname with duplicates<br />
access mode is dynamic.<br />
FD Kunden1 label record standard.<br />
01 Kunden1-Satz. ...<br />
...<br />
accept suchinput.<br />
Anfang.<br />
open input Kunden<strong>1.</strong><br />
start Kunden1 key is = Nachname<br />
invalid key move "j" to antwort ...<br />
perform Lesen until antwort="j".<br />
close Kunden<strong>1.</strong> stop run.<br />
Lesen.<br />
read Kunden1 next record<br />
at end ... move "j" to antwort.<br />
if Nachname = suchinput then<br />
display Nachname " " Vorname<br />
display "Richtiger Kunde (j/n)?"<br />
accept antwort<br />
else move "j" to antwort.
CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 19<br />
ENVIRONMENT DIVISION<br />
*****************************<br />
...<br />
Input-Output Section.<br />
*----------------------------<br />
File-Control.<br />
select Kunden<br />
assign to<br />
"sys$disk:Kunden"<br />
organization<br />
is sequential.<br />
select Kunden1<br />
assign to<br />
"sys$disk:KUNDEN1"<br />
organization<br />
is indexed<br />
record key is<br />
Kundennr of Kunden1<br />
alternate record key<br />
Nachname of Kunden1<br />
with duplicates<br />
access mode dynamic.<br />
select Auftrag<br />
assign to<br />
"sys$disk:AUFTRAG"<br />
organization<br />
is sequential.<br />
select Auftrag1<br />
assign to<br />
"sys$disk:AUFTRAG1"<br />
organization<br />
is indexed<br />
record key is<br />
Auftragnr of Auftrag1<br />
alternate record key<br />
Kundennr of Auftrag1<br />
with duplicates<br />
access mode dynamic.<br />
DATA DIVISION.<br />
*****************************<br />
File Section.<br />
*----------------------------<br />
FD Kunden label<br />
record standard.<br />
01 Kunden-Satz.<br />
02 Kundennr pic x(4).<br />
02 Nachname pic x(30). ...<br />
FD Kunden1 label<br />
record standard.<br />
01 Kunden1-Satz. ....<br />
FD Auftrag label<br />
record standard. ....<br />
FD Auftrag1 label<br />
record standard. ....<br />
PROCEDURE DIVISION.<br />
*****************************<br />
Steuerung.<br />
open input Kunden, Auftrag.<br />
open output Kunden1, Auftrag1<br />
....<br />
read Kunden record<br />
at end move 1 to flag.<br />
read Auftrag record<br />
at end move 1 to flag.<br />
write Kunden1-Satz<br />
from Kunden-Satz<br />
invalid key<br />
display "Fehler".<br />
write Auftrag1-Satz<br />
from Auftrag-Satz<br />
invalid key<br />
display "Fehler".
CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 20<br />
• REWRITE-Anweisung zum Ersetzen eines Satzes einer im I-O-Modus geöffneten<br />
indexsequentiellen Datei nach vorangegangem READ<br />
ersetzt werden können nur die Werte außerhalb des Primärschlüssels<br />
bei ACCESS SEQUENTIAL: zuletzt gelesener Satz<br />
bei ACCESS RANDOM/DYNAMIC: Satz mit Schlüsselwert ersetzt<br />
REWRITE SatZName [ FROM Variable ]<br />
[INVALID KEY unbedingteAnweis]<br />
nur auf Stufe 01<br />
File-Control.<br />
select Kunden1 assign ... organization is indexed<br />
record key is Kundennr<br />
alternate record key Nachname with duplicates<br />
access mode is dynamic.<br />
FD Kunden1 label record standard.<br />
01 Kunden1-Satz.<br />
02 Kundennr pic x(4).<br />
02 Nachname pic x(30).<br />
...<br />
Anfang.<br />
open I-O Kunden<strong>1.</strong><br />
perform Lesen. perform Aendern until ... .<br />
close Kunden<strong>1.</strong> stop run.<br />
Aendern.<br />
display "Neuer Nachname:".<br />
accept Nachname.<br />
rewrite Kunden1-Satz invalid key ...<br />
Lesen.<br />
display "Kundennummer:".<br />
accept Kundennr.<br />
read Kunden1 record invalid key ... .<br />
• DELETE-Anweisung<br />
DELETE Datei-Name RECORD [ INVALID KEY unbedingteAnweis ]