Sekundärindex für eine NK-ISAM-Datei erzeugen
Komponente: | BS2000 |
Funktionsbereich: | Dateiverarbeitung |
Anwendungsbereich: | FILE |
Privilegierung: | STD-PROCESSING |
Funktionsbeschreibung
Für die Sätze einer NK-ISAM-Datei ist ein Schlüsselfeld definiert, das jeweils den Primär-Schlüssel enthält. Lage und Länge des Primär-Schlüssels kann der Benutzer beim Erstellen der Datei im Kommando ADD-FILE-LINK (Operanden KEY-POSITION und KEY-LENGTH) bestimmen. Diese Angaben werden in den Katalogeintrag übernommen
(siehe Kommando SHOW-FILE-ATTRIBUTES). Alle Primär-Schlüssel werden intern in einem Verzeichnis, dem so genannten Primär-Index, verwaltet. Bei gegebenem Primär-Schlüssel findet NK-ISAM über den Primär-Index den gewünschten Satz in der Datei.
Mit dem Kommando CREATE-ALTERNATE-INDEX kann für die Datei zusätzlich ein Sekundär-Index erstellt werden. Dabei wird für die Sätze der Datei ein weiteres Schlüsselfeld definiert. Für bereits bestehende Sätze (die Sätze werden sequenziell eingelesen!) erstellt NK-ISAM ein internes Verzeichnis, den so genannten Sekundär-Index. Dieser wird gebildet aus den Sekundär-Schlüsseln der Datensätze und den jeweils zugehörigen Primär-Schlüsseln, wobei die Einträge nach Sekundär-Schlüsseln sortiert werden (siehe Operand SORT-WORK-FILE).
Sekundär-Schlüssel werden bei den Makroaufrufen für die Zugriffsmethode ISAM unterstützt (siehe Handbuch „DVS-Makros“ [12]). Bei Lese- bzw. Positionieroperationen über einen gegebenen Sekundär-Schlüssel sucht NK-ISAM Einträge für diesen Schlüssel. Der gefundene Eintrag enthält den zugehörigen Primär-Schlüssel. Der gesuchte Satz mit dem somit bestimmten Primär-Schlüssel wird über den Primär-Index gefunden.
Ein gegebener Sekundär-Schlüssel kann in mehreren Sätzen enthalten sein (abhängig von Operand DUPLICATE-KEY). Primär-Schlüssel müssen bei Verwendung von Sekundär-Schlüsseln immer eindeutig sein. Aus der Zuordnung von Sekundär- und Primär-Schlüssel können der oder die Datensätze eindeutig bestimmt werden.
Der Benutzer kann für eine Datei bis zu 30 verschiedene Sekundär-Schlüssel definieren. Jeder definierte Sekundär-Schlüssel bzw. der daraus erzeugte Sekundär-Index besitzt einen Namen, der eindeutig zu vergeben ist (siehe Operand KEY-NAME). Unter Beachtung folgender Voraussetzungen ist die Lage der Schlüsselfelder beliebig wählbar:
Bei Sätzen variabler Länge ist zu Beginn des Datensatzes ein vier Byte langes Satz-Längenfeld zu berücksichtigen.
Ein definiertes Schlüsselfeld kann nur innerhalb eines Datensatzes liegen. Bei Sätzen variabler Länge ist Begrenzung mit der Länge des kürzesten Datensatzes gegeben.
Schlüsselfelder dürfen nicht innerhalb von Überlaufblöcken liegen, die bei der Umsetzung einer K-ISAM-Datei in eine NK-ISAM-Datei entstehen können, wenn die maximale Satzlänge genutzt wurde.
Die Verwaltung der Sekundär-Schlüssel kann nicht getrennt von dem Primär-Schlüssel erfolgen. Bei Dateierweiterung werden die Sekundär-Indizes automatisch erweitert. Aus Performancegründen ist es für große Dateien günstiger, den bzw. die gewünschten Sekundär-Indizes erst nach dem Erstellen der Datei zu erzeugen.
Das Kommando SHOW-INDEX-ATTRIBUTES informiert über definierte Sekundär-Schlüssel bzw. erstellte Sekundär-Indizes einer Datei. Dabei wird lesend auf die Datei zugegriffen (OPEN=INPUT). Mit dem Kommando DELETE-ALTERNATE-INDEX kann der Benutzer Sekundär-Indizes wieder löschen.
Abbruch der Index-Erstellung:
Stellt NK-ISAM während der Erstellung einen Fehler fest (z.B. zu kurzer Datensatz), wird ein bereits teilweise erstellter Index wieder gelöscht.
Erfolgte der Abbruch wegen Systemausfalls, ist die Datei gesperrt und kann mit dem Kommando REPAIR-DISK-FILES wiederhergestellt werden. Der unvollständige Sekundär-Index wird dabei gelöscht.
Ein unvollständig erstellter Index bleibt bestehen und ist bei Ausgabe mit SHOW-INDEX-ATTRIBUTES als INCOMPLETE gekennzeichnet. Ein Öffnen der Datei wird mit DMS0D84 abgewiesen. Der unvollständige Sekundär-Index kann nur gelöscht und wieder neu erstellt werden.
Format
CREATE-ALTERNATE-INDEX | ||||||||||||||||||||||||||||||||||||||||
|
Operandenbeschreibung
FILE-NAME = <filename 1..54>
Name der NK-ISAM-Datei.
Die Datei muss folgende Voraussetzungen erfüllen:
Sie ist bereits katalogisiert.
Sie ist eine NK-ISAM-Datei, d.h. die PAM-Schlüssel stehen zu Beginn einer PAM-Seite (BLK-CONTR=DATA).
Der Primär-Index existiert bereits, d.h. die Datei wurde bereits einmal im Eröffnungsmodus OUTPUT eröffnet.
Die Datei darf nicht mehrere gleiche Primär-Schlüssel enthalten.
Die Primär-Schlüssel dürfen keine logischen Markierungen oder Wertmarkierungen enthalten (siehe Operanden LOGICAL-FLAG-LENGTH und VALUE-FLAG-LENGTH im Kommando ADD-FILE-LINK).
ALTERNATE-INDEX = list-poss(30): *PARAMETERS(...)
Vereinbart für den zu erzeugenden Sekundär-Index den Namen, die Lage innerhalb des Datensatzes, die Schlüssellänge und die Zulässigkeit gleicher Sekundär-Schlüssel in verschiedenen Datensätzen.
In einer Liste können bis zu 30 Sekundär-Indizes definiert werden.
KEY-NAME = <name 1..8>
Bestimmt den Namen des Sekundär-Index.
Der Name muss eindeutig gewählt werden. Mit dem Kommando SHOW-INDEX-ATTRIBUTES kann der Benutzer feststellen, welche Namen bereits vergeben wurden.
KEY-POSITION = <integer 1..32496>
Bestimmt die Position des ersten Bytes des Schlüsselfeldes innerhalb eines Datensatzes. Datensätze variabler Länge beginnen mit einem vier Byte langen Feld, dem Satzlängenfeld.
Die zulässige Position ist abhängig von der Länge des Schlüsselfeldes.
KEY-LENGTH = <integer 1..127>
Bestimmt die Länge des Schlüsselfeldes in Bytes.
Das Schlüsselfeld kann maximal 127 Byte lang sein. Die Lage des Schlüsselfeldes innerhalb des Datensatzes ist abhängig von der Position und der Länge. Ein Schlüsselfeld darf nicht in einem so genannten Überlaufblock liegen. Überlaufblöcke können entstehen, wenn die Datei vom K-ISAM-Format auf das NK-ISAM-Format umgestellt wird und im K-ISAM-Format die maximale Satzlänge genutzt wurde.
DUPLICATE-KEY = *YES / *NO
Gibt an, ob gleiche Sekundär-Schlüssel in verschiedenen Datensätzen zulässig sind. Default-Wert ist *YES, d.h. gleiche Schlüssel sind zulässig.
Für einen bestimmten Sekundär-Schlüssel können im Sekundär-Index mehrere Einträge enthalten sein. Diese Einträge sind nach ihrer Entstehungszeit geordnet (nach Zeitstempel).
SORT-WORK-FILE = *STD / *LINK(...)
Bestimmt eine Plattendatei, die für den Sortierlauf bei Erstellung des Sekundär-Index zu verwenden ist, falls der Arbeitsspeicher nicht ausreicht.
Nach Beendigung des Sortierlaufs wird die zugewiesene Datei gelöscht.
Default-Wert ist *STD, d.h. der Sortierlauf verwendet gegebenenfalls eine Datei mit dem Namen DISWORK.<tsn>.
SORT-WORK-FILE = *LINK(...)
Der Benutzer kann mit Angabe des Datei-Kettungsnamen eine andere Datei als Arbeitsdatei bestimmen.
LINK-NAME = <name 1..8>
Datei-Kettungsname, mit dem die zu verwendende Datei in der TFT eingetragen ist.
Kommando-Returncode
(SC2) | SC1 | Maincode | Bedeutung |
---|---|---|---|
0 | CMD0001 | Kommando fehlerfrei ausgeführt | |
32 | DMS0A37 | Interner Systemfehler | |
32 | DMS0A3A | Inkonsistenten Kontrollblock gefunden | |
32 | DMS0A42 | Interner Fehler beim OPEN auf die Datei | |
32 | DMS0A43 | Interner Fehler beim CLOSE auf die Date | |
32 | DMS0A44 | Fehler beim Lesen der Datei | |
32 | DMS0A45 | Fehler beim Schreiben in die Datei | |
32 | DMS0A47 | DMS-Fehler im NK-ISAM-Sortier-Teil | |
32 | DMS0A48 | Interner Fehler im NK-ISAM-Sortier-Teil | |
32 | DMS0A4F | Fehler bei RDTFT | |
64 | DMS0A3D | Unvollständigen Sekundärschlüssel gefunden | |
64 | DMS0A3F | Sekundär-Index bereits definiert | |
64 | DMS0A30 | Remote BS2000-System hat Version < V10.0A | |
64 | DMS0A31 | Angegebene CATID existiert nicht | |
64 | DMS0A33 | Datei enthält doppelte Primärschlüssel | |
64 | DMS0A34 | Sekundär-Index existiert bereits | |
64 | DMS0A36 | Datei enthält ISAM-Markierungen | |
64 | DMS0A39 | Parameter KEYPOS fehlerhaft | |
64 | DMS0A40 | Liste enthält doppelte Namen | |
64 | DMS0A46 | Keine NK-ISAM-Datei | |
64 | DMS0A4D | Datei enthält doppelte Sekundärschlüssel | |
64 | DMS0A4E | SHARUPD = YES wurde spezifiziert | |
128 | DMS0A49 | Kommando wurde unterbrochen | |
130 | DMS0A32 | Angegebene CATID ist nicht verfügbar | |
130 | DMS0A38 | Virtueller Speicher reicht nicht aus | |
130 | DMS0A3C | Maximale Anzahl von Sekundärschlüsseln | |
130 | DMS0A3E | ISAM-Pool ist überlastet |
Beispiele
Beispiel für das Erstellen mehrerer Sekundär-Indizes
/show-file-attr max.file.4,inf=(org=*yes) —————————————————————————————— (1)
%0000000126 :2OSG:$USER1.MAX.FILE.4 % ------------------------------- ORGANIZATION ------------------------------- % FILE-STRUC = ISAM BUF-LEN = STD(1) BLK-CONTR = PAMKEY % IO(USAGE) = READ-WRITE IO(PERF) = STD DISK-WRITE = IMMEDIATE % REC-FORM = (V,N) REC-SIZE = 0 % KEY-LEN = 8 KEY-POS = 5 % AVAIL = *STD % WORK-FILE = *NO F-PREFORM = *K S0-MIGR = *ALLOWED %:2OSG: PUBLIC: 1 FILE RES= 126 FRE= 5 REL= 3 PAGES
/cre-alter-index file-name=max.file.4,
alter-index=( (key-name=strasse,key-pos=30,key-len=20), —— (2)
(key-name=ort,key-pos=50,key-len=25) ) —— (3)
/show-index-at max.file.4 ———————————————————————————————— (4)
%FILE-NAME: :2OSG:$USER1.MAX.FILE.4 % KEY-NAME KEY-POSITION KEY-LENGTH DUPKEY %---------------------------------------------------------------- % STRASSE 30 20 YES % ORT 50 25 YES
(1) | Informationen über den Dateiaufbau der NK-ISAM-Datei MAX.FILE.4. Der Primär-Schlüssel beginnt ab dem 5. Byte (nach dem 4 Byte langen Satzlängenfeld) und ist 8 Byte lang. Die Datei enthält eine Kundenkartei, wobei die achtstellige Kundennummer der Primär-Schlüssel ist. Mit dem Kommando CREATE-ALTERNATE-INDEX werden in einer Liste zwei Sekundär-Indizes vereinbart (siehe Punkt 2 und 3): |
(2) | Um in einem Programm über den Straßennamen, der in jedem Datensatz enthalten ist, zugreifen zu können, soll für dieses Datenfeld ein Sekundär-Index mit dem Namen STRASSE erstellt werden. Das Datenfeld beginnt ab dem 30. Byte und ist 20 Byte lang. Da ein Straßenname in mehreren Datensätzen enthalten sein kann, wird DUPLICATE-KEY=*YES zugelassen (Voreinstellung). |
(3) | Um in dem Programm auch über den Ortsnamen, der in jedem Datensatz enthalten ist, zugreifen zu können, soll für dieses Datenfeld ein Sekundär-Index mit dem Namen ORT erstellt werden. Das Datenfeld beginnt ab dem 50. Byte und ist 25 Byte lang. Da ein Ortsname in mehreren Datensätzen enthalten sein kann, wird DUPLICATE-KEY=*YES zugelassen (Voreinstellung). |
(4) | Das Kommando SHOW-INDEX-ATTRIBUTES informiert über alle Sekundär-Indizes, die für die Datei MAX.FILE.4 erstellt wurden. |