COBOL - Szybki przewodnik

Wprowadzenie do języka COBOL

COBOL to język wysokiego poziomu. Trzeba zrozumieć, jak działa COBOL. Komputery rozumieją tylko kod maszynowy, binarny strumień zer i jedynek. Kod COBOL należy przekonwertować na kod maszynowy przy użyciu rozszerzeniacompiler. Uruchom źródło programu za pomocą kompilatora. Kompilator najpierw sprawdza wszelkie błędy składniowe, a następnie konwertuje je na język maszynowy. Kompilator tworzy plik wyjściowy o nazwieload module. Ten plik wyjściowy zawiera kod wykonywalny w postaci zer i jedynek.

Ewolucja COBOL

W latach pięćdziesiątych XX wieku, kiedy firmy rozwijały się w zachodniej części świata, istniała potrzeba zautomatyzowania różnych procesów w celu ułatwienia obsługi, co dało początek wysokopoziomowemu językowi programowania przeznaczonemu do przetwarzania danych biznesowych.

  • W 1959 roku COBOL został opracowany przez CODASYL (Konferencja Języka Systemów Danych).

  • Następna wersja, COBOL-61, została wydana w 1961 roku z pewnymi poprawkami.

  • W 1968 roku język COBOL został zatwierdzony przez ANSI jako język standardowy do użytku komercyjnego (COBOL-68).

  • Został ponownie poprawiony w 1974 i 1985 roku, aby opracować kolejne wersje o nazwach odpowiednio COBOL-74 i COBOL-85.

  • W 2002 roku został wydany obiekt COBOL zorientowany obiektowo, który mógł używać zamkniętych obiektów jako normalnej części programowania w języku COBOL.

Znaczenie języka COBOL

  • COBOL był pierwszym szeroko stosowanym językiem programowania wysokiego poziomu. Jest to język podobny do angielskiego, który jest przyjazny dla użytkownika. Wszystkie instrukcje można zakodować prostymi angielskimi słowami.

  • COBOL jest również używany jako język samodokumentujący.

  • COBOL radzi sobie z przetwarzaniem ogromnych ilości danych.

  • COBOL jest kompatybilny z poprzednimi wersjami.

  • COBOL ma skuteczne komunikaty o błędach, dzięki czemu ich rozwiązywanie jest łatwiejsze.

Cechy COBOL

Standardowy język

COBOL to standardowy język, który można kompilować i uruchamiać na maszynach takich jak IBM AS / 400, komputery osobiste itp.

Zorientowany na biznes

COBOL został zaprojektowany do zastosowań biznesowych związanych z dziedziną finansów, obronności itp. Dzięki zaawansowanym możliwościom obsługi plików może obsługiwać ogromne ilości danych.

Solidny język

COBOL jest solidnym językiem, ponieważ jego liczne narzędzia do debugowania i testowania są dostępne dla prawie wszystkich platform komputerowych.

Język strukturalny

W języku COBOL dostępne są logiczne struktury kontrolne, które ułatwiają odczytywanie i modyfikowanie. COBOL ma różne działy, więc jest łatwy do debugowania.

Instalowanie COBOL w systemie Windows / Linux

Istnieje wiele bezpłatnych emulatorów komputerów mainframe dostępnych dla systemu Windows, których można używać do pisania i uczenia się prostych programów w języku COBOL.

Jednym z takich emulatorów jest Hercules, który można łatwo zainstalować w systemie Windows, wykonując kilka prostych kroków, jak podano poniżej -

  • Pobierz i zainstaluj emulator Hercules, który jest dostępny na stronie domowej Hercules: www.hercules-390.eu

  • Po zainstalowaniu pakietu na komputerze z systemem Windows utworzy on folder podobny do C:/hercules/mvs/cobol.

  • Uruchom wiersz polecenia (CMD) i przejdź do katalogu C: / hercules / mvs / cobol na CMD.

  • Kompletny przewodnik po różnych poleceniach pisania i wykonywania programów w języku JCL i COBOL można znaleźć pod adresem:

    www.jaymoseley.com/hercules/installmvs/instmvs2.htm

Hercules to implementacja oprogramowania typu open source dla architektur systemu mainframe System / 370 i ESA / 390, będąca uzupełnieniem najnowszej 64-bitowej architektury z / Architecture. Hercules działa pod systemami Linux, Windows, Solaris, FreeBSD i Mac OS X.

Użytkownik może łączyć się z serwerem mainframe na wiele sposobów, takich jak cienki klient, fałszywy terminal, system klienta wirtualnego (VCS) lub system wirtualnego pulpitu (VDS). Każdy ważny użytkownik otrzymuje identyfikator logowania, który umożliwia wejście do interfejsu Z / OS (TSO / E lub ISPF).

Kompilowanie programów w języku COBOL

Aby wykonać program w języku COBOL w trybie wsadowym przy użyciu JCL, program musi zostać skompilowany i utworzony zostaje moduł ładujący ze wszystkimi podprogramami. JCL wykorzystuje moduł ładujący, a nie rzeczywisty program w czasie wykonywania. Biblioteki ładowania są konkatenowane i przekazywane do JCL w czasie wykonywania za pomocąJCLLIB lub STEPLIB.

Dostępnych jest wiele narzędzi do kompilowania programów typu mainframe do kompilowania programów w języku COBOL. Niektóre firmy używają narzędzi do zarządzania zmianami, takich jakEndevor, który kompiluje i przechowuje każdą wersję programu. Jest to przydatne w śledzeniu zmian wprowadzonych w programie.

//COMPILE   JOB ,CLASS = 6,MSGCLASS = X,NOTIFY = &SYSUID             
//*            
//STEP1     EXEC IGYCRCTL,PARM = RMODE,DYNAM,SSRANGE
//SYSIN     DD DSN = MYDATA.URMI.SOURCES(MYCOBB),DISP = SHR
//SYSLIB    DD DSN = MYDATA.URMI.COPYBOOK(MYCOPY),DISP = SHR
//SYSLMOD   DD DSN = MYDATA.URMI.LOAD(MYCOBB),DISP = SHR
//SYSPRINT  DD SYSOUT=*
//*

IGYCRCTL to narzędzie kompilatora IBM COBOL. Opcje kompilatora są przekazywane za pomocą parametru PARM. W powyższym przykładzie RMODE instruuje kompilator, aby używał trybu adresowania względnego w programie. Program w języku COBOL jest przekazywany za pomocą parametru SYSIN. Copybook to biblioteka używana przez program w SYSLIB.

Wykonywanie programów w języku COBOL

Poniżej podano przykład JCL, w którym program MYPROG jest wykonywany przy użyciu pliku wejściowego MYDATA.URMI.INPUT i tworzy dwa pliki wyjściowe zapisywane do bufora.

