截至目前,我們已經(jīng)學(xué)會(huì)了使用COBOL中的文件。現(xiàn)在,我們將討論COBOL程序如何與DB2進(jìn)行交互。它涉及以下術(shù)語(yǔ):
嵌入式SQL語(yǔ)句用于COBOL程序中以執(zhí)行標(biāo)準(zhǔn)的SQL操作。在編譯應(yīng)用程序之前,嵌入式SQL語(yǔ)句由SQL處理器進(jìn)行預(yù)處理。COBOL被稱為Host Language(宿主語(yǔ)言)。 COBOL-DB2應(yīng)用程序是包括COBOL和DB2的應(yīng)用程序。
嵌入式SQL語(yǔ)句的工作原理與普通的SQL語(yǔ)句類(lèi)似,但有一些小變化。例如,查詢的輸出定向到被稱為Host Variables(宿主變量)的預(yù)定義變量集合。另外,INTO子句是放置在SELECT語(yǔ)句中。
以下是編寫(xiě)COBOL-DB2程序時(shí)要遵循的規(guī)則:
所有SQL語(yǔ)句在EXEC SQL和END-EXEC之間必須分隔。
SQL語(yǔ)句必須在區(qū)域B中進(jìn)行編碼
程序中使用的所有表必須在工作存儲(chǔ)節(jié)(working-storage section)中聲明。這是通過(guò)使用INCLUDE語(yǔ)句來(lái)完成的。
除了INCLUDE和DECLARE TABLE之外的所有SQL語(yǔ)句都必須出現(xiàn)在過(guò)程部中。
宿主變量用于從表中接收數(shù)據(jù)或在表中插入數(shù)據(jù)。必須為在程序和DB2之間傳遞的所有值聲明宿主變量。它們?cè)诠ぷ鞔鎯?chǔ)節(jié)中進(jìn)行聲明。
宿主變量不能是組項(xiàng),但它們可能在宿主結(jié)構(gòu)中組合在一起。它們不能被重命名或重定義。將宿主變量與SQL語(yǔ)句一起使用,給它們添加前綴冒號(hào)(:)。
以下是在工作存儲(chǔ)節(jié)中聲明宿主變量并包含表的語(yǔ)法:
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是一個(gè)SQL通信區(qū)域,通過(guò)它DB2將SQL執(zhí)行的反饋傳遞給程序。它告訴程序執(zhí)行是否成功。在SQLCA下有一些預(yù)定義變量,如SQLCODE,其中包含錯(cuò)誤代碼。SQLCODE中的值“000”表示成功執(zhí)行。
以下是在工作存儲(chǔ)節(jié)中聲明SQLCA的語(yǔ)法:
DATA DIVISION. WORKING-STORAGE SECTION. EXEC SQL INCLUDE SQLCA END-EXEC.
假設(shè)我們有一個(gè)名為“Student”的表,其中包含Student-Id,Student-Name和Student-Address。
STUDENT表包含以下數(shù)據(jù):
Student Id Student Name Student Address 1001 Mohtashim M. Hyderabad 1002 Nishant Malik Delhi 1003 Amitabh Bachan Mumbai 1004 Chulbul Pandey Lucknow
以下示例顯示了COBOL程序中SELECT查詢的用法:
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執(zhí)行上述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 /*
當(dāng)你編譯和執(zhí)行上面的程序,會(huì)產(chǎn)生以下結(jié)果:
1004 Chulbul Pandey Lucknow
以下示例顯示了COBOL程序中INSERT查詢的用法:
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執(zhí)行上述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 /*
當(dāng)你編譯和執(zhí)行上面的程序,會(huì)產(chǎn)生以下結(jié)果:
Record Inserted Successfully 1005 TutorialsPoint Hyderabad
以下示例顯示了COBOL程序中UPDATE查詢的用法:
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執(zhí)行上述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 /*
當(dāng)你編譯和執(zhí)行上面的程序,會(huì)產(chǎn)生以下結(jié)果:
Record Updated Successfully
以下示例顯示了COBOL程序中DELETE查詢的用法:
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執(zhí)行上述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 /*
當(dāng)你編譯和執(zhí)行上面的程序,會(huì)產(chǎn)生以下結(jié)果:
Record Deleted Successfully
游標(biāo)用于一次處理多個(gè)行選擇。它們是保存查詢的所有結(jié)果的數(shù)據(jù)結(jié)構(gòu),可以在工作存儲(chǔ)節(jié)或過(guò)程部中定義。以下是與游標(biāo)相關(guān)的操作:
游標(biāo)聲明可以在工作存儲(chǔ)節(jié)或過(guò)程部中完成。第一個(gè)語(yǔ)句是DECLARE語(yǔ)句,是一個(gè)不可執(zhí)行語(yǔ)句。
EXEC SQL DECLARE STUDCUR CURSOR FOR SELECT STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS FROM STUDENT WHERE STUDENT-ID >:WS-STUDENT-ID END-EXEC.
在使用游標(biāo)之前,必須執(zhí)行Open語(yǔ)句。Open語(yǔ)句為執(zhí)行準(zhǔn)備了SELECT。
EXEC SQL OPEN STUDCUR END-EXEC.
Close語(yǔ)句釋放游標(biāo)占用的所有內(nèi)存。在結(jié)束程序之前必須關(guān)閉游標(biāo)。
EXEC SQL CLOSE STUDCUR END-EXEC.
Fetch語(yǔ)句標(biāo)識(shí)游標(biāo)并將值放在INTO子句中。Fetch語(yǔ)句是循環(huán)編碼的,因此我們一次可獲取一行。
EXEC SQL FETCH STUDCUR INTO :WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS END-EXEC.
以下示例顯示了游標(biāo)從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執(zhí)行上述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 /*
當(dāng)你編譯和執(zhí)行上面的程序,會(huì)產(chǎn)生以下結(jié)果:
1001 Mohtashim M. Hyderabad 1002 Nishant Malik Delhi 1003 Amitabh Bachan Mumbai 1004 Chulbul Pandey Lucknow
更多建議: