DB2 初学笔记

来源:互联网 发布:mac版的网游 编辑:程序博客网 时间:2024/05/20 14:43

开发工具:Web Sphere Development

1DB2 支持多种语言编程。如COBOLCC++等,这些语言称为宿主语言,SQL语句要以嵌入的方式与宿主语言结合在一起,宿主语言通过宿主变量来操作数据库。这样SQL语句以EXEC SQL开始。

2、使用嵌入式SQL的程序首先要通过DB2的预编译器进行预编译,把嵌入的SQL语句翻译成宿主语言的代码和函数,然后经过宿主语言编译器的编译把DB2的库函数LINK进来,就能生成最后的可执行程序。

3、应用程序为了和SQL语句进行数据的交换,要使用宿主变量。宿主变量要在程序里声明。宿主变量使用在SQL语句中时前要加“:”作为识别标志。如果要从SQL语句中返回单行数据,使用INTO子句。

4COBOL连接DB2数据库

1)、从数据库的表中SELECT一条语句,并显示在控制台上。

ACOBOL代码:

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'

这部分代码来定义表

          END-EXEC.    

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

定义一个游标

               FROM ETPUSER.ETPTEST

               WHERE STUNAME = 'LISI '

           END-EXEC.

           EXEC SQL

               OPEN TESTCURSOR       //打开这个游标

           END-EXEC.

       S.

FETCH语句,把获得的结果集放到宿主变量里,知道SQLCODE=100时,说明已经全部遍历完毕

 

            EXEC SQL

               FETCH  TESTCURSOR

               INTO :AA , :BB , :CC

            END-EXEC.

            

IF SQLCODE NOT = 100

 

            PERFORM EXECU .  // 不等于100时显示

       EXECU.

如果不加这个条件的话,最后的一条记录会输出两次

 

            DISPLAY 'SQLCODE=' SQLCODE.

            DISPLAY 'STUNO:'   AA.

            DISPLAY 'STUNAME:' BB.

            DISPLAY 'STUDEX:'  CC.

       T.

           EXEC SQL

               CLOSE TESTCURSOR

关闭游标

           END-EXEC.

 

 

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   //SQLCODE0 表示执行成功

                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.

先把要赋的值给宿主变量,然后再从宿主变量传给表的各个列

              EXEC SQL

                 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中的子程序MOVES1-SUB种中,然后把S1-SUB设置成.DALL文件(因为需要动态调用),主程序中的静态调用改成动态调用即可

01 CALLSUB  PIC X(8) VALUE    'PrintApp'.      

Call CALLSUB  using Program-pass-fields   

 

原创粉丝点击