COBOL 數(shù)據(jù)庫(kù)接口

2018-10-19 11:34 更新

截至目前,我們已經(jīng)學(xué)會(huì)了使用COBOL中的文件。現(xiàn)在,我們將討論COBOL程序如何與DB2進(jìn)行交互。它涉及以下術(shù)語(yǔ):

  • Embedded SQL(嵌入式SQL)
  • DB2 Application Programming(DB2應(yīng)用程序編程)
  • Host Variables(宿主變量)
  • SQLCA
  • SQL Queries(SQL查詢)
  • Cursors(游標(biāo))

Embedded SQL(嵌入式SQL)

嵌入式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ǔ)句中。

DB2 Application Programming (DB2應(yīng)用程序編程

以下是編寫(xiě)COBOL-DB2程序時(shí)要遵循的規(guī)則:

  • 所有SQL語(yǔ)句在EXEC SQLEND-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ò)程部中。

Host Variables(宿主變量)

宿主變量用于從表中接收數(shù)據(jù)或在表中插入數(shù)據(jù)。必須為在程序和DB2之間傳遞的所有值聲明宿主變量。它們?cè)诠ぷ鞔鎯?chǔ)節(jié)中進(jìn)行聲明。

宿主變量不能是組項(xiàng),但它們可能在宿主結(jié)構(gòu)中組合在一起。它們不能被重命名重定義。將宿主變量與SQL語(yǔ)句一起使用,給它們添加前綴冒號(hào)(:)。

語(yǔ)法

以下是在工作存儲(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

SQLCA是一個(gè)SQL通信區(qū)域,通過(guò)它DB2將SQL執(zhí)行的反饋傳遞給程序。它告訴程序執(zhí)行是否成功。在SQLCA下有一些預(yù)定義變量,如SQLCODE,其中包含錯(cuò)誤代碼。SQLCODE中的值“000”表示成功執(zhí)行。

語(yǔ)法

以下是在工作存儲(chǔ)節(jié)中聲明SQLCA的語(yǔ)法:

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

SQL Queries(SQL查詢)

假設(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

Cursors(游標(biāo))

游標(biāo)用于一次處理多個(gè)行選擇。它們是保存查詢的所有結(jié)果的數(shù)據(jù)結(jié)構(gòu),可以在工作存儲(chǔ)節(jié)或過(guò)程部中定義。以下是與游標(biāo)相關(guān)的操作:

  • Declare(聲明)
  • Open(打開(kāi))
  • Close(關(guān)閉)
  • Fetch(提?。?/span>

Declare Cursor(聲明游標(biāo))

游標(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.

Open(打開(kāi))

在使用游標(biāo)之前,必須執(zhí)行Open語(yǔ)句。Open語(yǔ)句為執(zhí)行準(zhǔn)備了SELECT。

EXEC SQL
   OPEN STUDCUR
END-EXEC.

Close(關(guān)閉)

Close語(yǔ)句釋放游標(biāo)占用的所有內(nèi)存。在結(jié)束程序之前必須關(guān)閉游標(biāo)。

EXEC SQL
   CLOSE STUDCUR
END-EXEC.

Fetch(提取)

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
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)