天天看點

cobol操作db2

1.概念:

對資料庫的處理過程是以事物為機關進行的。

組織與管理是以表為機關進行的。

表是放在表空間(table space)中的,

表空間是放在資料庫(database)中的。

Scheme:是指實體名稱中的高位辨別字段,該字段用于标志整個名稱。

當建立一個使用者時,會産生一個同名的scheme。

如:SET CURRENT SCHEME = 'PAYROLL'

SELECT * FROM EMPLOYEE. ---等同于下一條語句。

SELECT * FROM PAYROLL.EMPLOYEE.

視圖:VIEW,一張虛拟表,通常将多表連結的結果

作為視圖,以友善資料查詢。

索引:INDEX,直接建立在表上的,相當于一個目錄,

也是友善資料查詢。

2.應用:

SQLCA:SQL通信區域,實作COBOL和DB2的互動。

執行SQL後,會産生一個稱作SQLCODE的傳回碼,數字組成,

存放于SQLCA中,為0或者100時,成功,為負數時錯誤。

在SQLCA中,還有SQLSTATE,由字元組成。

DB2 catalog:資料字典,一張系統表,用來存放資料庫所用的有關資訊。

對于使用者而言,為隻讀的。

DB2 directory:功能相似于catalog,性能高,是以VSAM檔案組織存放資料的。

二者同步時,以DB2 directory為準。

COBOL中調用SQL語句的格式:

嵌入式SQL

主變量:即可為COBOL所用,也可為SQL語句所用(前面加‘:’)。

如:DATA DIVISION.

WORKING-STORAGE SECTION.

EXEC SQL INCLUDE SQLCA END-EXEC. --通信區(必寫)

EXEC SQL INCLUDE COURSERCD EXEC-EXEC. --指定資料記錄

01 COURSE-DETAIL.

03 RCODE PIC X(4). --主變量,

03 RNAME PIC X(20).

03 RINST PIC X(10).

03 RDAYS PIC 9.

PROCEDURE DIVISION.

MOVE '00AB' TO RCODE.

MOVE 'GANG' TO RNAME.

MOVE 'SICC' TO RINST.

EXEC SQL

INSERT INTO Q.COURSE ( CODE, NAME)

VALUES ( :RCODE, :RNAME)

UPDATE Q.COURSE

SET INST = :RINST

WHERE CODE = :RCODE.

SELECT DAYS

INTO :RDAYS FROM Q.COURSE

WHERE CODE = :RCODE.

END-EXEC.

...

訓示變量:在主變量之後,用于訓示主變量所接收到資料是否為空。

當為空時,訓示變量為負數。

用途:測試資料是否為空值,将空值傳遞給DB2中的資料。

如:EXEC SQL

SELECT NO, NAME

INTO :NO, :NAME:IND1 --測試空值

FROM TESTB

WHERE NO = :NO

END-EXEC.

IF IND1 < 0 MOVE 'UNKNOW' TO TESTATTR1.

...

MOVE -1 TO IND1.

MOVE '00A1' TO NO.

EXEC SQL

SET NAME = :NAME:IND1 --存儲空值

WHERE NO = :NO

ENDE-EXEC.

動态SQL:将SQL首先讀入變量,通過嵌入式SQL執行變量中的SQL。

包含SELECT和非SELECT(含有參數和不含有參數)

不含有參數的SELECT:

如:01 STMT.

49 STMT-LEN PIC S9(4) COMP VALUE +255.

49 STMT-TEXT PIC X(255).

MOVE 'DELETE FROM TESTTB'.

EXEC SQL

EXECUTE IMMEDIATE :STMT --執行

END-EXEC

含有參數的SELECT:

如:01 STMT.

49 STMT-LEN PIC S9(4) COMP VALUE +255.

49 STMT-TEXT PIC X(255).

01 PARMA PIC X(5).

01 PARMB PIC X(20).

MOVE 'DELETE FROM TESTTB

WHERE TESTNO = ? AND TESTNAME = ?' TO STMT.