//COBBSTEP  JOB CLASS = 6,NOTIFY = &SYSUID
//
//STEP10    EXEC PGM = MYPROG,PARM = ACCT5000
//STEPLIB   DD DSN = MYDATA.URMI.LOADLIB,DISP = SHR
//INPUT1    DD DSN = MYDATA.URMI.INPUT,DISP = SHR
//OUT1      DD SYSOUT=*
//OUT2      DD SYSOUT=*
//SYSIN     DD *
//CUST1     1000
//CUST2     1001
/*

Moduł ładujący MYPROG znajduje się w MYDATA.URMI.LOADLIB. Należy zauważyć, że powyższego JCL można używać tylko dla modułu innego niż DB2 w języku COBOL.

Wykonywanie programów COBOL-DB2

Do uruchomienia programu COBOL-DB2 w JCL i programie używane jest specjalistyczne narzędzie IBM; Region DB2 i wymagane parametry są przekazywane jako dane wejściowe do narzędzia.

Kroki wykonywane podczas uruchamiania programu w języku COBOL-DB2 są następujące:

  • Podczas kompilacji programu COBOL-DB2 tworzony jest DBRM (moduł żądania bazy danych) wraz z modułem ładowania. DBRM zawiera instrukcje SQL programów w języku COBOL, których składnia została sprawdzona pod kątem poprawności.

  • DBRM jest powiązany z regionem DB2 (środowiskiem), w którym będzie działać język COBOL. Można to zrobić za pomocą narzędzia IKJEFT01 w JCL.

  • Po kroku wiązania program COBOL-DB2 jest uruchamiany przy użyciu IKJEFT01 (ponownie) z biblioteką ładowania i biblioteką DBRM jako danymi wejściowymi dla JCL.

//STEP001  EXEC PGM = IKJEFT01
//*
//STEPLIB  DD DSN = MYDATA.URMI.DBRMLIB,DISP = SHR
//*
//input files
//output files
//SYSPRINT DD SYSOUT=*
//SYSABOUT DD SYSOUT=*
//SYSDBOUT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//DISPLAY  DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//SYSTSPRT DD SYSOUT=*
//SYSTSIN  DD *
   DSN SYSTEM(SSID)
   RUN PROGRAM(MYCOBB) PLAN(PLANNAME) PARM(parameters to cobol program) -
   LIB('MYDATA.URMI.LOADLIB')
   END
/*

W powyższym przykładzie MYCOBB to program COBOL-DB2 uruchamiany przy użyciu IKJEFT01. Należy zauważyć, że nazwa programu, identyfikator podsystemu DB2 (SSID) i nazwa planu DB2 są przekazywane w instrukcji SYSTSIN DD. Biblioteka DBRM jest określona w STEPLIB.

Struktura programu w języku COBOL składa się z podziałów, jak pokazano na poniższej ilustracji -

Krótkie wprowadzenie tych podziałów podano poniżej -

  • Sectionssą logicznym podziałem logiki programu. Sekcja to zbiór akapitów.

  • Paragraphssą poddziałem sekcji lub oddziału. Jest to nazwa zdefiniowana przez użytkownika lub predefiniowana nazwa, po której następuje kropka, i składa się z zera lub więcej zdań / wpisów.

  • Sentencessą połączeniem jednego lub więcej stwierdzeń. Zdania pojawiają się tylko w dziale Procedura. Wyrok musi kończyć się kropką.

  • Statements to zrozumiałe instrukcje w języku COBOL, które wykonują pewne przetwarzanie.

  • Characters są najniższymi w hierarchii i nie mogą być podzielne.

Powyższe terminy można powiązać z programem COBOL w poniższym przykładzie -

PROCEDURE DIVISION.
A0000-FIRST-PARA SECTION.
FIRST-PARAGRAPH.
ACCEPT WS-ID            - Statement-1  -----|
MOVE '10' TO WS-ID      - Statement-2       |-- Sentence - 1
DISPLAY WS-ID           - Statement-3  -----|
.

Podziały

Program w języku COBOL składa się z czterech działów.

Dział identyfikacji

Jest to pierwszy i jedyny obowiązkowy podział każdego programu w języku COBOL. Programista i kompilator używają tego podziału do identyfikacji programu. W tym dziale ID PROGRAMU jest jedynym obowiązkowym paragrafem. PROGRAM-ID określa nazwę programu, która może składać się z 1 do 30 znaków.

Wypróbuj poniższy przykład przy użyciu Live Demo opcja online.

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
PROCEDURE DIVISION.
DISPLAY 'Welcome to Tutorialspoint'.
STOP RUN.

Podano poniżej JCL aby wykonać powyższy program w języku COBOL.

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

Welcome to Tutorialspoint

Wydział Środowiska

Podział środowiska służy do określania plików wejściowych i wyjściowych do programu. Składa się z dwóch sekcji -

  • Configuration sectiondostarcza informacji o systemie, w którym program jest napisany i wykonywany. Składa się z dwóch akapitów -

    • Komputer źródłowy - system użyty do skompilowania programu.

    • Komputer obiektowy - system służący do wykonywania programu.

  • Input-Output sectionzawiera informacje o plikach, które mają być użyte w programie. Składa się z dwóch akapitów -

    • Kontrola plików - udostępnia informacje o zewnętrznych zestawach danych używanych w programie.

    • Kontrola we / wy - dostarcza informacji o plikach używanych w programie.

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
   SOURCE-COMPUTER. XXX-ZOS.
   OBJECT-COMPUTER. XXX-ZOS.

INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT FILEN ASSIGN TO DDNAME
   ORGANIZATION IS SEQUENTIAL.

Podział danych

Podział danych służy do zdefiniowania zmiennych używanych w programie. Składa się z czterech sekcji -

  • File section służy do określenia struktury rekordu pliku.

  • Working-Storage section służy do deklarowania zmiennych tymczasowych i struktur plików używanych w programie.

  • Local-Storage sectionjest podobny do sekcji Working-Storage. Jedyną różnicą jest to, że zmienne będą przydzielane i inicjowane za każdym razem, gdy program rozpocznie wykonywanie.

  • Linkage section służy do opisywania nazw danych, które są odbierane z programu zewnętrznego.

COBOL Program

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT FILEN ASSIGN TO INPUT.
      ORGANIZATION IS SEQUENTIAL.
      ACCESS IS SEQUENTIAL.

DATA DIVISION.
   FILE SECTION.
   FD FILEN
   01 NAME PIC A(25).
   
   WORKING-STORAGE SECTION.
   01 WS-STUDENT PIC A(30).
   01 WS-ID PIC 9(5).

   LOCAL-STORAGE SECTION.
   01 LS-CLASS PIC 9(3).
   
   LINKAGE SECTION.
   01 LS-ID PIC 9(5).
   
PROCEDURE DIVISION.
   DISPLAY 'Executing COBOL program using JCL'.
STOP RUN.

Plik JCL wykonanie powyższego programu w języku COBOL wygląda następująco -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//INPUT DD DSN = ABC.EFG.XYZ,DISP = SHR

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

Executing COBOL program using JCL

Wydział Procedur

Podział procedury służy do uwzględnienia logiki programu. Składa się z wykonywalnych instrukcji wykorzystujących zmienne zdefiniowane w podziale danych. W tym podziale nazwy akapitów i sekcji są definiowane przez użytkownika.

Podział procedur musi zawierać co najmniej jedno stwierdzenie. Ostatnią instrukcją kończącą wykonanie w tym podziale jest alboSTOP RUN który jest używany w programach wywołujących lub EXIT PROGRAM który jest używany w wywołanych programach.

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NAME PIC A(30).
   01 WS-ID PIC 9(5) VALUE 12345.

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   DISPLAY 'Hello World'.
   MOVE 'TutorialsPoint' TO WS-NAME.
   DISPLAY "My name is : "WS-NAME.
   DISPLAY "My ID is : "WS-ID.
STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

Hello World
My name is : TutorialsPoint
My ID is : 12345

Zestaw znaków

„Postacie” znajdują się najniżej w hierarchii i nie można ich dalej dzielić. Zestaw znaków COBOL zawiera 78 znaków, które pokazano poniżej -

Sr.No. Opis postaci
1

A-Z

Alfabety (wielkie litery)

2

a-z

Alfabety (małe litery)

3

0-9

Numeryczne

4

 

Przestrzeń

5

+

Znak plus

6

-

Znak minus lub łącznik

7

*

Gwiazdka

8

/

Ukośnik

9

$

Znak waluty

10

,

Przecinek

11

;

Średnik

12

.

Punkt dziesiętny lub kropka

13

"

Cudzysłów

14

(

Lewy nawias

15

)

Prawy nawias

16

>

Lepszy niż

17

<

Mniej niż

18

:

Dwukropek

19

'

Apostrof

20

=

Znak równości

Arkusz kodowania

Program źródłowy języka COBOL musi być napisany w formacie akceptowanym przez kompilatory. Programy w języku COBOL są pisane na arkuszach kodowych COBOL. W każdym wierszu arkusza kodowego znajduje się 80 pozycji znaków.

Pozycje postaci są pogrupowane w następujących pięciu polach -

Pozycje Pole Opis
1-6 Numery kolumn Zarezerwowane dla numerów linii.
7 Wskaźnik Może mieć gwiazdkę (*) wskazującą komentarze, łącznik (-) wskazujący kontynuację i ukośnik (/) wskazujący wysuw formularza.
8-11 Obszar A Wszystkie działy, sekcje, akapity i niektóre wpisy specjalne COBOL muszą zaczynać się w obszarze A.
12-72 Obszar B Wszystkie instrukcje w języku COBOL muszą zaczynać się w obszarze B.
73-80 Obszar identyfikacji Może być używany w razie potrzeby przez programistę.

Przykład

Poniższy przykład przedstawia arkusz kodów w języku COBOL -

000100 IDENTIFICATION DIVISION.                                         000100
000200 PROGRAM-ID. HELLO.                                               000101
000250* THIS IS A COMMENT LINE                                          000102
000300 PROCEDURE DIVISION.                                              000103
000350 A000-FIRST-PARA.                                                 000104
000400     DISPLAY “Coding Sheet”.                                      000105
000500 STOP RUN.                                                        000106

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

Coding Sheet

Ciągi znaków

Ciągi znaków są tworzone przez łączenie pojedynczych znaków. Ciąg znaków może być

  • Comment,
  • Dosłowne lub
  • COBOL. Słowo.

Wszystkie ciągi znaków muszą być zakończone separators. Separator służy do oddzielania ciągów znaków.

Często używane separatory - spacja, przecinek, kropka, apostrof, lewy / prawy nawias i cudzysłów.

Komentarz

Komentarz to ciąg znaków, który nie wpływa na wykonanie programu. Może to być dowolna kombinacja znaków.

Istnieją dwa rodzaje komentarzy -

Linia komentarza

W dowolnej kolumnie można wpisać komentarz. Kompilator nie sprawdza wiersza komentarza pod kątem składni i traktuje go na potrzeby dokumentacji.

Wpis komentarza

Wpisy komentarzy to te, które są zawarte w opcjonalnych akapitach działu identyfikacji. Są napisane w obszarze B i programiści używają ich jako odniesienia.

Tekst wyróżniony w Bold to skomentowane wpisy w poniższym przykładzie -

000100 IDENTIFICATION DIVISION.                                         000100
000150 PROGRAM-ID. HELLO.                                               000101 
000200 AUTHOR. TUTORIALSPOINT.                                          000102
000250* THIS IS A COMMENT LINE                                          000103
000300 PROCEDURE DIVISION.                                              000104
000350 A000-FIRST-PARA.                                                 000105  
000360/ First Para Begins - Documentation Purpose                       000106
000400     DISPLAY “Comment line”.                                      000107
000500 STOP RUN.                                                        000108

JCL do wykonania programu w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

Comment Line

Dosłowny

Dosłowne to stała, która jest bezpośrednio zakodowana w programie. W poniższym przykładzie „Hello World” jest literałem.

PROCEDURE DIVISION.
DISPLAY 'Hello World'.

Istnieją dwa rodzaje literałów, jak omówiono poniżej -

Literał alfanumeryczny

Literały alfanumeryczne są ujęte w cudzysłowy lub apostrof. Długość może mieć maksymalnie 160 znaków. Apostrof lub cytat mogą być częścią dosłownego tylko wtedy, gdy są sparowane. Początek i koniec literału powinien być taki sam, apostrof lub cytat.

Example

Poniższy przykład przedstawia prawidłowe i niepoprawne literały alfanumeryczne -

Valid:
   ‘This is valid’
   "This is valid"
   ‘This isn’’t invalid’

Invalid:
   ‘This is invalid”
   ‘This isn’t valid’

Numeric Literal

Literał numeryczny to kombinacja cyfr od 0 do 9, +, - lub kropki dziesiętnej. Długość może mieć maksymalnie 18 znaków. Znak nie może być znakiem znajdującym się najbardziej po prawej stronie. Punkt dziesiętny nie powinien pojawiać się na końcu.

Example

Poniższy przykład przedstawia prawidłowe i niepoprawne literały numeryczne -

Valid:
   100
   +10.9
   -1.9

Invalid:
   1,00
   10.
   10.9-

COBOL Word

COBOL Słowo to ciąg znaków, który może być słowem zastrzeżonym lub słowem zdefiniowanym przez użytkownika. Długość może mieć maksymalnie 30 znaków.

Określony przez użytkownika

Słowa zdefiniowane przez użytkownika służą do nazywania plików, danych, rekordów, nazw akapitów i sekcji. Alfabety, cyfry i łączniki są dozwolone podczas tworzenia słów zdefiniowanych przez użytkownika. Nie możesz używać słów zastrzeżonych w języku COBOL.

Zastrzeżone słowa

Słowa zastrzeżone to słowa predefiniowane w języku COBOL. Oto różne typy zarezerwowanych słów, których często używamy -

  • Keywords takie jak DODAJ, AKCEPTUJ, PRZENIEŚ itp.

  • Special characters słowa takie jak +, -, *, <, <= itd

  • Figurative constants są wartościami stałymi, takimi jak ZERO, SPACJA itp. Wszystkie stałe wartości stałych graficznych są wymienione w poniższej tabeli.

Stałe symboliczne

Sr.No. Stałe graficzne i opis
1

HIGH-VALUES

Jeden lub więcej znaków, które będą na najwyższej pozycji w porządku malejącym.

2

LOW-VALUES

Co najmniej jeden znak ma zera w reprezentacji binarnej.

3

ZERO/ZEROES

Jedno lub więcej zera, w zależności od wielkości zmiennej.

4

SPACES

Jedna lub więcej spacji.

5

QUOTES

Pojedyncze lub podwójne cudzysłowy.

6

ALL literal

Wypełnia element danych literałem.

Data Division służy do definiowania zmiennych używanych w programie. Aby opisać dane w języku COBOL, należy zrozumieć następujące terminy -

  • Nazwa danych
  • Numer poziomu
  • Klauzula obrazkowa
  • Klauzula wartości
01            TOTAL-STUDENTS            PIC9(5)            VALUE '125'.
|                    |                    |                    |
|                    |                    |                    |
|                    |                    |                    | 
Level Number     Data Name           Picture Clause       Value Clause

Nazwa danych

Nazwy danych muszą być zdefiniowane w Dziale Danych przed ich użyciem w Dziale Procedur. Muszą mieć nazwę zdefiniowaną przez użytkownika; nie można używać słów zastrzeżonych. Nazwy danych odnoszą się do lokalizacji pamięci, w których przechowywane są rzeczywiste dane. Mogą być typu podstawowego lub grupowego.

Przykład

Poniższy przykład przedstawia prawidłowe i nieprawidłowe nazwy danych -

Valid:
   WS-NAME
   TOTAL-STUDENTS
   A100
   100B

Invalid:
   MOVE            (Reserved Words)
   COMPUTE         (Reserved Words)
   100             (No Alphabet)
   100+B           (+ is not allowed)

Numer poziomu

Numer poziomu służy do określenia poziomu danych w rekordzie. Służą do rozróżniania elementów elementarnych i grupowych. Elementy podstawowe można grupować, aby tworzyć elementy grupowe.

Sr.No. Numer i opis poziomu
1

01

Zapis opisu wpisu

2

02 to 49

Elementy grupowe i elementarne

3

66

Zmień nazwy elementów klauzuli

4

77

Pozycje, których nie można podzielić

5

88

Wpis nazwy warunku

  • Elementary itemsnie można dalej dzielić. Numer poziomu, nazwa danych, klauzula Picture i klauzula Value (opcjonalna) służą do opisu elementu elementarnego.

  • Group itemsskładają się z jednego lub więcej podstawowych elementów. Numer poziomu, nazwa danych i klauzula Wartość (opcjonalnie) służą do opisu elementu grupy. Numer poziomu grupy to zawsze 01.

Przykład

Poniższy przykład przedstawia elementy grupowe i elementarne -

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NAME    PIC X(25).                               ---> ELEMENTARY ITEM 
01 WS-CLASS   PIC 9(2)  VALUE  '10'.                   ---> ELEMENTARY ITEM

01 WS-ADDRESS.                                         ---> GROUP ITEM   
   05 WS-HOUSE-NUMBER    PIC 9(3).                     ---> ELEMENTARY ITEM
   05 WS-STREET          PIC X(15).                    ---> ELEMENTARY ITEM
   05 WS-CITY            PIC X(15).                    ---> ELEMENTARY ITEM
   05 WS-COUNTRY         PIC X(15)  VALUE 'INDIA'.     ---> ELEMENTARY ITEM

Klauzula obrazkowa

Klauzula Picture służy do definiowania następujących elementów -

  • Data typemoże być numeryczny, alfabetyczny lub alfanumeryczny. Typ numeryczny składa się tylko z cyfr od 0 do 9. Typ alfabetyczny składa się z liter od A do Z i spacji. Typ alfanumeryczny składa się z cyfr, liter i znaków specjalnych.

  • Signmoże być używany z danymi liczbowymi. Może to być + lub -.

  • Decimal point positionmoże być używany z danymi liczbowymi. Przyjęta pozycja to pozycja przecinka dziesiętnego i nieuwzględniona w danych.

  • Length definiuje liczbę bajtów używanych przez element danych.

Symbole używane w klauzuli Picture -

Sr.No. Symbol i opis
1

9

Numeryczne

2

A

Alfabetyczny

3

X

Alfanumeryczne

4

V

Niejawny dziesiętny

5

S

Znak

6

P

Założony dziesiętny

Przykład

Poniższy przykład pokazuje użycie klauzuli PIC -

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC S9(3)V9(2).
   01 WS-NUM2 PIC PPP999.
   01 WS-NUM3 PIC S9(3)V9(2) VALUE -123.45.
   01 WS-NAME PIC A(6) VALUE 'ABCDEF'.
   01 WS-ID PIC X(5) VALUE 'A121$'.

PROCEDURE DIVISION.
   DISPLAY "WS-NUM1 : "WS-NUM1.
   DISPLAY "WS-NUM2 : "WS-NUM2.
   DISPLAY "WS-NUM3 : "WS-NUM3.
   DISPLAY "WS-NAME : "WS-NAME.
   DISPLAY "WS-ID : "WS-ID.
STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

WS-NUM1 : +000.00
WS-NUM2 : .000000
WS-NUM3 : -123.45
WS-NAME : ABCDEF
WS-ID : A121$

Klauzula wartości

Klauzula wartości jest klauzulą ​​opcjonalną, która służy do inicjowania elementów danych. Wartości mogą być literałem numerycznym, literałem alfanumerycznym lub stałą graficzną. Może być używany zarówno z elementami grupowymi, jak i elementarnymi.

Przykład

Poniższy przykład pokazuje użycie klauzuli VALUE -

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 99V9 VALUE IS 3.5.
   01 WS-NAME PIC A(6) VALUE 'ABCD'.
   01 WS-ID PIC 99 VALUE ZERO.

PROCEDURE DIVISION.
   DISPLAY "WS-NUM1 : "WS-NUM1.
   DISPLAY "WS-NAME : "WS-NAME.
   DISPLAY "WS-ID   : "WS-ID.
STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

WS-NUM1 : 03.5
WS-NAME : ABCD
WS-ID   : 00

Czasowniki w języku COBOL są używane do podziału procedur przy przetwarzaniu danych. Instrukcja zawsze zaczyna się od czasownika w języku COBOL. Istnieje kilka czasowników w języku COBOL z różnymi typami czynności.

Czasowniki wejścia / wyjścia

Czasowniki wejścia / wyjścia służą do pobierania danych od użytkownika i wyświetlania wyników programów w języku COBOL. W tym procesie używane są następujące dwa czasowniki -

Accept Verb

Czasownik akceptacji służy do pobierania danych, takich jak data, godzina i dzień, z systemu operacyjnego lub bezpośrednio od użytkownika. Jeśli program przyjmuje dane od użytkownika, to musi zostać przekazany przez JCL. Podczas pobierania danych z systemu operacyjnego, opcja FROM jest uwzględniona, jak pokazano w poniższym przykładzie -

ACCEPT WS-STUDENT-NAME.
ACCEPT WS-DATE FROM SYSTEM-DATE.

Display Verb

Czasownik wyświetlania służy do wyświetlania danych wyjściowych programu w języku COBOL.

DISPLAY WS-STUDENT-NAME.
DISPLAY "System date is : " WS-DATE.

COBOL PROGRAM

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-STUDENT-NAME PIC X(25).
   01 WS-DATE PIC X(10).

PROCEDURE DIVISION.
   ACCEPT WS-STUDENT-NAME.
   ACCEPT WS-DATE FROM DATE.
   DISPLAY "Name :  " WS-STUDENT-NAME.
   DISPLAY "Date : " WS-DATE.

STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//INPUT DD DSN=PROGRAM.DIRECTORY,DISP=SHR
//SYSIN DD *
TutorialsPoint
/*

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

Name : TutorialsPoint
Date : 200623

Initialize Verb

Czasownik inicjalizacji służy do inicjowania elementu grupy lub elementu podstawowego. Nie można zainicjować nazw danych z klauzulą ​​RENAME. Numeryczne pozycje danych są zastępowane przez ZERO. Alfanumeryczne lub alfabetyczne pozycje danych zastępuje się SPACJAMI. Jeśli uwzględnimy termin REPLACING, wówczas elementy danych można zainicjować do podanej wartości zastępującej, jak pokazano w poniższym przykładzie -

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NAME PIC A(30) VALUE 'ABCDEF'.
   01 WS-ID PIC 9(5).
   01 WS-ADDRESS. 
   05 WS-HOUSE-NUMBER PIC 9(3).
   05 WS-COUNTRY PIC X(15).
   05 WS-PINCODE PIC 9(6) VALUE 123456.

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   INITIALIZE WS-NAME, WS-ADDRESS.
   INITIALIZE WS-ID REPLACING NUMERIC DATA BY 12345.
   DISPLAY "My name is   : "WS-NAME.
   DISPLAY "My ID is     : "WS-ID.
   DISPLAY "Address      : "WS-ADDRESS.
   DISPLAY "House Number : "WS-HOUSE-NUMBER.
   DISPLAY "Country      : "WS-COUNTRY.
   DISPLAY "Pincode      : "WS-PINCODE.

STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

My name is   :                               
My ID is     : 12345
Address      : 000               000000
House Number : 000
Country      :                
Pincode      : 000000

Move Verb

Czasownik przeniesienia służy do kopiowania danych z danych źródłowych do danych docelowych. Może być stosowany zarówno w elementarnych, jak i grupowych elementach danych. W przypadku elementów danych grupowych stosuje się MOVE CORRESPONDING / CORR. W opcji try it, MOVE CORR nie działa; ale na serwerze mainframe będzie działać.

Do przenoszenia danych z łańcucha używa się MOVE (x: l), gdzie x to pozycja początkowa, a l to długość. Dane zostaną obcięte, jeśli klauzula PIC docelowego elementu danych jest mniejsza niż klauzula PIC źródłowego elementu danych. Jeśli klauzula PIC docelowego elementu danych jest większa niż klauzula PIC źródłowego elementu danych, dodatkowe bajty zostaną dodane ZEROS lub SPACE. Poniższy przykład wyjaśnia to.

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(9).
   01 WS-NUM2 PIC 9(9).
   01 WS-NUM3 PIC 9(5).
   01 WS-NUM4 PIC 9(6).
   01 WS-ADDRESS. 
   05 WS-HOUSE-NUMBER PIC 9(3).
   05 WS-COUNTRY PIC X(5).
   05 WS-PINCODE PIC 9(6).
   01 WS-ADDRESS1. 
   05 WS-HOUSE-NUMBER1 PIC 9(3).
   05 WS-COUNTRY1 PIC X(5).
   05 WS-PINCODE1 PIC 9(6).

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   MOVE 123456789 TO WS-NUM1.
   MOVE WS-NUM1 TO WS-NUM2 WS-NUM3.
   MOVE WS-NUM1(3:6) TO WS-NUM4.
   MOVE 123 TO WS-HOUSE-NUMBER.
   MOVE 'INDIA' TO WS-COUNTRY.
   MOVE 112233 TO WS-PINCODE.
   MOVE WS-ADDRESS TO WS-ADDRESS1.

   DISPLAY "WS-NUM1     : " WS-NUM1
   DISPLAY "WS-NUM2     : " WS-NUM2
   DISPLAY "WS-NUM3     : " WS-NUM3
   DISPLAY "WS-NUM4     : " WS-NUM4
   DISPLAY "WS-ADDRESS  : " WS-ADDRESS
   DISPLAY "WS-ADDRESS1 : " WS-ADDRESS1

STOP RUN.

JCL aby wykonać powyższy program w języku COBOL.

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

WS-NUM1     : 123456789
WS-NUM2     : 123456789
WS-NUM3     : 56789
WS-NUM4     : 345678
WS-ADDRESS  : 123INDIA112233
WS-ADDRESS1 : 123INDIA112233

Legalne ruchy

Poniższa tabela zawiera informacje o legalnych posunięciach -

Alfabetyczny Alfanumeryczne Numeryczne
Alfabetyczny Możliwy Możliwy Niemożliwe
Alfanumeryczne Możliwy Możliwy Możliwy
Numeryczne Niemożliwe Możliwy Możliwy

Add Verb

Czasownik dodawania służy do dodawania dwóch lub więcej liczb i zapisywania wyniku w operandzie docelowym.

Składnia

Poniżej podano składnię Dodaj dwie lub więcej liczb -

ADD A B TO C D

ADD A B C TO D GIVING E

ADD CORR WS-GROUP1 TO WS-GROUP2

W składni-1, A, B, C są dodawane, a wynik jest przechowywany w C (C = A + B + C). A, B, D są dodawane, a wynik jest przechowywany w D (D = A + B + D).

W składni-2, A, B, C, D są dodawane, a wynik jest przechowywany w E (E = A + B + C + D).

W składni-3 dodawane są elementy podgrupy w obrębie WS-GROUP1 i WS-GROUP2, a wynik jest przechowywany w WS-GROUP2.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(9) VALUE 10 .
   01 WS-NUM2 PIC 9(9) VALUE 10.
   01 WS-NUM3 PIC 9(9) VALUE 10.
   01 WS-NUM4 PIC 9(9) VALUE 10.
   01 WS-NUMA PIC 9(9) VALUE 10.
   01 WS-NUMB PIC 9(9) VALUE 10.
   01 WS-NUMC PIC 9(9) VALUE 10.
   01 WS-NUMD PIC 9(9) VALUE 10.
   01 WS-NUME PIC 9(9) VALUE 10.

PROCEDURE DIVISION.
   ADD WS-NUM1 WS-NUM2 TO WS-NUM3 WS-NUM4.
   ADD WS-NUMA WS-NUMB WS-NUMC TO WS-NUMD GIVING WS-NUME.
   DISPLAY "WS-NUM1     : " WS-NUM1
   DISPLAY "WS-NUM2     : " WS-NUM2
   DISPLAY "WS-NUM3     : " WS-NUM3
   DISPLAY "WS-NUM4     : " WS-NUM4
   DISPLAY "WS-NUMA     : " WS-NUMA
   DISPLAY "WS-NUMB     : " WS-NUMB
   DISPLAY "WS-NUMC     : " WS-NUMC
   DISPLAY "WS-NUMD     : " WS-NUMD
   DISPLAY "WS-NUME     : " WS-NUME

STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

WS-NUM1     : 000000010
WS-NUM2     : 000000010
WS-NUM3     : 000000030
WS-NUM4     : 000000030
WS-NUMA     : 000000010
WS-NUMB     : 000000010
WS-NUMC     : 000000010
WS-NUMD     : 000000010
WS-NUME     : 000000040

Odejmij czasownik

Czasownik odejmowania jest używany do operacji odejmowania.

Składnia

Poniżej podano składnię operacji odejmowania -

SUBTRACT A B FROM C D

SUBTRACT A B C FROM D GIVING E

SUBTRACT CORR WS-GROUP1 TO WS-GROUP2

W składni-1, A i B są dodawane i odejmowane od C. Wynik jest przechowywany w C (C = C- (A + B)). A i B są dodawane i odejmowane od D. Wynik jest przechowywany w D (D = D- (A + B)).

W składni-2, A, B, C są dodawane i odejmowane od D. Wynik jest przechowywany w E (E = D- (A + B + C))

W składni-3 elementy podgrup w WS-GROUP1 i WS-GROUP2 są odejmowane, a wynik jest przechowywany w WS-GROUP2.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(9) VALUE 10 .
   01 WS-NUM2 PIC 9(9) VALUE 10.
   01 WS-NUM3 PIC 9(9) VALUE 100.
   01 WS-NUM4 PIC 9(9) VALUE 100.
   01 WS-NUMA PIC 9(9) VALUE 10.
   01 WS-NUMB PIC 9(9) VALUE 10.
   01 WS-NUMC PIC 9(9) VALUE 10.
   01 WS-NUMD PIC 9(9) VALUE 100.
   01 WS-NUME PIC 9(9) VALUE 10.

PROCEDURE DIVISION.
   SUBTRACT WS-NUM1 WS-NUM2 FROM WS-NUM3 WS-NUM4.
   SUBTRACT WS-NUMA WS-NUMB WS-NUMC FROM WS-NUMD GIVING WS-NUME.

   DISPLAY "WS-NUM1     : " WS-NUM1
   DISPLAY "WS-NUM2     : " WS-NUM2
   DISPLAY "WS-NUM3     : " WS-NUM3
   DISPLAY "WS-NUM4     : " WS-NUM4
   DISPLAY "WS-NUMA     : " WS-NUMA
   DISPLAY "WS-NUMB     : " WS-NUMB
   DISPLAY "WS-NUMC     : " WS-NUMC
   DISPLAY "WS-NUMD     : " WS-NUMD
   DISPLAY "WS-NUME     : " WS-NUME

STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

WS-NUM1     : 000000010
WS-NUM2     : 000000010
WS-NUM3     : 000000080
WS-NUM4     : 000000080
WS-NUMA     : 000000010
WS-NUMB     : 000000010
WS-NUMC     : 000000010
WS-NUMD     : 000000100
WS-NUME     : 000000070

Multiply Verb

Czasownik mnożenia jest używany do operacji mnożenia.

Składnia

Poniżej podano składnię mnożenia dwóch lub więcej liczb -

MULTIPLY A BY B C

MULTIPLY A BY B GIVING E

W składni-1, A i B są mnożone, a wynik jest przechowywany w B (B = A * B). A i C są mnożone, a wynik jest przechowywany w C (C = A * C).

W składni-2, A i B są mnożone, a wynik jest przechowywany w E (E = A * B).

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(9) VALUE 10 .
   01 WS-NUM2 PIC 9(9) VALUE 10.
   01 WS-NUM3 PIC 9(9) VALUE 10.
   01 WS-NUMA PIC 9(9) VALUE 10.
   01 WS-NUMB PIC 9(9) VALUE 10.
   01 WS-NUMC PIC 9(9) VALUE 10.

PROCEDURE DIVISION.
   MULTIPLY WS-NUM1 BY WS-NUM2 WS-NUM3.
   MULTIPLY WS-NUMA BY WS-NUMB GIVING WS-NUMC.
   
   DISPLAY "WS-NUM1     : " WS-NUM1
   DISPLAY "WS-NUM2     : " WS-NUM2
   DISPLAY "WS-NUM3     : " WS-NUM3
   DISPLAY "WS-NUMA     : " WS-NUMA
   DISPLAY "WS-NUMB     : " WS-NUMB
   DISPLAY "WS-NUMC     : " WS-NUMC
   
STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

WS-NUM1     : 000000010
WS-NUM2     : 000000100
WS-NUM3     : 000000100
WS-NUMA     : 000000010
WS-NUMB     : 000000010
WS-NUMC     : 000000100

Divide Verb

Dzielenie jest używane do operacji dzielenia.

Składnia

Poniżej podano składnię operacji dzielenia -

DIVIDE A INTO B

DIVIDE A BY B GIVING C REMAINDER R

W składni-1 B jest dzielone przez A, a wynik jest przechowywany w B (B = B / A).

W składni-2, A jest dzielone przez B i wynik jest przechowywany w C (C = A / B), a reszta jest przechowywana w R.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(9) VALUE 5.
   01 WS-NUM2 PIC 9(9) VALUE 250.
   01 WS-NUMA PIC 9(9) VALUE 100.
   01 WS-NUMB PIC 9(9) VALUE 15.
   01 WS-NUMC PIC 9(9).
   01 WS-REM PIC 9(9). 

PROCEDURE DIVISION.
   DIVIDE WS-NUM1 INTO WS-NUM2.
   DIVIDE WS-NUMA BY WS-NUMB GIVING WS-NUMC REMAINDER WS-REM.
   DISPLAY "WS-NUM1     : " WS-NUM1
   DISPLAY "WS-NUM2     : " WS-NUM2
   DISPLAY "WS-NUMA     : " WS-NUMA
   DISPLAY "WS-NUMB     : " WS-NUMB
   DISPLAY "WS-NUMC     : " WS-NUMC
   DISPLAY "WS-REM      : " WS-REM
   
STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

WS-NUM1     : 000000005
WS-NUM2     : 000000050
WS-NUMA     : 000000100
WS-NUMB     : 000000015
WS-NUMC     : 000000006
WS-REM      : 000000010

Instrukcja Compute

Instrukcja Compute służy do pisania wyrażeń arytmetycznych w języku COBOL. To jest zamiennik dodawania, odejmowania, mnożenia i dzielenia.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(9) VALUE 10 .
   01 WS-NUM2 PIC 9(9) VALUE 10.
   01 WS-NUM3 PIC 9(9) VALUE 10.
   01 WS-NUMA PIC 9(9) VALUE 50.
   01 WS-NUMB PIC 9(9) VALUE 10.
   01 WS-NUMC PIC 9(9).

PROCEDURE DIVISION.
   COMPUTE WS-NUMC= (WS-NUM1 * WS-NUM2) - (WS-NUMA / WS-NUMB) + WS-NUM3.
   DISPLAY "WS-NUM1     : " WS-NUM1
   DISPLAY "WS-NUM2     : " WS-NUM2
   DISPLAY "WS-NUM3     : " WS-NUM3
   DISPLAY "WS-NUMA     : " WS-NUMA
   DISPLAY "WS-NUMB     : " WS-NUMB
   DISPLAY "WS-NUMC     : " WS-NUMC

STOP RUN.

JCL aby wykonać powyższy program w języku COBOL.

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

WS-NUM1     : 000000010
WS-NUM2     : 000000010
WS-NUM3     : 000000010
WS-NUMA     : 000000050
WS-NUMB     : 000000010
WS-NUMC     : 000000105

Układ COBOL to opis użycia każdego pola i wartości w nim zawartych. Poniżej znajdują się wpisy opisu danych używane w języku COBOL -

  • Klauzula redefiniuje
  • Klauzula Renames
  • Klauzula użytkowania
  • Copybooks

Klauzula redefiniuje

Klauzula redefines służy do definiowania magazynu z innym opisem danych. Jeśli jeden lub więcej elementów danych nie jest używanych jednocześnie, to ta sama pamięć może być wykorzystana dla innego elementu danych. Zatem do tego samego miejsca przechowywania można odnosić się z różnymi elementami danych.

Składnia

Poniżej znajduje się składnia klauzuli Redefines -

01 WS-OLD PIC X(10).
01 WS-NEW1 REDEFINES WS-OLD PIC 9(8).
01 WS-NEW2 REDEFINES WS-OLD PIC A(10).

Poniżej znajdują się szczegóły użytych parametrów -

  • WS-OLD to pozycja przedefiniowana
  • WS-NEW1 i WS-NEW2 to przedefiniowanie przedmiotu

Numery poziomów przedefiniowanego przedmiotu i przedefiniowanego elementu muszą być takie same i nie mogą to być numery poziomu 66 lub 88. Nie używaj klauzuli VALUE z przedefiniowującym elementem. W sekcji Plik nie używaj klauzuli redefinines z numerem poziomu 01. Definicja przedefiniowania musi być kolejnym opisem danych, który chcesz przedefiniować. Przedefiniowany element zawsze będzie miał taką samą wartość jak przedefiniowany element.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-DESCRIPTION.
   05 WS-DATE1 VALUE '20140831'.
   10 WS-YEAR PIC X(4).
   10 WS-MONTH PIC X(2).
   10 WS-DATE PIC X(2).
   05 WS-DATE2 REDEFINES WS-DATE1 PIC 9(8).

PROCEDURE DIVISION.
   DISPLAY "WS-DATE1 : "WS-DATE1.
   DISPLAY "WS-DATE2 : "WS-DATE2.

STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje to następujący wynik -

WS-DATE1 : 20140831
WS-DATE2 : 20140831

Klauzula Renames

Klauzula Renames służy do nadawania różnych nazw istniejącym elementom danych. Służy do ponownego grupowania nazw danych i nadawania im nowej nazwy. Nowe nazwy danych można zmieniać w grupach lub elementarnych elementach. Poziom numer 66 jest zarezerwowany na zmiany nazw.

Syntax

Poniżej znajduje się składnia klauzuli Renames -

01 WS-OLD.
10 WS-A PIC 9(12).
10 WS-B PIC X(20).
10 WS-C PIC A(25).
10 WS-D PIC X(12).
66 WS-NEW RENAMES WS-A THRU WS-C.

Zmiana nazwy jest możliwa tylko na tym samym poziomie. W powyższym przykładzie WS-A, WS-B i WS-C są na tym samym poziomie. Definicja Renames musi być kolejnym opisem danych, którego nazwę chcesz zmienić. Nie używaj opcji Renames z numerem poziomu 01, 77 lub 66. Nazwy danych używane do zmiany nazw muszą występować w kolejności. Nie można zmienić nazw elementów danych z klauzulą ​​wystąpienia.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-DESCRIPTION.
   05 WS-NUM.
   10 WS-NUM1 PIC 9(2) VALUE 20.
   10 WS-NUM2 PIC 9(2) VALUE 56.
   05 WS-CHAR.
   10 WS-CHAR1 PIC X(2) VALUE 'AA'.
   10 WS-CHAR2 PIC X(2) VALUE 'BB'.
   66 WS-RENAME RENAMES WS-NUM2 THRU WS-CHAR2.

PROCEDURE DIVISION.
   DISPLAY "WS-RENAME : " WS-RENAME.
   
STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

WS-RENAME : 56AABB

Klauzula użytkowania

Klauzula użycia określa system operacyjny, w którym przechowywane są dane formatu. Nie można jej używać z poziomami 66 lub 88. Jeśli klauzula użycia jest określona na grupie, wszystkie elementy podstawowe będą miały tę samą klauzulę użycia. Różne opcje dostępne w klauzuli Usage są następujące -

Pokaz

Pozycja danych jest przechowywana w formacie ASCII, a każdy znak zajmuje 1 bajt. Jest to użycie domyślne.

Poniższy przykład oblicza liczbę wymaganych bajtów -

01 WS-NUM PIC S9(5)V9(3) USAGE IS DISPLAY.
It requires 8 bytes as sign and decimal doesn't require any byte.

01 WS-NUM PIC 9(5) USAGE IS DISPLAY.
It requires 5 bytes as sign.

COMPUTATIONAL / COMP

Pozycja danych jest przechowywana w formacie binarnym. Tutaj elementy danych muszą być liczbami całkowitymi.

Poniższy przykład oblicza liczbę wymaganych bajtów -

01 WS-NUM PIC S9(n) USAGE IS COMP.

If 'n' = 1 to 4, it takes 2 bytes.
If 'n' = 5 to 9, it takes 4 bytes.
If 'n' = 10 to 18, it takes 8 bytes.

COMP-1

Pozycja danych jest podobna do rzeczywistej lub zmiennoprzecinkowej i jest reprezentowana jako liczba zmiennoprzecinkowa o pojedynczej precyzji. Wewnętrznie dane są przechowywane w formacie szesnastkowym. COMP-1 nie akceptuje klauzuli PIC. Tutaj 1 słowo odpowiada 4 bajtom.

COMP-2

Element danych jest podobny do Long lub Double i jest reprezentowany jako liczba zmiennoprzecinkowa podwójnej precyzji. Wewnętrznie dane są przechowywane w formacie szesnastkowym. COMP-2 nie określa klauzuli PIC. Tutaj 2 słowo równa się 8 bajtom.

COMP-3

Pozycja danych jest przechowywana w spakowanym formacie dziesiętnym. Każda cyfra zajmuje pół bajta (1 półbajt), a znak jest przechowywany na skrajnym prawym miejscu.

Poniższy przykład oblicza liczbę wymaganych bajtów -

01 WS-NUM PIC 9(n) USAGE IS COMP.
Number of bytes = n/2 (If n is even)
Number of bytes = n/2 + 1(If n is odd, consider only integer part)

01 WS-NUM PIC 9(4) USAGE IS COMP-3 VALUE 21.
It requires 2 bytes of storage as each digit occupies half a byte.

01 WS-NUM PIC 9(5) USAGE IS COMP-3 VALUE 21.
It requires 3 bytes of storage as each digit occupies half a byte.

Zeszyty

Zeszyt w języku COBOL to zbiór kodu definiującego struktury danych. Jeśli w wielu programach używana jest określona struktura danych, to zamiast ponownie pisać tę samą strukturę danych, możemy skorzystać z zeszytów. Używamy instrukcji COPY, aby dołączyć zeszyt do programu. Instrukcja COPY jest używana w sekcji WorkingStorage.

Poniższy przykład zawiera zeszyt wewnątrz programu w języku COBOL -

DATA DIVISION.
WORKING-STORAGE SECTION.
COPY ABC.

Tutaj ABC to nazwa zeszytu. Następujące elementy danych z zeszytu ABC mogą być używane wewnątrz programu.

01 WS-DESCRIPTION.
   05 WS-NUM.
      10 WS-NUM1 PIC 9(2) VALUE 20.
      10 WS-NUM2 PIC 9(2) VALUE 56.
   05 WS-CHAR.
      10 WS-CHAR1 PIC X(2) VALUE 'AA'.
      10 WS-CHAR2 PIC X(2) VALUE 'BB'.

Instrukcje warunkowe służą do zmiany przepływu wykonywania w zależności od określonych warunków określonych przez programistę. Instrukcje warunkowe zawsze będą oceniane jako prawda lub fałsz. Warunki są używane w instrukcjach IF, Evaluate i Perform. Różne rodzaje warunków są następujące -

  • Instrukcja warunku IF
  • Warunek relacji
  • Stan znaku
  • Stan klasy
  • Warunek nazwy warunku
  • Stan negowany
  • Połączony stan

Instrukcja warunku IF

Instrukcja IF sprawdza warunki. Jeśli warunek jest spełniony, wykonywany jest blok IF; a jeśli warunek jest fałszywy, wykonywany jest blok ELSE.

END-IFsłuży do zakończenia bloku IF. Aby zakończyć blok IF, można użyć kropki zamiast END-IF. Ale zawsze lepiej jest używać END-IF dla wielu bloków IF.

Nested-IF- Bloki IF pojawiające się w innym bloku IF. Nie ma ograniczeń co do głębokości zagnieżdżonych instrukcji IF.

Składnia

Poniżej znajduje się składnia instrukcji warunkowych JEŻELI -

IF [condition] THEN
   [COBOL statements]
ELSE
   [COBOL statements]
END-IF.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(9).
   01 WS-NUM2 PIC 9(9).
   01 WS-NUM3 PIC 9(5).
   01 WS-NUM4 PIC 9(6).

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   MOVE 25 TO WS-NUM1 WS-NUM3.
   MOVE 15 TO WS-NUM2 WS-NUM4.
   
   IF WS-NUM1 > WS-NUM2 THEN
      DISPLAY 'IN LOOP 1 - IF BLOCK'
      
      IF WS-NUM3 = WS-NUM4 THEN
         DISPLAY 'IN LOOP 2 - IF BLOCK'
      ELSE
         DISPLAY 'IN LOOP 2 - ELSE BLOCK'
      END-IF
      
   ELSE
      DISPLAY 'IN LOOP 1 - ELSE BLOCK'
   END-IF.
   
STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

IN LOOP 1 - IF BLOCK
IN LOOP 2 - ELSE BLOCK

Warunek relacji

Warunek relacji porównuje dwa operandy, z których każdy może być identyfikatorem, literałem lub wyrażeniem arytmetycznym. Algebraiczne porównanie pól numerycznych jest wykonywane niezależnie od rozmiaru i klauzuli użycia.

For non-numeric operands

Jeśli porównuje się dwa nieliczbowe operandy o równej wielkości, znaki są porównywane od lewej z odpowiednimi pozycjami, aż do osiągnięcia końca. Operand zawierający większą liczbę znaków jest deklarowany jako większy.

Jeżeli porównuje się dwa nieliczbowe operandy o nierównych rozmiarach, to do krótszego elementu danych dodaje się spacje na końcu, aż rozmiar argumentów stanie się równy, a następnie porównuje się go zgodnie z regułami wymienionymi w poprzednim punkcie.

Składnia

Poniżej podano składnię instrukcji warunku relacji -

[Data Name/Arithmetic Operation]

   [IS] [NOT] 

[Equal to (=),Greater than (>), Less than (<), 
Greater than or Equal (>=), Less than or equal (<=) ]

[Data Name/Arithmetic Operation]

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(9).
   01 WS-NUM2 PIC 9(9).

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   MOVE 25 TO WS-NUM1.
   MOVE 15 TO WS-NUM2.
   
   IF WS-NUM1 IS GREATER THAN OR EQUAL TO WS-NUM2 THEN
      DISPLAY 'WS-NUM1 IS GREATER THAN WS-NUM2'
   ELSE
      DISPLAY 'WS-NUM1 IS LESS THAN WS-NUM2'
   END-IF.
   
STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje to następujący wynik -

WS-NUM1 IS GREATER THAN WS-NUM2

Stan znaku

Warunek znaku służy do sprawdzania znaku operandu numerycznego. Określa, czy dana wartość liczbowa jest większa, mniejsza lub równa ZERO.

Składnia

Poniżej znajduje się składnia instrukcji warunku Sign -

[Data Name/Arithmetic Operation] 

   [IS] [NOT] 

[Positive, Negative or Zero]

[Data Name/Arithmetic Operation]

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC S9(9) VALUE -1234.
   01 WS-NUM2 PIC S9(9) VALUE 123456.

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   IF WS-NUM1 IS POSITIVE THEN
      DISPLAY 'WS-NUM1 IS POSITIVE'.
      
   IF WS-NUM1 IS NEGATIVE THEN
      DISPLAY 'WS-NUM1 IS NEGATIVE'.
      
   IF WS-NUM1 IS ZERO THEN
      DISPLAY 'WS-NUM1 IS ZERO'.
      
   IF WS-NUM2 IS POSITIVE THEN
      DISPLAY 'WS-NUM2 IS POSITIVE'.

STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje to następujący wynik -

WS-NUM1 IS NEGATIVE
WS-NUM2 IS POSITIVE

Stan klasy

Warunek klasy służy do sprawdzania, czy operand zawiera tylko litery lub dane liczbowe. Spacje są brane pod uwagę w alfabetycznym, alfabetycznym-dolnym i alfabetycznym-górnym.

Składnia

Poniżej znajduje się składnia instrukcji warunku klasy -

[Data Name/Arithmetic Operation>]

   [IS] [NOT] 

[NUMERIC, ALPHABETIC, ALPHABETIC-LOWER, ALPHABETIC-UPPER]

[Data Name/Arithmetic Operation]

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC X(9) VALUE 'ABCD '.
   01 WS-NUM2 PIC 9(9) VALUE 123456789.

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   
   IF WS-NUM1 IS ALPHABETIC THEN
      DISPLAY 'WS-NUM1 IS ALPHABETIC'.
      
   IF WS-NUM1 IS NUMERIC THEN
      DISPLAY 'WS-NUM1 IS NUMERIC'.
      
   IF WS-NUM2 IS NUMERIC THEN
      DISPLAY 'WS-NUM2 IS NUMERIC'.
   
STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

WS-NUM1 IS ALPHABETIC
WS-NUM2 IS NUMERIC

Nazwa warunku Warunek

Nazwa warunku to nazwa zdefiniowana przez użytkownika. Zawiera zestaw wartości określonych przez użytkownika. Zachowuje się jak zmienne boolowskie. Są one zdefiniowane na poziomie 88. Nie będą miały klauzuli PIC.

Składnia

Poniżej znajduje się składnia instrukcji warunkowych zdefiniowanych przez użytkownika -

88 [Condition-Name] VALUE [IS, ARE] [LITERAL] [THRU LITERAL].

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM PIC 9(3).
   88 PASS VALUES ARE 041 THRU 100.
   88 FAIL VALUES ARE 000 THRU 40.

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   MOVE 65 TO WS-NUM.
   
   IF PASS 
      DISPLAY 'Passed with ' WS-NUM ' marks'.
      
   IF FAIL 
      DISPLAY 'FAILED with ' WS-NUM 'marks'.
      
STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

Passed with 065 marks

Stan negowany

Warunek wykluczony jest podawany za pomocą słowa kluczowego NOT. Jeśli warunek jest prawdziwy, a przed nim NIE podaliśmy, jego ostateczna wartość będzie fałszywa.

Składnia

Poniżej znajduje się składnia wyrażeń warunkowych z wykluczeniem -

IF NOT [CONDITION] 
   COBOL Statements
END-IF.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(2) VALUE 20.
   01 WS-NUM2 PIC 9(9) VALUE 25.

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   
   IF NOT WS-NUM1 IS LESS THAN WS-NUM2 THEN
      DISPLAY 'IF-BLOCK'
   ELSE
      DISPLAY 'ELSE-BLOCK'
   END-IF.
   
STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

ELSE-BLOCK

Połączony stan

Warunek złożony zawiera co najmniej dwa warunki połączone za pomocą operatorów logicznych ORAZ lub LUB.

Składnia

Poniżej znajduje się składnia połączonych instrukcji warunkowych -

IF [CONDITION] AND [CONDITION]
   COBOL Statements
END-IF.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(2) VALUE 20.
   01 WS-NUM2 PIC 9(2) VALUE 25.
   01 WS-NUM3 PIC 9(2) VALUE 20.

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   
   IF WS-NUM1 IS LESS THAN WS-NUM2 AND WS-NUM1=WS-NUM3 THEN
      DISPLAY 'Both condition OK'
   ELSE
      DISPLAY 'Error'
   END-IF.
   
STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

Both condition OK

Oceń czasownik

Czasownik oceny jest zamiennikiem serii instrukcji IF-ELSE. Może służyć do oceny więcej niż jednego warunku. Jest podobny do instrukcji SWITCH w programach C.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-A PIC 9 VALUE 0.
   
PROCEDURE DIVISION.
   MOVE 3 TO WS-A.
   
   EVALUATE TRUE
      WHEN WS-A > 2
         DISPLAY 'WS-A GREATER THAN 2'

      WHEN WS-A < 0
         DISPLAY 'WS-A LESS THAN 0'

      WHEN OTHER
         DISPLAY 'INVALID VALUE OF WS-A'
   END-EVALUATE.
   
STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

WS-A GREATER THAN 2

Jest kilka zadań, które trzeba wykonywać w kółko, na przykład czytanie każdego rekordu pliku do końca. Instrukcje pętli używane w języku COBOL to -

  • Perform Thru
  • Wykonuj do
  • Perform Times
  • Wykonuj zmienne

Perform Thru

Perform Thru służy do wykonywania serii akapitów przez podanie nazwy pierwszego i ostatniego akapitu w sekwencji. Po wykonaniu ostatniego akapitu kontrola jest zwracana.

In-line Perform

Instrukcje wewnątrz PERFORM będą wykonywane do osiągnięcia END-PERFORM.

Składnia

Poniżej znajduje się składnia wykonania In-line -

PERFORM 
   DISPLAY 'HELLO WORLD'
END-PERFORM.

Wydajność poza linią

Tutaj instrukcja jest wykonywana w jednym akapicie, a następnie sterowanie jest przenoszone do innego akapitu lub sekcji.

Składnia

Poniżej znajduje się składnia wykonania Out-of-line -

PERFORM PARAGRAPH1 THRU PARAGRAPH2

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

PROCEDURE DIVISION.
   A-PARA.
   PERFORM DISPLAY 'IN A-PARA'
   END-PERFORM.
   PERFORM C-PARA THRU E-PARA.
   
   B-PARA.
   DISPLAY 'IN B-PARA'.
   STOP RUN.
   
   C-PARA.
   DISPLAY 'IN C-PARA'.
   
   D-PARA.
   DISPLAY 'IN D-PARA'.
   
   E-PARA.
   DISPLAY 'IN E-PARA'.

JCL aby wykonać powyższy program w języku COBOL.

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

IN A-PARA
IN C-PARA
IN D-PARA
IN E-PARA
IN B-PARA

Wykonuj do

W „wykonuj do” akapit jest wykonywany, dopóki dany warunek nie stanie się prawdziwy. „Z testem przed” jest warunkiem domyślnym i wskazuje, że warunek jest sprawdzany przed wykonaniem instrukcji w akapicie.

Składnia

Poniżej znajduje się składnia wykonywania do -

PERFORM A-PARA UNTIL COUNT=5

PERFORM A-PARA WITH TEST BEFORE UNTIL COUNT=5

PERFORM A-PARA WITH TEST AFTER UNTIL COUNT=5

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-CNT PIC 9(1) VALUE 0. 

PROCEDURE DIVISION.
   A-PARA.
   PERFORM B-PARA WITH TEST AFTER UNTIL WS-CNT>3.
   STOP RUN.
   
   B-PARA.
   DISPLAY 'WS-CNT : 'WS-CNT.
   ADD 1 TO WS-CNT.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

WS-CNT : 0
WS-CNT : 1
WS-CNT : 2
WS-CNT : 3

Perform Times

W „czasie wykonania” akapit zostanie wykonany określoną liczbę razy.

Składnia

Poniżej znajduje się składnia czasów wykonania -

PERFORM A-PARA 5 TIMES.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

PROCEDURE DIVISION.
   A-PARA.
   PERFORM B-PARA 3 TIMES.
   STOP RUN.
   
   B-PARA.
   DISPLAY 'IN B-PARA'.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

IN B-PARA
IN B-PARA
IN B-PARA

Wykonuj zmienne

W przypadku dokonywania zmian, akapit będzie wykonywany, dopóki warunek w frazie Dopóki nie stanie się prawdziwy.

Składnia

Poniżej znajduje się składnia wykonywania zmiennych -

PERFORM A-PARA VARYING A FROM 1 BY 1 UNTIL A = 5.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-A PIC 9 VALUE 0.

PROCEDURE DIVISION.
   A-PARA.
   PERFORM B-PARA VARYING WS-A FROM 1 BY 1 UNTIL WS-A=5
   STOP RUN.
   
   B-PARA.
   DISPLAY 'IN B-PARA ' WS-A.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

IN B-PARA 1
IN B-PARA 2
IN B-PARA 3
IN B-PARA 4

GO TO Oświadczenie

Instrukcja GO TO służy do zmiany przepływu wykonywania w programie. W wyciągach GO TO przelew odbywa się tylko w kierunku do przodu. Służy do zamykania akapitu. Poniżej przedstawiono różne typy instrukcji GO TO -

Bezwarunkowe PRZEJDŹ DO

GO TO para-name.

Warunkowe PRZEJDŹ DO

GO TO para-1 para-2 para-3 DEPENDING ON x.

Jeśli „x” jest równe 1, to kontrola zostanie przeniesiona do pierwszego akapitu; a jeśli „x” jest równe 2, to kontrola zostanie przeniesiona do drugiego akapitu i tak dalej.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-A PIC 9 VALUE 2.
   
PROCEDURE DIVISION.
   A-PARA.
   DISPLAY 'IN A-PARA'
   GO TO B-PARA.
   
   B-PARA.
   DISPLAY 'IN B-PARA '.
   GO TO C-PARA D-PARA DEPENDING ON WS-A.
   
   C-PARA.
   DISPLAY 'IN C-PARA '.
   
   D-PARA.
   DISPLAY 'IN D-PARA '.
   STOP RUN.

JCL aby wykonać powyższy program w języku COBOL:

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik:

IN A-PARA
IN B-PARA 
IN D-PARA

Instrukcje obsługi ciągów w języku COBOL służą do wykonywania wielu operacji funkcjonalnych na łańcuchach. Poniżej znajdują się instrukcje obsługi ciągów -

  • Inspect
  • String
  • Unstring

Sprawdzać

Czasownik sprawdzania służy do liczenia lub zastępowania znaków w ciągu. Operacje na łańcuchach mogą być wykonywane na wartościach alfanumerycznych, numerycznych lub alfabetycznych. Operacje kontrolne są wykonywane od lewej do prawej. Opcje używane do operacji na łańcuchach są następujące -

Tallying

Opcja Tallying służy do liczenia znaków ciągu.

Syntax

Poniżej znajduje się składnia opcji Tallying -

INSPECT input-string
TALLYING output-count FOR ALL CHARACTERS

Używane parametry to -

  • ciąg-wejściowy - ciąg, którego znaki mają być liczone.
  • output-count - pozycja danych do przechowywania liczby znaków.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-CNT1 PIC 9(2) VALUE 0.
   01 WS-CNT2 PIC 9(2) VALUE 0.
   01 WS-STRING PIC X(15) VALUE 'ABCDACDADEAAAFF'.
   
PROCEDURE DIVISION.
   INSPECT WS-STRING TALLYING WS-CNT1 FOR CHARACTER.
   DISPLAY "WS-CNT1 : "WS-CNT1.
   INSPECT WS-STRING TALLYING WS-CNT2 FOR ALL 'A'.
   DISPLAY "WS-CNT2 : "WS-CNT2
   
STOP RUN.

JCL aby wykonać powyższy program w języku COBOL.

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

WS-CNT1 : 15
WS-CNT2 : 06

Wymiana

Opcja zamiany służy do zamiany znaków ciągu.

Syntax

Poniżej znajduje się składnia opcji Zastąpienie -

INSPECT input-string REPLACING ALL char1 BY char2.

Użyty parametr to -

  • input-string - ciąg, którego znaki mają zostać zastąpione ze znaku1 na znak2.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-STRING PIC X(15) VALUE 'ABCDACDADEAAAFF'.

PROCEDURE DIVISION.
   DISPLAY "OLD STRING : "WS-STRING.
   INSPECT WS-STRING REPLACING ALL 'A' BY 'X'.
   DISPLAY "NEW STRING : "WS-STRING.
   
STOP RUN.

JCL aby wykonać powyższy program w języku COBOL.

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

OLD STRING : ABCDACDADEAAAFF
NEW STRING : XBCDXCDXDEXXXFF

Strunowy

Czasownik typu string służy do łączenia ciągów. Za pomocą instrukcji STRING można połączyć dwa lub więcej ciągów znaków, aby utworzyć dłuższy ciąg. Klauzula „Ograniczone przez” jest obowiązkowa.

Syntax

Poniżej znajduje się składnia czasownika typu String -

STRING ws-string1 DELIMITED BY SPACE
   ws-string2 DELIMITED BY SIZE
   INTO ws-destination-string
   WITH POINTER ws-count
   ON OVERFLOW DISPLAY message1
   NOT ON OVERFLOW DISPLAY message2
END-STRING.

Poniżej znajdują się szczegóły użytych parametrów -

  • ws-string1 i ws-string2: ciągi wejściowe do konkatenacji
  • ws-string: ciąg wyjściowy
  • ws-count: służy do liczenia długości nowego połączonego ciągu
  • Rozdzielany określa koniec łańcucha
  • Wskaźnik i przepełnienie są opcjonalne

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-STRING PIC A(30).
   01 WS-STR1 PIC A(15) VALUE 'Tutorialspoint'.
   01 WS-STR2 PIC A(7) VALUE 'Welcome'.
   01 WS-STR3 PIC A(7) VALUE 'To AND'.
   01 WS-COUNT PIC 99 VALUE 1.

PROCEDURE DIVISION.
   STRING WS-STR2 DELIMITED BY SIZE
      WS-STR3 DELIMITED BY SPACE
      WS-STR1 DELIMITED BY SIZE
      INTO WS-STRING 
      WITH POINTER WS-COUNT
      ON OVERFLOW DISPLAY 'OVERFLOW!' 
   END-STRING.
   
   DISPLAY 'WS-STRING : 'WS-STRING.
   DISPLAY 'WS-COUNT : 'WS-COUNT.

STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

WS-STRING : WelcomeToTutorialspoint       
WS-COUNT : 25

Odsznurować

Czasownik uwalniający jest używany do dzielenia jednego ciągu na wiele podciągów. Klauzula ograniczona przez jest obowiązkowa.

Syntax

Poniżej znajduje się składnia czasownika Unstring -

UNSTRING ws-string DELIMITED BY SPACE
INTO ws-str1, ws-str2
WITH POINTER ws-count
ON OVERFLOW DISPLAY message
NOT ON OVERFLOW DISPLAY message
END-UNSTRING.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-STRING PIC A(30) VALUE 'WELCOME TO TUTORIALSPOINT'.
   01 WS-STR1 PIC A(7).
   01 WS-STR2 PIC A(2).
   01 WS-STR3 PIC A(15).
   01 WS-COUNT PIC 99 VALUE 1.

PROCEDURE DIVISION.
   UNSTRING WS-STRING DELIMITED BY SPACE
      INTO WS-STR1, WS-STR2, WS-STR3
   END-UNSTRING.
   
   DISPLAY 'WS-STR1 : 'WS-STR1.
   DISPLAY 'WS-STR2 : 'WS-STR2.
   DISPLAY 'WS-STR3 : 'WS-STR3.
   
STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

WS-STR1 : WELCOME
WS-STR2 : TO
WS-STR3 : TUTORIALSPOINT

Tablice w języku COBOL są nazywane tabelami. Tablica jest liniową strukturą danych i jest zbiorem pojedynczych elementów danych tego samego typu. Pozycje danych w tabeli są sortowane wewnętrznie.

Deklaracja tabeli

Tabela jest zadeklarowana w Data Division. Occursklauzula służy do definiowania tabeli. Klauzula Occurs wskazuje na powtórzenie definicji nazwy danych. Może być używany tylko z numerami poziomów zaczynającymi się od 02 do 49. Nie używaj klauzuli występuje z Redefines. Opis tabeli jednowymiarowej i dwuwymiarowej jest następujący -

Tabela jednowymiarowa

W jednowymiarowej tabeli occursklauzula jest używana tylko raz w deklaracji. WSTABLE to element grupy zawierający tabelę. WS-B nazywa elementy tabeli, które występują 10 razy.

Syntax

Poniżej znajduje się składnia definiowania jednowymiarowej tabeli -

01 WS-TABLE.
   05 WS-A PIC A(10) OCCURS 10 TIMES.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-A PIC A(10) VALUE 'TUTORIALS' OCCURS 5 TIMES.     

PROCEDURE DIVISION.
   DISPLAY "ONE-D TABLE : "WS-TABLE.
STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

ONE-D TABLE : TUTORIALS TUTORIALS TUTORIALS TUTORIALS TUTORIALS

Tabela dwuwymiarowa

Tworzona jest dwuwymiarowa tabela, w której oba elementy danych mają zmienną długość. W celach informacyjnych przejrzyj składnię, a następnie spróbuj przeanalizować tabelę. Pierwsza tablica (WS-A) może wystąpić od 1 do 10 razy, a wewnętrzna tablica (WS-C) może wystąpić od 1 do 5 razy. Każdy wpis WS-A będzie odpowiadał 5 wpisom WS-C.

Syntax

Poniżej znajduje się składnia definiowania dwuwymiarowej tabeli -

01 WS-TABLE.
   05 WS-A OCCURS 10 TIMES.
      10 WS-B PIC A(10).
      10 WS-C OCCURS 5 TIMES.
         15 WS-D PIC X(6).

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-A OCCURS 2 TIMES.
         10 WS-B PIC A(10) VALUE ' TUTORIALS'.
         10 WS-C OCCURS 2 TIMES.
            15 WS-D PIC X(6) VALUE ' POINT'.

PROCEDURE DIVISION.
   DISPLAY "TWO-D TABLE : "WS-TABLE.

STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

TWO-D TABLE :  TUTORIALS POINT POINT TUTORIALS POINT POINT

Indeks

Dostęp do poszczególnych elementów tabeli można uzyskać za pomocą indeksu dolnego. Wartości indeksu dolnego mogą wynosić od 1 do liczby wystąpień tabeli. Indeks dolny może być dowolną liczbą dodatnią. Nie wymaga żadnej deklaracji w zakresie podziału danych. Jest tworzony automatycznie z klauzulą ​​wystąpienia.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-A OCCURS 3 TIMES.
         10 WS-B PIC A(2).
         10 WS-C OCCURS 2 TIMES.
            15 WS-D PIC X(3).

PROCEDURE DIVISION.
   MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE.
   DISPLAY 'WS-TABLE  : ' WS-TABLE.
   DISPLAY 'WS-A(1)   : ' WS-A(1).
   DISPLAY 'WS-C(1,1) : ' WS-C(1,1).
   DISPLAY 'WS-C(1,2) : ' WS-C(1,2).
   DISPLAY 'WS-A(2)   : ' WS-A(2).
   DISPLAY 'WS-C(2,1) : ' WS-C(2,1).
   DISPLAY 'WS-C(2,2) : ' WS-C(2,2).
   DISPLAY 'WS-A(3)   : ' WS-A(3).
   DISPLAY 'WS-C(3,1) : ' WS-C(3,1).
   DISPLAY 'WS-C(3,2) : ' WS-C(3,2).
   
STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

WS-TABLE  : 12ABCDEF34GHIJKL56MNOPQR
WS-A(1)   : 12ABCDEF
WS-C(1,1) : ABC
WS-C(1,2) : DEF
WS-A(2)   : 34GHIJKL
WS-C(2,1) : GHI
WS-C(2,2) : JKL
WS-A(3)   : 56MNOPQR
WS-C(3,1) : MNO
WS-C(3,2) : PQR

Indeks

Dostęp do elementów tabeli można również uzyskać za pomocą indeksu. Indeks to przemieszczenie elementu od początku tabeli. Indeks jest deklarowany za pomocą klauzuli Occurs za pomocą klauzuli INDEXED BY. Wartość indeksu można zmienić za pomocą instrukcji SET i opcji PERFORM Varying.

Syntax

Poniżej znajduje się składnia definiowania indeksu w tabeli -

01 WS-TABLE.
   05 WS-A PIC A(10) OCCURS 10 TIMES INDEXED BY I.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-A OCCURS 3 TIMES INDEXED BY I.
         10 WS-B PIC A(2).
         10 WS-C OCCURS 2 TIMES INDEXED BY J.
            15 WS-D PIC X(3).

PROCEDURE DIVISION.
   MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE.
   PERFORM A-PARA VARYING I FROM 1 BY 1 UNTIL I >3 
   STOP RUN.
   
   A-PARA.
   PERFORM C-PARA VARYING J FROM 1 BY 1 UNTIL J>2.
   
   C-PARA.
   DISPLAY WS-C(I,J).

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

ABC
DEF
GHI
JKL
MNO
PQR

Instrukcja Set

Instrukcja set służy do zmiany wartości indeksu. Czasownik set jest używany do inicjowania, zwiększania lub zmniejszania wartości indeksu. Jest używany z funkcją Wyszukaj i Wyszukaj wszystko, aby zlokalizować elementy w tabeli.

Syntax

Poniżej znajduje się składnia użycia instrukcji Set -

SET I J TO positive-number
SET I TO J
SET I TO 5
SET I J UP BY 1
SET J DOWN BY 5

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-A OCCURS 3 TIMES INDEXED BY I.
         10 WS-B PIC A(2).
         10 WS-C OCCURS 2 TIMES INDEXED BY J.
            15 WS-D PIC X(3).

PROCEDURE DIVISION.
   MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE.
   SET I J TO 1.
   DISPLAY WS-C(I,J).
   SET I J UP BY 1.
   DISPLAY WS-C(I,J).
   
STOP RUN.

JCL aby wykonać powyższy program w języku COBOL.

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

ABC
JKL

Szukaj

Wyszukiwanie to liniowa metoda wyszukiwania, która służy do znajdowania elementów wewnątrz tabeli. Można to wykonać zarówno na tabeli posortowanej, jak i niesortowanej. Jest używany tylko dla tabel zadeklarowanych frazą indeksu. Zaczyna się od początkowej wartości indeksu. Jeśli poszukiwany element nie zostanie znaleziony, to indeks jest automatycznie zwiększany o 1 i trwa do końca tabeli.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-A PIC X(1) OCCURS 18 TIMES INDEXED BY I.
   01 WS-SRCH PIC A(1) VALUE 'M'.

PROCEDURE DIVISION.
   MOVE 'ABCDEFGHIJKLMNOPQR' TO WS-TABLE.
   SET I TO 1.
   SEARCH WS-A
      AT END DISPLAY 'M NOT FOUND IN TABLE'
      WHEN WS-A(I) = WS-SRCH
      DISPLAY 'LETTER M FOUND IN TABLE'
   END-SEARCH.  

STOP RUN.

JCL aby wykonać powyższy program w języku COBOL.

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

LETTER M FOUND IN TABLE

Wyszukaj wszystko

Search All to binarna metoda wyszukiwania, która służy do znajdowania elementów wewnątrz tabeli. Tabela musi być posortowana dla opcji Wyszukaj wszystko. Indeks nie wymaga inicjalizacji. W wyszukiwaniu binarnym tabela jest dzielona na dwie połowy i określa, w której połowie znajduje się poszukiwany element. Ten proces powtarza się do momentu znalezienia elementu lub osiągnięcia końca.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-RECORD OCCURS 10 TIMES ASCENDING KEY IS WS-NUM INDEXED BY I.
      10 WS-NUM PIC 9(2).
      10 WS-NAME PIC A(3).

PROCEDURE DIVISION.
   MOVE '12ABC56DEF34GHI78JKL93MNO11PQR' TO WS-TABLE.
   SEARCH ALL WS-RECORD
     AT END DISPLAY 'RECORD NOT FOUND'
     WHEN WS-NUM(I) = 93
     DISPLAY 'RECORD FOUND '
     DISPLAY WS-NUM(I)
     DISPLAY WS-NAME(I)

END-SEARCH.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

RECORD FOUND 
93
MNO

Koncepcja plików w języku COBOL różni się od tej w C / C ++. Ucząc się podstaw „Plik” w języku COBOL, nie należy korelować koncepcji obu języków. Zamiast tego w języku COBOL nie można używać zwykłych plików tekstowychPS (Physical Sequential) i VSAMpliki są używane. Pliki PS zostaną omówione w tym module.

Aby zrozumieć obsługę plików w języku COBOL, trzeba znać podstawowe pojęcia. Te terminy służą jedynie do zrozumienia podstaw obsługi plików. Bardziej szczegółowa terminologia zostanie omówiona w rozdziale „Czasowniki dotyczące obsługi plików”. Poniżej przedstawiono podstawowe terminy -

  • Field
  • Record
  • Dokumentacja fizyczna
  • Rekord logiczny
  • File

Poniższy przykład pomaga w zrozumieniu tych terminów -

Pole

Pole służy do wskazania przechowywanych danych o elemencie. Reprezentuje pojedynczy element, jak pokazano w powyższym przykładzie, taki jak identyfikator ucznia, nazwisko, oceny, suma ocen i procent. Liczba znaków w dowolnym polu jest nazywana rozmiarem pola, na przykład imię i nazwisko ucznia może mieć 10 znaków. Pola mogą mieć następujące atrybuty -

  • Primary keysto pola, które są unikalne dla każdego rekordu i służą do identyfikacji określonego rekordu. Na przykład w pliku ocen uczniów każdy uczeń będzie miał unikalny identyfikator ucznia, który stanowi klucz podstawowy.

  • Secondary keyssą unikatowymi lub nieunikalnymi polami używanymi do wyszukiwania powiązanych danych. Na przykład w pliku ocen uczniów pełne imię i nazwisko ucznia może być używane jako klucz dodatkowy, gdy identyfikator ucznia nie jest znany.

  • Descriptorspola są używane do opisu jednostki. Na przykład w pliku ocen uczniów, znane deskryptory są stopniami i polami procentowymi, które dodają znaczenia rekordowi.

Rekord

Rekord to zbiór pól używanych do opisu jednostki. Jedno lub więcej pól razem tworzy rekord. Na przykład w pliku ocen uczniów, identyfikator ucznia, imię i nazwisko, oceny, suma ocen i procent tworzą jeden rekord. Łączny rozmiar wszystkich pól w rekordzie nazywany jest rozmiarem rekordu. Rekordy obecne w pliku mogą mieć stałą długość lub zmienną długość.

Dokumentacja fizyczna

Rekord fizyczny to informacje znajdujące się na urządzeniu zewnętrznym. Jest również znany jako blok.

Rekord logiczny

Rekord logiczny to informacja używana przez program. W programach COBOL w dowolnym momencie można obsłużyć tylko jeden rekord nazywany rekordem logicznym.

Plik

Plik jest zbiorem powiązanych rekordów. Na przykład plik ocen uczniów składa się z rekordów wszystkich uczniów.

Organizacja plików wskazuje, w jaki sposób rekordy są zorganizowane w pliku. Istnieją różne typy organizacji plików, aby zwiększyć ich efektywność dostępu do rekordów. Poniżej przedstawiono typy schematów organizacji plików -

  • Sekwencyjna organizacja plików
  • Indeksowana sekwencyjna organizacja plików
  • Względna organizacja plików

Składnie w tym module, wymienione wraz z odpowiednimi terminami, odnoszą się tylko do ich użycia w programie. Pełne programy korzystające z tych składni zostaną omówione w rozdziale „Czasowniki obsługi plików”.

Sekwencyjna organizacja plików

Plik sekwencyjny składa się z rekordów, które są przechowywane i dostępne w kolejności sekwencyjnej. Poniżej przedstawiono kluczowe atrybuty sekwencyjnej organizacji plików -

  • Rekordy można odczytywać w kolejności sekwencyjnej. Do czytania 10 th rekord, wszystkie poprzednie rekordy 9 należy czytać.

  • Rekordy są zapisywane w kolejności. Nie można wstawić nowego rekordu pomiędzy. Nowy rekord jest zawsze wstawiany na końcu pliku.

  • Po umieszczeniu rekordu w pliku sekwencyjnym nie można usunąć, skrócić ani przedłużyć rekordu.

  • Kolejność rekordów, raz wstawionych, nigdy nie może zostać zmieniona.

  • Aktualizacja rekordu jest możliwa. Rekord można nadpisać, jeśli długość nowego rekordu jest taka sama, jak długość starego rekordu.

  • Sekwencyjne pliki wyjściowe są dobrym rozwiązaniem do drukowania.

Składnia

Poniżej przedstawiono składnię sekwencyjnej organizacji plików -

INPUT-OUTPUT SECTION.
FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name-jcl
   ORGANIZATION IS SEQUENTIAL

Organizacja plików indeksowanych sekwencyjnych

Indeksowany plik sekwencyjny składa się z rekordów, do których można uzyskać dostęp sekwencyjnie. Możliwy jest również bezpośredni dostęp. Składa się z dwóch części -

  • Data File zawiera rekordy w schemacie sekwencyjnym.

  • Index File zawiera klucz podstawowy i jego adres w pliku danych.

Poniżej przedstawiono kluczowe atrybuty sekwencyjnej organizacji plików -

  • Rekordy można czytać w kolejności sekwencyjnej, tak jak w sekwencyjnej organizacji plików.

  • Dostęp do rekordów można uzyskać losowo, jeśli znany jest klucz podstawowy. Plik indeksu służy do pobierania adresu rekordu, a następnie rekord jest pobierany z pliku danych.

  • W tym systemie plików utrzymywany jest posortowany indeks, który wiąże wartość klucza z pozycją rekordu w pliku.

  • Można również utworzyć indeks alternatywny w celu pobrania rekordów.

Składnia

Poniżej przedstawiono składnię indeksowanej sekwencyjnej organizacji plików -

INPUT-OUTPUT SECTION.
FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name-jcl
   ORGANIZATION IS INDEXED
   RECORD KEY IS primary-key
   ALTERNATE RECORD KEY IS rec-key

Względna organizacja plików

Plik względny składa się z rekordów uporządkowanych według ich relative address. Poniżej przedstawiono kluczowe atrybuty względnej organizacji plików -

  • Rekordy można odczytywać w kolejności sekwencyjnej, podobnie jak w sekwencyjnej i indeksowanej organizacji plików.

  • Dostęp do rekordów można uzyskać za pomocą klucza względnego. Klucz względny reprezentuje położenie rekordu względem adresu początku pliku.

  • Rekordy można wstawiać za pomocą klucza względnego. Adres względny jest obliczany za pomocą klucza względnego.

  • Plik względny zapewnia najszybszy dostęp do rekordów.

  • Główną wadą tego systemu plików jest to, że jeśli brakuje niektórych rekordów pośrednich, zajmują one również miejsce.

Składnia

Poniżej znajduje się składnia względnej organizacji plików -

INPUT-OUTPUT SECTION.
FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name-jcl
   ORGANIZATION IS RELATIVE
   RELATIVE KEY IS rec-key

Do tej pory omawiano schematy organizacji plików. Dla każdego schematu organizacji plików można użyć różnych trybów dostępu. Poniżej przedstawiono typy trybów dostępu do plików -

  • Dostęp sekwencyjny
  • Losowy dostęp
  • Dostęp dynamiczny

Składnie w tym module, wymienione wraz z odpowiednimi terminami, odnoszą się tylko do ich użycia w programie. Pełne programy korzystające z tych składni zostaną omówione w następnym rozdziale.

Dostęp sekwencyjny

Gdy tryb dostępu jest sekwencyjny, metoda odtwarzania rekordów zmienia się zgodnie z wybraną organizacją plików.

  • Dla sequential files, dostęp do rekordów odbywa się w tej samej kolejności, w jakiej zostały wstawione.

  • Dla indexed filesparametr używany do pobierania rekordów to wartości klucza rekordu.

  • Dla relative files, względne klucze rekordów są używane do pobierania rekordów.

Składnia

Poniżej znajduje się składnia trybu dostępu sekwencyjnego -

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name
   ORGANIZATION IS SEQUENTIAL
   ACCESS MODE IS SEQUENTIAL
	
	
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name
   ORGANIZATION IS INDEXED
   ACCESS MODE IS SEQUENTIAL
   RECORD KEY IS rec-key1
   ALTERNATE RECORD KEY IS rec-key2

		
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name
   ORGANIZATION IS RELATIVE
   ACCESS MODE IS SEQUENTIAL
   RELATIVE KEY IS rec-key1

Losowy dostęp

Gdy tryb dostępu jest RANDOM, metoda pobierania rekordów zmienia się zgodnie z wybraną organizacją plików.

  • Dla indexed files, dostęp do rekordów zależy od wartości umieszczonej w polu klucza, które może być kluczem podstawowym lub alternatywnym. Może istnieć jeden lub więcej alternatywnych indeksów.

  • Dla relative files , rekordy są pobierane za pomocą względnych kluczy rekordów.

Składnia

Poniżej znajduje się składnia trybu dostępu swobodnego -

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name
   ORGANIZATION IS INDEXED
   ACCESS MODE IS RANDOM
   RECORD KEY IS rec-key1
   ALTERNATE RECORD KEY IS rec-key2

		
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name
   ORGANIZATION IS RELATIVE
   ACCESS MODE IS RANDOM
   RELATIVE KEY IS rec-key1

Dostęp dynamiczny

Dostęp dynamiczny obsługuje dostęp sekwencyjny i losowy w tym samym programie. W przypadku dostępu dynamicznego jedna definicja pliku jest używana do wykonywania zarówno sekwencyjnego, jak i losowego przetwarzania, takiego jak uzyskiwanie dostępu do niektórych rekordów w kolejności sekwencyjnej i innych rekordów za pomocą ich kluczy.

W przypadku plików względnych i indeksowanych tryb dostępu dynamicznego umożliwia przełączanie się między trybem dostępu sekwencyjnego i trybem dostępu swobodnego podczas odczytu pliku za pomocą frazy NEXT w instrukcji READ. Funkcjonalności NEXT i READ zostaną omówione w następnym rozdziale.

Składnia

Poniżej znajduje się składnia trybu dostępu dynamicznego -

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name
   ORGANIZATION IS SEQUENTIAL
   ACCESS MODE IS DYNAMIC
   RECORD KEY IS rec-key1
   ALTERNATE RECORD KEY IS rec-key2

		
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name
   ORGANIZATION IS RELATIVE
   ACCESS MODE IS DYNAMIC
   RELATIVE KEY IS rec-key1

Czasowniki obsługi plików służą do wykonywania różnych operacji na plikach. Poniżej znajdują się czasowniki obsługi plików -

  • Open
  • Read
  • Write
  • Rewrite
  • Delete
  • Start
  • Close

Open Verb

Otwórz to pierwsza operacja na plikach, którą należy wykonać. Jeśli otwarcie powiedzie się, na pliku możliwe są tylko dalsze operacje. Dopiero po otwarciu pliku zmienne w strukturze pliku są dostępne do przetwarzania.FILE STATUS zmienna jest aktualizowana po każdej operacji na plikach.

Składnia

OPEN "mode" file-name.

Tutaj nazwa-pliku to literał ciągu, którego użyjesz do nazwania pliku. Plik można otworzyć w następujących trybach -

Sr.No. Tryb i opis
1

Input

Tryb wejściowy jest używany dla istniejących plików. W tym trybie możemy tylko czytać plik, żadne inne operacje na pliku nie są dozwolone.

2

Output

Tryb wyjściowy służy do wstawiania rekordów do plików. Jeślisequential filejest używany i plik przechowuje niektóre rekordy, wtedy istniejące rekordy zostaną najpierw usunięte, a następnie nowe rekordy zostaną wstawione do pliku. Tak się nie stanie w przypadku plikuindexed file lub a relative file.

3

Extend

Tryb rozszerzania służy do dołączania rekordów w pliku sequential file. W tym trybie rekordy są wstawiane na końcu. Jeśli tryb dostępu do plików toRandom lub Dynamic, nie można użyć trybu rozszerzania.

4

I-O

Tryb wejścia-wyjścia służy do odczytywania i przepisywania rekordów pliku.

Przeczytaj czasownik

Czasownik odczytu służy do odczytu rekordów pliku. Funkcja read polega na pobieraniu rekordów z pliku. Przy każdym czasowniku odczytu do struktury pliku można wczytać tylko jeden rekord. Aby wykonać operację odczytu, otwórz plik w trybie INPUT lub IO. Przy każdej instrukcji odczytu wskaźnik pliku jest zwiększany, a tym samym odczytywane są kolejne rekordy.

Składnia

Poniżej znajduje się składnia do odczytywania rekordów, gdy tryb dostępu do pliku jest sekwencyjny -

READ file-name NEXT RECORD INTO ws-file-structure
   AT END DISPLAY 'End of File'
   NOT AT END DISPLAY 'Record Details:' ws-file-structure
END-READ.

Poniżej przedstawiono użyte parametry -

  • NEXT RECORD jest opcjonalny i jest określany, gdy indeksowany plik sekwencyjny jest odczytywany sekwencyjnie.

  • Klauzula INTO jest opcjonalna. struktura-pliku-ws jest zdefiniowana w sekcji WorkingStorage w celu pobrania wartości z instrukcji READ.

  • Warunek AT END zmienia się na True, gdy osiągnięty zostanie koniec pliku.

Example- Poniższy przykład odczytuje istniejący plik przy użyciu organizacji sekwencji wierszy. Ten program można skompilować i uruchomić przy użyciuLive Demo opcja, w której wyświetli wszystkie rekordy obecne w pliku.

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
      FILE-CONTROL.
      SELECT STUDENT ASSIGN TO 'input.txt'
      ORGANIZATION IS LINE SEQUENTIAL.            

DATA DIVISION.
   FILE SECTION.
   FD STUDENT.
   01 STUDENT-FILE.
      05 STUDENT-ID PIC 9(5).
      05 NAME PIC A(25).

   WORKING-STORAGE SECTION.
   01 WS-STUDENT.
      05 WS-STUDENT-ID PIC 9(5).
      05 WS-NAME PIC A(25).
   01 WS-EOF PIC A(1). 

PROCEDURE DIVISION.
   OPEN INPUT STUDENT.
      PERFORM UNTIL WS-EOF='Y'
         READ STUDENT INTO WS-STUDENT
            AT END MOVE 'Y' TO WS-EOF
            NOT AT END DISPLAY WS-STUDENT
         END-READ
      END-PERFORM.
   CLOSE STUDENT.
STOP RUN.

Załóżmy, że dane pliku wejściowego są dostępne w input.txt plik zawiera następujące elementy -

20003 Mohtashim M.
20004 Nishant Malik
20005 Amitabh Bachhan

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

20003 Mohtashim M.            
20004 Nishant Malik           
20005 Amitabh Bachhan

Składnia

Poniżej znajduje się składnia odczytu rekordu, gdy tryb dostępu do pliku jest losowy -

READ file-name RECORD INTO ws-file-structure
   KEY IS rec-key
   INVALID KEY DISPLAY 'Invalid Key'
   NOT INVALID KEY DISPLAY 'Record Details: ' ws-file-structure
END-READ.

Example- Poniższy przykład odczytuje istniejący plik przy użyciu organizacji indeksowanej. Ten program można skompilować i uruchomić przy użyciuJCLna komputerach mainframe, gdzie wyświetli wszystkie rekordy obecne w pliku. Na serwerze mainframes nie używamy plików tekstowych; zamiast tego używamy plików PS.

Załóżmy, że plik obecny na komputerach mainframe ma taką samą zawartość jak plik input.txt w powyższym przykładzie.

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT STUDENT ASSIGN TO IN1
      ORGANIZATION IS INDEXED
      ACCESS IS RANDOM
      RECORD KEY IS STUDENT-ID
      FILE STATUS IS FS.

DATA DIVISION.
   FILE SECTION.
   FD STUDENT.
      01 STUDENT-FILE.
      05 STUDENT-ID PIC 9(5).
      05 NAME PIC A(25).
     
   WORKING-STORAGE SECTION.
   01 WS-STUDENT.
      05 WS-STUDENT-ID PIC 9(5).
      05 WS-NAME PIC A(25).

PROCEDURE DIVISION.
   OPEN INPUT STUDENT.
      MOVE 20005 TO STUDENT-ID.
      
      READ STUDENT RECORD INTO WS-STUDENT-FILE
         KEY IS STUDENT-ID
         INVALID KEY DISPLAY 'Invalid Key'
         NOT INVALID KEY DISPLAY WS-STUDENT-FILE
      END-READ.
      
   CLOSE STUDENT.
STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//IN1 DD DSN = STUDENT-FILE-NAME,DISP=SHR

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

20005 Amitabh Bachhan

Write Verb

Czasownik zapisu służy do wstawiania rekordów do pliku. Po zapisaniu rekord nie jest już dostępny w buforze rekordów. Przed wstawieniem rekordów do pliku przenieś wartości do bufora rekordów, a następnie wykonaj polecenie zapisu.

Instrukcja Write może być używana z FROMmożliwość bezpośredniego zapisu rekordów z roboczych zmiennych pamięci. From to klauzula opcjonalna. Jeśli tryb dostępu jest sekwencyjny, to aby zapisać rekord, plik musi zostać otwarty w trybie wyjściowym lub rozszerzonym. Jeśli tryb dostępu jest losowy lub dynamiczny, to aby zapisać rekord, plik musi zostać otwarty w trybie wyjścia lub w trybie IO.

Składnia

Poniżej znajduje się składnia odczytu rekordu, gdy organizacja plików jest sekwencyjna -

WRITE record-buffer [FROM ws-file-structure]
END-WRITE.

Poniżej znajduje się składnia odczytu rekordu, gdy organizacja plików jest indeksowana lub względna -

WRITE record-buffer [FROM ws-file-structure]
   INVALID KEY DISPLAY 'Invalid Key'
   NOT INVALID KEY DISPLAY 'Record Inserted'
END-WRITE.

Example - Poniższy przykład pokazuje, jak wstawić nowy rekord do nowego pliku, gdy organizacja jest sekwencyjna.

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT STUDENT ASSIGN TO OUT1
      ORGANIZATION IS SEQUENTIAL
      ACCESS IS SEQUENTIAL
      FILE STATUS IS FS.

DATA DIVISION.
   FILE SECTION.
   FD STUDENT
   01 STUDENT-FILE.
      05 STUDENT-ID PIC 9(5).
      05 NAME PIC A(25).
      05 CLASS PIC X(3).

   WORKING-STORAGE SECTION.
   01 WS-STUDENT.
      05 WS-STUDENT-ID PIC 9(5).
      05 WS-NAME PIC A(25).
      05 WS-CLASS PIC X(3).

PROCEDURE DIVISION.
   OPEN EXTEND STUDENT.
      MOVE 1000 TO STUDENT-ID.
      MOVE 'Tim' TO NAME.
      MOVE '10' TO CLASS.
      WRITE STUDENT-FILE
      END-WRITE.	
   CLOSE STUDENT.
STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//OUT1 DD DSN = OUTPUT-FILE-NAME,DISP = (NEW,CATALOG,DELETE)

Kiedy skompilujesz i uruchomisz powyższy program, doda on nowy rekord do pliku wyjściowego.

1000 Tim         10

Przepisać czasownik

Czasownik przepisania służy do aktualizacji rekordów. Plik należy otworzyć w trybie IO w celu wykonania operacji przepisywania. Może być używany tylko po pomyślnej operacji odczytu. Czasownik przepisania zastępuje ostatni odczytany rekord.

Składnia

Poniżej znajduje się składnia odczytu rekordu, gdy organizacja plików jest sekwencyjna -

REWRITE record-buffer [FROM ws-file-structure]
END-REWRITE.

Poniżej znajduje się składnia odczytu rekordu, gdy organizacja plików jest indeksowana lub względna -

REWRITE record-buffer [FROM ws-file-structure]
   INVALID KEY DISPLAY 'Invalid Key'
   NOT INVALID KEY DISPLAY 'Record Updated'
END-REWRITE.

Example - Poniższy przykład pokazuje, jak zaktualizować istniejący rekord, który wstawiliśmy w poprzednim kroku zapisu -

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT STUDENT ASSIGN TO IN1
      ORGANIZATION IS INDEXED
      ACCESS IS RANDOM
      RECORD KEY IS STUDENT-ID
      FILE STATUS IS FS.

DATA DIVISION.
   FILE SECTION.
   FD STUDENT
   01 STUDENT-FILE.
      05 STUDENT-ID PIC 9(4).
      05 NAME PIC A(12).
      05 CLASS PIC X(3).
      
   WORKING-STORAGE SECTION.
   01 WS-STUDENT.
      05 WS-STUDENT-ID PIC 9(5).
      05 WS-NAME PIC A(25).
      05 WS-CLASS PIC X(3).

PROCEDURE DIVISION.
   OPEN I-O STUDENT.
   MOVE '1000' TO STUDENT-ID.
  
   READ STUDENT
      KEY IS STUDENT-ID
      INVALID KEY DISPLAY ‘KEY IS NOT EXISTING’
   END-READ.
  
   MOVE 'Tim Dumais' TO NAME.
   REWRITE STUDENT-FILE
   END-REWRITE.
   CLOSE STUDENT.
STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//IN1 DD DSN = OUTPUT-FILE-NAME,DISP = SHR

Kiedy skompilujesz i uruchomisz powyższy program, zaktualizuje on rekord -

1000 Tim Dumais  10

Usuń czasownik

Czasownik usuwania można wykonać tylko na plikach indeksowanych i względnych. Plik musi być otwarty w trybie IO. W sekwencyjnej organizacji plików nie można usuwać rekordów. Rekord ostatnio odczytany przez instrukcję Read jest usuwany w przypadku trybu dostępu sekwencyjnego. W trybie dostępu swobodnego określ klucz nagrywania, a następnie wykonaj operację usuwania.

Składnia

Poniżej znajduje się składnia usuwania rekordu -

DELETE file-name RECORD
   INVALID KEY DISPLAY 'Invalid Key'
   NOT INVALID KEY DISPLAY 'Record Deleted'
END-DELETE.

Example - aby usunąć istniejący rekord -

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT STUDENT ASSIGN TO OUT1
      ORGANIZATION IS INDEXED
      ACCESS IS RANDOM
      RECORD KEY IS STUDENT-ID
      FILE STATUS IS FS.

DATA DIVISION.
   FILE SECTION.
   FD STUDENT
   01 STUDENT-FILE.
      05 STUDENT-ID PIC 9(4).
      05 NAME PIC A(12).
      05 CLASS PIC X(3).
   WORKING-STORAGE SECTION.
   01 WS-STUDENT.
      05 WS-STUDENT-ID PIC 9(5).
      05 WS-NAME PIC A(25).
      05 WS-CLASS PIC X(3).

PROCEDURE DIVISION.
   OPEN I-O STUDENT.
   MOVE '1000' TO STUDENT-ID.
   
   DELETE STUDENT RECORD
      INVALID KEY DISPLAY 'Invalid Key'
      NOT INVALID KEY DISPLAY 'Record Deleted'
   END-DELETE.
   
   CLOSE STUDENT.
STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//OUT1 DD DSN = OUTPUT-FILE-NAME,DISP = SHR

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

Record Deleted

Start Verb

Czasownik początkowy można wykonać tylko na plikach indeksowanych i względnych. Służy do umieszczania wskaźnika pliku w określonym rekordzie. Tryb dostępu musi być sekwencyjny lub dynamiczny. Plik musi być otwarty w trybie IO lub Input.

Składnia

Poniżej znajduje się składnia umieszczania wskaźnika w określonym rekordzie -

START file-name KEY IS [=, >, <, NOT, <= or >=] rec-key
   INVALID KEY DISPLAY 'Invalid Key'
   NOT INVALID KEY DISPLAY 'File Pointer Updated'
END-START.

Close Verb

Czasownik zamykania służy do zamykania pliku. Po wykonaniu operacji Zamknij zmienne w strukturze pliku nie będą dostępne do przetwarzania. Utracono połączenie między programem a plikiem.

Składnia

Poniżej znajduje się składnia zamykania pliku -

CLOSE file-name.

Podprogram Cobol to program, który może być kompilowany niezależnie, ale nie może być wykonywany niezależnie. Istnieją dwa rodzaje podprogramów:internal subroutines lubić Perform oświadczenia i external podprogramy, takie jak czasownik CALL.

Call Verb

Czasownik wywołania służy do przenoszenia kontroli z jednego programu do innego programu. Program zawierający czasownik CALL toCalling Program a wywoływany program jest znany jako Called Program. Wykonywanie programu wywołującego zostanie wstrzymane, dopóki wywoływany program nie zakończy wykonywania. Instrukcja Exit Program jest używana w wywołanym programie do przekazania sterowania z powrotem.

Nazwane ograniczenia programu

Poniżej przedstawiono zwane wymagania programu -

  • Linkage sectionmusi być zdefiniowana w wywołanym programie. Składa się z elementów danych przekazanych w programie. Elementy danych nie powinny mieć klauzuli wartości. Klauzula PIC musi być zgodna ze zmiennymi przekazywanymi przez program wywołujący.

  • Procedure division using zawiera listę zmiennych przekazanych z programu wywołującego, a kolejność musi być taka sama, jak podano w czasowniku Call.

  • Exit programinstrukcja jest używana w wywołanym programie w celu przekazania sterowania z powrotem. Musi to być ostatnia instrukcja w wywołanym programie.

Parametry można przekazywać między programami na dwa sposoby -

  • Według odniesienia
  • Według treści

Zadzwoń przez numer referencyjny

Jeśli wartości zmiennych w wywoływanym programie zostaną zmodyfikowane, to ich nowe wartości zostaną odzwierciedlone w programie wywołującym. GdybyBY klauzula nie jest określona, ​​wtedy zmienne są zawsze przekazywane przez odwołanie.

Składnia

Poniżej znajduje się składnia wywoływania podprogramu przez odniesienie -

CALL sub-prog-name USING variable-1, variable-2.

Example

Poniższy przykład to GŁÓWNY program wywołujący, a UTIL to wywoływany program -

IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-STUDENT-ID PIC 9(4) VALUE 1000.
   01 WS-STUDENT-NAME PIC A(15) VALUE 'Tim'.

PROCEDURE DIVISION.
   CALL 'UTIL' USING WS-STUDENT-ID, WS-STUDENT-NAME.
   DISPLAY 'Student Id : ' WS-STUDENT-ID
   DISPLAY 'Student Name : ' WS-STUDENT-NAME
STOP RUN.

Program o nazwie

IDENTIFICATION DIVISION.
PROGRAM-ID. UTIL.

DATA DIVISION.
   LINKAGE SECTION.
   01 LS-STUDENT-ID PIC 9(4).
   01 LS-STUDENT-NAME PIC A(15).

PROCEDURE DIVISION USING LS-STUDENT-ID, LS-STUDENT-NAME.
   DISPLAY 'In Called Program'.
   MOVE 1111 TO LS-STUDENT-ID.
EXIT PROGRAM.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = MAIN

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

In Called Program
Student Id : 1111
Student Name : Tim

Zadzwoń według zawartości

Jeśli wartości zmiennych w wywoływanym programie zostaną zmodyfikowane, to ich nowe wartości nie zostaną odzwierciedlone w programie wywołującym.

Składnia

Poniżej znajduje się składnia wywoływania podprogramu według zawartości -

CALL sub-prog-name USING 
BY CONTENT variable-1, BY CONTENT variable-2.

Example

Poniższy przykład to GŁÓWNY program wywołujący, a UTIL to wywoływany program -

IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-STUDENT-ID PIC 9(4) VALUE 1000.
   01 WS-STUDENT-NAME PIC A(15) VALUE 'Tim'.

PROCEDURE DIVISION.
   CALL 'UTIL' USING BY CONTENT WS-STUDENT-ID, BY CONTENT WS-STUDENT-NAME.
   DISPLAY 'Student Id : ' WS-STUDENT-ID
   DISPLAY 'Student Name : ' WS-STUDENT-NAME
STOP RUN.

Program o nazwie

IDENTIFICATION DIVISION.
PROGRAM-ID. UTIL.

DATA DIVISION.
   LINKAGE SECTION.
   01 LS-STUDENT-ID PIC 9(4).
   01 LS-STUDENT-NAME PIC A(15).

PROCEDURE DIVISION USING LS-STUDENT-ID, LS-STUDENT-NAME.
   DISPLAY 'In Called Program'.
   MOVE 1111 TO LS-STUDENT-ID.
EXIT PROGRAM.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = MAIN

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

In Called Program
Student Id : 1000
Student Name : Tim

Rodzaje połączeń

Istnieją dwa rodzaje połączeń -

  • Static Callwystępuje, gdy program jest kompilowany z opcją kompilatora NODYNAM. Statyczny wywołany program jest ładowany do pamięci w czasie kompilacji.

  • Dynamic Callwystępuje, gdy program jest kompilowany z opcją kompilatora DYNAM i NODLL. Dynamiczny wywołany program jest ładowany do pamięci w czasie wykonywania.

Sortowanie danych w pliku lub łączenie dwóch lub więcej plików jest powszechną koniecznością w prawie wszystkich aplikacjach biznesowych. Sortowanie służy do porządkowania rekordów w porządku rosnącym lub malejącym, tak aby można było przeprowadzić przetwarzanie sekwencyjne. Istnieją dwie techniki, które są używane do sortowania plików w języku COBOL -

  • External sortsłuży do sortowania plików za pomocą narzędzia SORT w JCL. Omówiliśmy to w rozdziale JCL. Od teraz skupimy się na sortowaniu wewnętrznym.

  • Internal sort służy do sortowania plików w programie w języku COBOL. SORT czasownik służy do sortowania pliku.

Sort Verb

W procesie sortowania w języku COBOL używane są trzy pliki -

  • Input file to plik, który musimy posortować w kolejności rosnącej lub malejącej.

  • Work filesłuży do przechowywania rekordów podczas procesu sortowania. Rekordy pliku wejściowego są przesyłane do pliku roboczego w celu sortowania. Ten plik należy zdefiniować w sekcji File w pozycji SD.

  • Output fileto plik, który otrzymujemy po sortowaniu. Jest to końcowe wyjście czasownika sortowania.

Składnia

Poniżej znajduje się składnia sortowania pliku -

SORT work-file ON ASCENDING KEY rec-key1
   [ON DESCENDING KEY rec-key2]
USING input-file GIVING output-file.

SORT wykonuje następujące operacje -

  • Otwiera plik roboczy w trybie IO, plik wejściowy w trybie INPUT i plik wyjściowy w trybie OUTPUT.

  • Przenosi rekordy obecne w pliku wejściowym do pliku roboczego.

  • Sortuje SORT-FILE w rosnącej / malejącej kolejności za pomocą klawisza rec.

  • Przenosi posortowane rekordy z pliku roboczego do pliku wyjściowego.

  • Zamyka plik wejściowy i plik-wyjściowy oraz usuwa plik roboczy.

Example

W poniższym przykładzie INPUT jest plikiem wejściowym, który należy posortować w kolejności rosnącej -

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
      SELECT INPUT ASSIGN TO IN.
      SELECT OUTPUT ASSIGN TO OUT.
      SELECT WORK ASSIGN TO WRK.

DATA DIVISION.
   FILE SECTION.
   FD INPUT.
      01 INPUT-STUDENT.
         05 STUDENT-ID-I PIC 9(5).
         05 STUDENT-NAME-I PIC A(25).
   FD OUTPUT.
      01 OUTPUT-STUDENT.
         05 STUDENT-ID-O PIC 9(5).
         05 STUDENT-NAME-O PIC A(25).
   SD WORK.
      01 WORK-STUDENT.
         05 STUDENT-ID-W PIC 9(5).
         05 STUDENT-NAME-W PIC A(25).

PROCEDURE DIVISION.
   SORT WORK ON ASCENDING KEY STUDENT-ID-O
   USING INPUT GIVING OUTPUT.
   DISPLAY 'Sort Successful'.
STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//IN DD DSN = INPUT-FILE-NAME,DISP = SHR
//OUT DD DSN = OUTPUT-FILE-NAME,DISP = SHR
//WRK DD DSN = &&TEMP

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

Sort Successful

Merge Verb

Dwa lub więcej identycznie ułożonych plików łączy się za pomocą instrukcji Merge. Pliki używane w procesie scalania -

  • Pliki wejściowe - wejście-1, wejście-2
  • Plik roboczy
  • Plik wyjściowy

Składnia

Poniżej przedstawiono składnię łączenia dwóch lub więcej plików -

MERGE work-file ON ASCENDING KEY rec-key1
   [ON DESCENDING KEY rec-key2]

USING input-1, input-2 GIVING output-file.

Merge wykonuje następujące operacje -

  • Otwiera plik roboczy w trybie IO, pliki wejściowe w trybie INPUT i plik wyjściowy w trybie OUTPUT.

  • Przenosi rekordy obecne w plikach wejściowych do pliku roboczego.

  • Sortuje SORT-FILE w rosnącej / malejącej kolejności za pomocą klawisza rec.

  • Przenosi posortowane rekordy z pliku roboczego do pliku wyjściowego.

  • Zamyka plik wejściowy i plik-wyjściowy oraz usuwa plik roboczy.

Example

W poniższym przykładzie INPUT1 i INPUT2 to pliki wejściowe, które mają zostać scalone w kolejności rosnącej -

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
      SELECT INPUT1 ASSIGN TO IN1.
      SELECT INPUT2 ASSIGN TO IN2.
      SELECT OUTPUT ASSIGN TO OUT.
      SELECT WORK ASSIGN TO WRK.

DATA DIVISION.
   FILE SECTION.
   FD INPUT1.
      01 INPUT1-STUDENT.
         05 STUDENT-ID-I1 PIC 9(5).
         05 STUDENT-NAME-I1 PIC A(25).
   FD INPUT2.
      01 INPUT2-STUDENT.
         05 STUDENT-ID-I2 PIC 9(5).
         05 STUDENT-NAME-I2 PIC A(25).
   FD OUTPUT.
      01 OUTPUT-STUDENT.
         05 STUDENT-ID-O PIC 9(5).
         05 STUDENT-NAME-O PIC A(25).
   SD WORK.
      01 WORK-STUDENT.
         05 STUDENT-ID-W PIC 9(5).
         05 STUDENT-NAME-W PIC A(25).

PROCEDURE DIVISION.
   MERGE WORK ON ASCENDING KEY STUDENT-ID-O
   USING INPUT1, INPUT2 GIVING OUTPUT.
   DISPLAY 'Merge Successful'.
STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//IN1 DD DSN=INPUT1-FILE-NAME,DISP=SHR
//IN2 DD DSN=INPUT2-FILE-NAME,DISP=SHR
//OUT DD DSN = OUTPUT-FILE-NAME,DISP=SHR
//WRK DD DSN = &&TEMP

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

Merge Successful

Na razie nauczyliśmy się obsługi plików w języku COBOL. Teraz omówimy, jak program w języku COBOL współdziała z DB2. Obejmuje następujące terminy -

  • Wbudowany SQL
  • Programowanie aplikacji DB2
  • Zmienne hosta
  • SQLCA
  • Zapytania SQL
  • Cursors

Wbudowany SQL

Wbudowane instrukcje SQL są używane w programach języka COBOL do wykonywania standardowych operacji SQL. Wbudowane instrukcje SQL są wstępnie przetwarzane przez procesor SQL przed skompilowaniem aplikacji. COBOL jest znany jakoHost Language. Aplikacje COBOL-DB2 to aplikacje, które obejmują zarówno język COBOL, jak i DB2.

Wbudowane instrukcje SQL działają jak zwykłe instrukcje SQL z niewielkimi zmianami. Na przykład wynik zapytania jest kierowany do wstępnie zdefiniowanego zestawu zmiennych, które są określane jakoHost Variables. Dodatkowa klauzula INTO jest umieszczona w instrukcji SELECT.

Programowanie aplikacji DB2

Poniżej przedstawiono zasady, których należy przestrzegać podczas kodowania programu w języku COBOL-DB2:

  • Wszystkie instrukcje SQL muszą być rozdzielone między EXEC SQL i ENDEXEC..

  • Instrukcje SQL muszą być zakodowane w Obszarze B.

  • Wszystkie tabele używane w programie muszą być zadeklarowane w sekcji WorkingStorage. Odbywa się to za pomocąINCLUDE komunikat.

  • Wszystkie instrukcje SQL inne niż INCLUDE i DECLARE TABLE muszą znajdować się w dziale procedury.

Zmienne hosta

Zmienne hosta służą do odbierania danych z tabeli lub wstawiania danych do tabeli. Zmienne hosta należy zadeklarować dla wszystkich wartości, które mają być przekazywane między programem a bazą danych DB2. Są zadeklarowane w sekcji roboczej i magazynowej.

Zmienne hosta nie mogą być elementami grupowymi, ale mogą być grupowane razem w strukturze hosta. Nie mogąRenamed lub Redefined. Używając zmiennych języka macierzystego z instrukcjami SQL, należy poprzedzić je rozszerzeniemcolon (:)..

Składnia

Poniżej znajduje się składnia deklarowania zmiennych języka macierzystego i dołączania tabel do sekcji Working-Storage -

DATA DIVISION.
   WORKING-STORAGE SECTION.
   
   EXEC SQL
   INCLUDE table-name
   END-EXEC.

   EXEC SQL BEGIN DECLARE SECTION
   END-EXEC.
   
   01 STUDENT-REC.
      05 STUDENT-ID PIC 9(4).
      05 STUDENT-NAME PIC X(25).
      05 STUDENT-ADDRESS X(50).
   EXEC SQL END DECLARE SECTION
   END-EXEC.

SQLCA

SQLCA to obszar komunikacji SQL, przez który DB2 przekazuje do programu informację zwrotną o wykonaniu SQL. Informuje program, czy wykonanie się powiodło, czy nie. Istnieje wiele predefiniowanych zmiennych, takich jak SQLCASQLCODEktóry zawiera kod błędu. Wartość „000” w SQLCODE oznacza pomyślne wykonanie.

Składnia

Poniżej znajduje się składnia deklarowania obszaru SQLCA w sekcji Working-Storage -

DATA DIVISION.
WORKING-STORAGE SECTION.
	EXEC SQL
	INCLUDE SQLCA
	END-EXEC.

Zapytania SQL

Załóżmy, że mamy jedną tabelę o nazwie „Student”, która zawiera identyfikator ucznia, nazwę ucznia i adres ucznia.

Tabela STUDENT zawiera następujące dane -

Student Id		Student Name		Student Address
1001 			   Mohtashim M.		Hyderabad
1002			   Nishant Malik		Delhi
1003 			   Amitabh Bachan		Mumbai
1004			   Chulbul Pandey		Lucknow

Poniższy przykład pokazuje użycie SELECT zapytanie w programie COBOL -

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   EXEC SQL
      INCLUDE SQLCA
   END-EXEC.
   
   EXEC SQL
      INCLUDE STUDENT
   END-EXEC.
   
   EXEC SQL BEGIN DECLARE SECTION
   END-EXEC.
      01 WS-STUDENT-REC.
         05 WS-STUDENT-ID PIC 9(4).
         05 WS-STUDENT-NAME PIC X(25).
         05 WS-STUDENT-ADDRESS X(50).
   EXEC SQL END DECLARE SECTION
   END-EXEC.

PROCEDURE DIVISION.
   EXEC SQL
      SELECT STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS
      INTO :WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS FROM STUDENT
      WHERE STUDENT-ID=1004
   END-EXEC.
   
   IF SQLCODE = 0 
      DISPLAY WS-STUDENT-RECORD
   ELSE DISPLAY 'Error'
   END-IF.
STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP001  EXEC PGM = IKJEFT01
//STEPLIB  DD DSN = MYDATA.URMI.DBRMLIB,DISP = SHR
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//SYSTSIN  DD *
   DSN SYSTEM(SSID)
   RUN PROGRAM(HELLO) PLAN(PLANNAME) -
   END
/*

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

1004 Chulbul Pandey		Lucknow

Poniższy przykład pokazuje użycie INSERT zapytanie w programie COBOL -

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   EXEC SQL
   INCLUDE SQLCA
   END-EXEC.
   
   EXEC SQL
   INCLUDE STUDENT
   END-EXEC.
   
   EXEC SQL BEGIN DECLARE SECTION
   END-EXEC.
      01 WS-STUDENT-REC.
         05 WS-STUDENT-ID PIC 9(4).
         05 WS-STUDENT-NAME PIC X(25).
         05 WS-STUDENT-ADDRESS X(50).
   EXEC SQL END DECLARE SECTION
   END-EXEC.

PROCEDURE DIVISION.
   MOVE 1005 TO WS-STUDENT-ID.
   MOVE 'TutorialsPoint' TO WS-STUDENT-NAME.
   MOVE 'Hyderabad' TO WS-STUDENT-ADDRESS.
   
   EXEC SQL
      INSERT INTO STUDENT(STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS)
      VALUES (:WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS)
   END-EXEC.
   
   IF SQLCODE = 0 
      DISPLAY 'Record Inserted Successfully'
      DISPLAY WS-STUDENT-REC
   ELSE DISPLAY 'Error'
   END-IF.
STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP001  EXEC PGM = IKJEFT01
//STEPLIB  DD DSN = MYDATA.URMI.DBRMLIB,DISP=SHR
//SYSPRINT DD SYSOUT = *
//SYSUDUMP DD SYSOUT = *
//SYSOUT   DD SYSOUT = *
//SYSTSIN  DD *
   DSN SYSTEM(SSID)
   RUN PROGRAM(HELLO) PLAN(PLANNAME) -
   END
/*

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

Record Inserted Successfully
1005 TutorialsPoint		Hyderabad

Poniższy przykład pokazuje użycie UPDATE zapytanie w programie COBOL -

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   
   EXEC SQL
   INCLUDE SQLCA
   END-EXEC.
   
   EXEC SQL
   INCLUDE STUDENT
   END-EXEC.
   
   EXEC SQL BEGIN DECLARE SECTION
   END-EXEC.
      01 WS-STUDENT-REC.
         05 WS-STUDENT-ID PIC 9(4).
         05 WS-STUDENT-NAME PIC X(25).
         05 WS-STUDENT-ADDRESS X(50).
   EXEC SQL END DECLARE SECTION
   END-EXEC.

PROCEDURE DIVISION.
   MOVE 'Bangalore' TO WS-STUDENT-ADDRESS.
   EXEC SQL
      UPDATE STUDENT SET STUDENT-ADDRESS=:WS-STUDENT-ADDRESS
      WHERE STUDENT-ID = 1003
   END-EXEC.
   
   IF SQLCODE = 0 
      DISPLAY 'Record Updated Successfully'
   ELSE DISPLAY 'Error'
   END-IF.
STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP001  EXEC PGM = IKJEFT01
//STEPLIB  DD DSN = MYDATA.URMI.DBRMLIB,DISP = SHR
//SYSPRINT DD SYSOUT = *
//SYSUDUMP DD SYSOUT = *
//SYSOUT   DD SYSOUT = *
//SYSTSIN  DD *
   DSN SYSTEM(SSID)
   RUN PROGRAM(HELLO) PLAN(PLANNAME) -
   END
/*

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

Record Updated Successfully

Następujące example pokazuje użycie DELETE zapytanie w programie COBOL -

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.

   EXEC SQL
   INCLUDE SQLCA
   END-EXEC.
   
   EXEC SQL
   INCLUDE STUDENT
   END-EXEC.
   
   EXEC SQL BEGIN DECLARE SECTION
   END-EXEC.
      01 WS-STUDENT-REC.
         05 WS-STUDENT-ID PIC 9(4).
         05 WS-STUDENT-NAME PIC X(25).
         05 WS-STUDENT-ADDRESS X(50).
   EXEC SQL END DECLARE SECTION
   END-EXEC.

PROCEDURE DIVISION.
   MOVE 1005 TO WS-STUDENT-ID.
   
   EXEC SQL
      DELETE FROM STUDENT
      WHERE STUDENT-ID=:WS-STUDENT-ID
   END-EXEC.
   
   IF SQLCODE = 0 
      DISPLAY 'Record Deleted Successfully'
   ELSE DISPLAY 'Error'
   END-IF.
STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP001  EXEC PGM = IKJEFT01
//STEPLIB  DD DSN = MYDATA.URMI.DBRMLIB,DISP=SHR
//SYSPRINT DD SYSOUT = *
//SYSUDUMP DD SYSOUT = *
//SYSOUT   DD SYSOUT = *
//SYSTSIN  DD *
   DSN SYSTEM(SSID)
   RUN PROGRAM(HELLO) PLAN(PLANNAME) -
   END
/*

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

Record Deleted Successfully

Kursory

Kursory służą do jednoczesnej obsługi wielu zaznaczeń wierszy. Są to struktury danych zawierające wszystkie wyniki zapytania. Można je zdefiniować w Sekcji Roboczej-Magazynowania lub Wydziale Procedur. Poniżej przedstawiono operacje związane z kursorem -

  • Declare
  • Open
  • Close
  • Fetch

Zadeklaruj kursor

Deklarację kursora można złożyć w Sekcji Roboczej-Magazynowej lub Dziale Procedur. Pierwsza instrukcja to DECLARE, która jest instrukcją niewykonalną.

EXEC SQL
   DECLARE STUDCUR CURSOR FOR
   SELECT STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS FROM STUDENT
   WHERE STUDENT-ID >:WS-STUDENT-ID
END-EXEC.

otwarty

Przed użyciem kursora należy wykonać instrukcję Open. Instrukcja Open przygotowuje SELECT do wykonania.

EXEC SQL
   OPEN STUDCUR
END-EXEC.

Blisko

Instrukcja Close zwalnia całą pamięć zajmowaną przez kursor. Zamknięcie kursora jest obowiązkowe przed zakończeniem programu.

EXEC SQL
   CLOSE STUDCUR
END-EXEC.

Sprowadzać

Instrukcja Fetch identyfikuje kursor i umieszcza wartość w klauzuli INTO. Instrukcja Fetch jest kodowana w pętli, ponieważ otrzymujemy jeden wiersz na raz.

EXEC SQL
   FETCH STUDCUR
   INTO :WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS
END-EXEC.

Poniższy przykład pokazuje użycie kursora do pobrania wszystkich rekordów z tabeli STUDENT -

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   
   EXEC SQL
   INCLUDE SQLCA
   END-EXEC.
   
   EXEC SQL
   INCLUDE STUDENT
   END-EXEC.
   
   EXEC SQL BEGIN DECLARE SECTION
   END-EXEC.
      01 WS-STUDENT-REC.
         05 WS-STUDENT-ID PIC 9(4).
         05 WS-STUDENT-NAME PIC X(25).
         05 WS-STUDENT-ADDRESS X(50).
   EXEC SQL END DECLARE SECTION
   END-EXEC.
   
   EXEC SQL
      DECLARE STUDCUR CURSOR FOR
      SELECT STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS FROM STUDENT
      WHERE STUDENT-ID >:WS-STUDENT-ID
   END-EXEC.

PROCEDURE DIVISION.
   MOVE 1001 TO WS-STUDENT-ID.
   PERFORM UNTIL SQLCODE = 100
   
   EXEC SQL
      FETCH STUDCUR
      INTO :WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS
   END-EXEC
   
   DISPLAY WS-STUDENT-REC
END-PERFORM	
STOP RUN.

JCL aby wykonać powyższy program w języku COBOL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP001  EXEC PGM=IKJEFT01
//STEPLIB  DD DSN=MYDATA.URMI.DBRMLIB,DISP=SHR
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//SYSTSIN  DD *
   DSN SYSTEM(SSID)
   RUN PROGRAM(HELLO) PLAN(PLANNAME) -
   END
/*

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

1001 Mohtashim M.		Hyderabad
1002 Nishant Malik		Delhi
1003 Amitabh Bachan		Mumbai
1004 Chulbul Pandey		Lucknow