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 SQL và ENDEXEC..
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