EXEC SQL

PREPARE PRST FROM :STMT. ---預執行

END-EXEC.

MOVE 'A0023' TO PARMA.

MOVE 'GEORGE' TO PARMB.

EXEC SQL

EXECUTE PRST USING :PARMA, :PARMB --執行

END-EXEC.

遊标:對多行資料進行處理時,以行為機關的資料記錄的定位功能。

分為基本遊标和復原遊标(靜态和動态)。

基本遊标

定義:

如:MOVE 'ADFADADF' TO HATTR1.

EXEC SQL

DECLARE P1 CURSOR FOR --定義遊标

SELECT TESTNO, TESTNAME --選擇指定列(屬性)

FROM TESTTB --指定表

WHERE TESTATTR1 = :HATTR1 -指定比對屬性

ORDER BY TESTNO -指定屬性排序,如不指定預設資料記錄的位置進行搜尋

OPTIMIZE FOR 20 ROWS -每屏中顯示的行數

FETCH FIRST 200 ROWS ONLY -共顯示的行數

END-EXEC

用法:打開--使用--關閉。

如:01 HOST.

05 HNO PIC X(5).

05 HNAME PIC X(20).

...

EXEC SQL DECLARE TST CURSOR FOR

SELECT TESTNO, TESTNAME

FROM TESTTB

WHERE TESTATTR1 = :HATTR1

ORDER BY TESTNO

END-EXEC

...

EXEC SQL OPEN TST END-EXEC.

...

EXEC SQL

FETCH TST INTO :HNO, :HNAME --主要用FETCH來操作變量傳遞

END-EXEC.

EXEC SQL

DELETE FROM TESTTB WHERE CURRENT OF TST

END-EXEC.

...

EXEC SQL CLOSE TST END-EXEC.

STOP RUN.

當進行UPDATE操作時,要在遊标中指定更新哪一個屬性。

如:EXEC SQL DECLARE TST CURSOR FOR

SELECT...

...

FOR UPDATE OF TESTNAME --指定屬性

...

END-EXEC

...

EXEC SQL UPDATE TESTTB

SET TESTNAME = :HNAME

WHERE CURRENT OF TST

END-EXEC.

利用遊标處理多行記錄:

利用遊标處理多行記錄時,相應的主變量也應定義為數組的形式。

通過OCCURS語句定義為COBOL中的表。

如:01 HOST-VARY.

05 HOST-ID PIC 9(5) COMP OCCURS 10 TIMES.

05 HOST-NAME OCCURS 10 TIMES.

49 NAME-LEN PIC 9(2) COMP.

49 NAME-TEXT PIC X(20).

EXEC SQL

DECLARE MTR SCROLL CURSOR

WITH ROWSET POSITIONING

FOR SELECT ID, NAME

FROM TESTTABLE

END-EXEC

EXEC SQL OPEN MTR END-EXEC.

...

EXEC SQL

FETCH CURRENT ROWSET FROM C1 FOR 10 ROWS INTO ...

END-EXEC.

EXEC SQL

FETCH NEXT ROWSET FROM C1 FOR 10 ROWS INTO...

END-EXEC.

EXEC SQL

FETCH ROWSET STARTING AT RELATIVE -7

FROM C1 FOR 10 ROWS INTO ...

END-EXEC

EXEC SQL

FETCH FIRST ROWSET

FROM MTR FOR 10 ROWS

INTO :HOST-ID:INDICATE1, :HOST-NAME:INDICATE2

END-EXEC.

...

EXEC SQL CLOSE MTR END-EXEC.

STOP RUN.

4.其他

DB2中的鎖:保證資料操作的一緻性。

因素:類型,範圍,時間

死鎖:并發程序互相等待資源無限等待的情況。

通路路徑:Access Path,決定查找通路資料的方式,對效率有直接影響。

EXPLAIN:優化工具,主要根據PLAN_TABLE實作性能優化的。

而PLAN_TABLE中儲存的資訊為通路路徑相關的資訊。