COBOL - Giao diện cơ sở dữ liệu

Hiện tại, chúng tôi đã học cách sử dụng các tệp trong COBOL. Bây giờ, chúng ta sẽ thảo luận về cách một chương trình COBOL tương tác với DB2. Nó bao gồm các điều khoản sau:

  • SQL nhúng
  • Lập trình ứng dụng DB2
  • Biến máy chủ
  • SQLCA
  • Truy vấn SQL
  • Cursors

SQL nhúng

Các câu lệnh SQL nhúng được sử dụng trong các chương trình COBOL để thực hiện các hoạt động SQL tiêu chuẩn. Các câu lệnh SQL nhúng được xử lý trước bởi bộ xử lý SQL trước khi chương trình ứng dụng được biên dịch. COBOL được gọi làHost Language. Các ứng dụng COBOL-DB2 là những ứng dụng bao gồm cả COBOL và DB2.

Các câu lệnh SQL được nhúng hoạt động giống như các câu lệnh SQL bình thường với một số thay đổi nhỏ. Ví dụ: đầu ra của một truy vấn được chuyển hướng đến một tập hợp các biến được xác định trước được gọi làHost Variables. Một mệnh đề INTO bổ sung được đặt trong câu lệnh SELECT.

Lập trình ứng dụng DB2

Sau đây là các quy tắc cần tuân thủ khi viết mã chương trình COBOL-DB2:

  • Tất cả các câu lệnh SQL phải được phân tách giữa EXEC SQLENDEXEC..

  • Các câu lệnh SQL phải được mã hóa trong Vùng B.

  • Tất cả các bảng được sử dụng trong một chương trình phải được khai báo trong Phần lưu trữ làm việc. Điều này được thực hiện bằng cách sử dụngINCLUDE tuyên bố.

  • Tất cả các câu lệnh SQL ngoài INCLUDE và DECLARE TABLE phải xuất hiện trong Bộ phận thủ tục.

Biến máy chủ

Biến máy chủ được sử dụng để nhận dữ liệu từ bảng hoặc chèn dữ liệu vào bảng. Các biến máy chủ phải được khai báo cho tất cả các giá trị sẽ được chuyển giữa chương trình và DB2. Chúng được khai báo trong phần Lưu trữ-Làm việc.

Các biến máy chủ không thể là các mục nhóm, nhưng chúng có thể được nhóm lại với nhau trong cấu trúc máy chủ. Họ không thểRenamed hoặc là Redefined. Sử dụng các biến máy chủ có câu lệnh SQL, hãy đặt tiền tố chúng bằngcolon (:)..

Cú pháp

Sau đây là cú pháp để khai báo các biến máy chủ và bao gồm các bảng trong phần Lưu trữ-Làm việc:

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 là một vùng giao tiếp SQL mà qua đó DB2 chuyển phản hồi về việc thực thi SQL cho chương trình. Nó cho chương trình biết việc thực thi có thành công hay không. Có một số biến được xác định trước trong SQLCA nhưSQLCODEchứa mã lỗi. Giá trị '000' trong SQLCODE cho biết thực thi thành công.

Cú pháp

Sau đây là cú pháp để khai báo một SQLCA trong phần Lưu trữ-Làm việc -

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

Truy vấn SQL

Giả sử chúng ta có một bảng được đặt tên là 'Sinh viên' chứa Mã số sinh viên, Tên sinh viên và Địa chỉ sinh viên.

Bảng STUDENT chứa dữ liệu sau:

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

Ví dụ sau đây cho thấy việc sử dụng SELECT truy vấn trong chương trình 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 để thực hiện chương trình COBOL ở trên -

//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
/*

Khi bạn biên dịch và thực thi chương trình trên, nó tạo ra kết quả sau:

1004 Chulbul Pandey		Lucknow

Ví dụ sau đây cho thấy việc sử dụng INSERT truy vấn trong chương trình 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 để thực hiện chương trình COBOL ở trên -

//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
/*

Khi bạn biên dịch và thực thi chương trình trên, nó tạo ra kết quả sau:

Record Inserted Successfully
1005 TutorialsPoint		Hyderabad

Ví dụ sau đây cho thấy việc sử dụng UPDATE truy vấn trong chương trình 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 để thực hiện chương trình COBOL ở trên -

//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
/*

Khi bạn biên dịch và thực thi chương trình trên, nó tạo ra kết quả sau:

Record Updated Successfully

Sau example cho thấy việc sử dụng DELETE truy vấn trong chương trình 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 để thực hiện chương trình COBOL ở trên -

//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
/*

Khi bạn biên dịch và thực thi chương trình trên, nó tạo ra kết quả sau:

Record Deleted Successfully

Con trỏ

Con trỏ được sử dụng để xử lý nhiều lựa chọn hàng cùng một lúc. Chúng là cấu trúc dữ liệu chứa tất cả các kết quả của một truy vấn. Chúng có thể được định nghĩa trong Phần lưu trữ làm việc hoặc Bộ phận thủ tục. Sau đây là các thao tác liên quan đến Con trỏ:

  • Declare
  • Open
  • Close
  • Fetch

Khai báo con trỏ

Khai báo con trỏ có thể được thực hiện trong Bộ phận lưu trữ làm việc hoặc Bộ phận thủ tục. Câu lệnh đầu tiên là câu lệnh DECLARE là một câu lệnh không thể thay đổi được.

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

Mở

Trước khi sử dụng con trỏ, câu lệnh Mở phải được thực hiện. Câu lệnh Open chuẩn bị cho SELECT để thực thi.

EXEC SQL
   OPEN STUDCUR
END-EXEC.

Đóng

Câu lệnh Close giải phóng tất cả bộ nhớ mà con trỏ chiếm giữ. Bắt buộc phải đóng con trỏ trước khi kết thúc chương trình.

EXEC SQL
   CLOSE STUDCUR
END-EXEC.

Tìm nạp

Câu lệnh tìm nạp xác định con trỏ và đặt giá trị trong mệnh đề INTO. Câu lệnh Tìm nạp được mã hóa trong vòng lặp khi chúng ta nhận được một hàng tại một thời điểm.

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

Ví dụ sau cho thấy cách sử dụng con trỏ để tìm nạp tất cả các bản ghi từ bảng 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 để thực hiện chương trình COBOL ở trên -

//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
/*

Khi bạn biên dịch và thực thi chương trình trên, nó tạo ra kết quả sau:

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