开发工具:Web Sphere Development
1、DB2 支持多种语言编程。如COBOL、C、C++等,这些语言称为宿主语言,SQL语句要以嵌入的方式与宿主语言结合在一起,宿主语言通过宿主变量来操作数据库。这样SQL语句以EXEC SQL开始。
2、使用嵌入式SQL的程序首先要通过DB2的预编译器进行预编译,把嵌入的SQL语句翻译成宿主语言的代码和函数,然后经过宿主语言编译器的编译把DB2的库函数LINK进来,就能生成最后的可执行程序。
3、应用程序为了和SQL语句进行数据的交换,要使用宿主变量。宿主变量要在程序里声明。宿主变量使用在SQL语句中时前要加“:”作为识别标志。如果要从SQL语句中返回单行数据,使用INTO子句。
4、COBOL连接DB2数据库
(1)、从数据库的表中SELECT一条语句,并显示在控制台上。
A、COBOL代码:
IDENTIFICATION DIVISION.
PROGRAM-ID. DB2PRRACTICE.
ENVIRONMENT DIVISION.
DATA DIVISION.
FILE SECTION.
PROCEDURE DIVISION.
EXEC SQL CONNECT TO ETPCS END-EXEC. //打开数据库的连接
PERFORM SELECT-TABLE. //执行SQL语句
DISPLAY 'SQLCODE=' SQLCODE.
DISPLAY 'STUNO:' AA. // AA 、BB 、CC是宿主变量
DISPLAY 'STUNAME:' BB.
DISPLAY 'STUSEX:' CC.
STOP 'PRESS...'.
EXEC SQL DISCONNECT ETPCS END-EXEC. //关闭数据库的连接
GOBACK.
SELECT-TABLE.
EXEC SQL // COBOL程序中嵌入了SQL 语句,是用这种格式的。
SELECT STUNO,STUNAME,STUSEX //查询表,把SELECT出来的内容放到宿主变量AA 、BB 、CC中,但要注意宿主变量的引用方式。
INTO :EMPLOYEE.AA , :EMPLOYEE.BB , :EMPLOYEE.CC
FROM ETPUSER.ETPTEST
WHERE STUNO='00001'
这部分代码来定义表 |
B 、CPY文件
EXEC SQL DECLARE ETPCS.ETPTEST TABLE
(
STUNO CHARACTER(10) NOT NULL ,
STUNAME CHARACTER(10) NOT NULL,
STUSEX CHARACTER(10) NOT NULL
) END-EXEC.
这部分代码来定义宿主变量 |
01 EMPLOYEE.
10 AA PIC X(10).
10 BB PIC X(10).
10 CC PIC X(10).
注意:用INTO子句每次只能从返回单行语句,要返回多行数据,需要使用游标(CURSOR)来一次一行的处理多行数据,可以认为在DB2中线建立了一张结果表,用来存放付符合条件的记录,DB2使用一个游标在结果集中依次把记录传递给程序,记录全部取走后,程序将达到SQLCODE=100。每个CURSOR都有自己的名字,程序中可以同时存在多个CURSOR,使用不同的名字分别引用。
5、使用CURSOR来读取多行数据
①DECLARE CURSOR:定义CURSOR所查找数据的SQL语句
②OPEN CURSOR :打开CURSOR.生成结果集
③FETCH CURSOR: 从结果集中读取下一条记录数据
④CLOSE CURSOR :释放结果集
下面是一个完整的使用游标的例子
IDENTIFICATION DIVISION.
PROGRAM-ID. DB2PRRACTICE.
ENVIRONMENT DIVISION.
DATA DIVISION.
FILE SECTION.
WORKING-STORAGE SECTION.
EXEC SQL INCLUDE SQLCA END-EXEC.
EXEC SQL INCLUDE COBPRACTICE END-EXEC.
PROCEDURE DIVISION.
* MOVE '00001' TO AA.
EXEC SQL CONNECT TO ETPCS END-EXEC.
PERFORM SELECT-TABLE.
PERFORM S UNTIL SQLCODE = 100 . // 要把SELECT得到的记录一条一条的放到宿主变量里面并且把所有的结果显示出来,需要用这个循环
PERFORM T.
EXEC SQL DISCONNECT ETPCS END-EXEC.
STOP 'END...' .
SELECT-TABLE.
EXEC SQL
DECLARE TESTCURSOR CURSOR FOR
SELECT STUNO,STUNAME,STUSEX
定义一个游标 |
WHERE STUNAME = 'LISI '
END-EXEC.
EXEC SQL
OPEN TESTCURSOR //打开这个游标
END-EXEC.
S.
用FETCH语句,把获得的结果集放到宿主变量里,知道SQLCODE=100时,说明已经全部遍历完毕
|
FETCH TESTCURSOR
INTO :AA , :BB , :CC
END-EXEC.
IF SQLCODE NOT = 100
PERFORM EXECU . // 不等于100时显示
EXECU.
如果不加这个条件的话,最后的一条记录会输出两次
|
DISPLAY 'STUNO:' AA.
DISPLAY 'STUNAME:' BB.
DISPLAY 'STUDEX:' CC.
T.
EXEC SQL
CLOSE TESTCURSOR
关闭游标 |
(2)、向数据库中插入一条记录
① COBOL 源代码
IDENTIFICATION DIVISION.
PROGRAM-ID. INSERTPRAC.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
DATA DIVISION.
FILE SECTION.
WORKING-STORAGE SECTION.
EXEC SQL INCLUDE SQLCA END-EXEC.//把SQLCA文件包含进来
EXEC SQL INCLUDE INSERTPRAC END-EXEC.//把CPY文件包进来
PROCEDURE DIVISION.
EXEC SQL CONNECT TO ETPCS END-EXEC. //打开数据库连接
PERFORM S.
IF SQLCODE = 0 //SQLCODE为0 表示执行成功
EXEC SQL COMMIT END-EXEC //执行提交操作
ELSE
EXEC SQL ROLLBACK END-EXEC. //否则,执行回滚操作
EXEC SQL DISCONNECT ETPCS END-EXEC. //操作完数据库之后关闭数据库的连接。
GOBACK.
S.
MOVE '00008' TO STUNO.
MOVE 'XIAOZHAN' TO STUNAME.
MOVE 'M' TO STUSEX.
先把要赋的值给宿主变量,然后再从宿主变量传给表的各个列 |
INSERT INTO ETPUSER.ETPTEST
(
STUNO ,
STUNAME ,
STUSEX
)
VALUES
(
:INSERTREC.STUNO ,
:INSERTREC.STUNAME ,
:INSERTREC.STUSEX
这就是把宿主变量给SQL的过程 |
END-EXEC.
EXIT.
② CPY文件
EXEC SQL DECLARE ETPTEST TABLE
( STUNO CHARACTER(10) NOT NULL ,
STUNAME CHARACTER(10) NOT NULL ,
STUSEX CHARACTER(10) NOT NULL
)
END-EXEC.
01 INSERTREC.
10 STUNO PIC X(10).
10 STUNAME PIC X(10).
10 STUSEX PIC X(10).
5、主程序和子程序
首先建立一个带有子程序的样例程序S1,然后建立一个空的PROJECT S1-SUB ,并把S1中的子程序MOVE到S1-SUB种中,然后把S1-SUB设置成.DALL文件(因为需要动态调用),主程序中的静态调用改成动态调用即可
01 CALLSUB PIC X(8) VALUE 'PrintApp'.
Call CALLSUB using Program-pass-fields