第15章DB2扩展.docx
《第15章DB2扩展.docx》由会员分享,可在线阅读,更多相关《第15章DB2扩展.docx(55页珍藏版)》请在冰点文库上搜索。
第15章DB2扩展
第15章DB2扩展
运行于大型机上的数据库通常有两种,分别为DB2和IMS。
其中DB2较IMS更为常用。
由于COBOL程序主要用于处理大量的商务数据,因此必然会涉及到数据库的应用。
同时,DB2本身也可作为一块独立的行业领域。
15.1基本概念
DB2作为一种独立的数据库,与Oracle数据库是属于一个概念范畴的。
DB2不仅可用于大型机,也可用于其他一些操作系统平台,如Unix、Windows等等。
DB2本身的知识十分庞大,此处主要对其在大型机上的应用进行简要的讲解。
15.1.1关系数据库的概念
首先需要明确的是,DB2数据库在结构和原理上是属于关系数据库的。
因此,在学习DB2之前,有必要先了解一下关系数据库的概念。
关系数据库也称关系型数据库,是数据库结构原理发展阶段的第三个模型。
关系型数据库的前一个模型为层次型数据库。
IMS数据库便属于层次型数据库。
下面首先给出一个层次型数据库的基本结构,以便通过对比了解关系型数据库的特点。
层次型数据库结构如图15.1所示。
图15.1层次型数据库结构
由此可见,层次型数据库的结构是通过层级之间的指针建立数据的关系。
层次型数据库的结构实际上与数据结构中的树比较类似。
层次型数据库在数据的管理与查找上并不是很方便。
同时,在层次型数据库中也会存在比较多的数据冗余。
而关系型数据库则相对于层次型数据库在各方面都有了很大的改善。
在关系型数据库中主要是以表(Table)为单位组织数据的。
需要注意的是,此处所说的表是数据库上的概念,同前面讲解的COBOL中的表是不同的。
关系型数据库中表的结构如图15.2所示。
图15.2关系型数据库中的表
可以看到,关系型数据库中的表实际上是由不同的行和列所组成的。
关于表中的行和列分别具有以下属性。
❑关系数据库表中的行:
对应一条完整的数据记录。
各条数据记录都包含有相同数目的属性,每一属性对应该行中的一个单元格。
❑关系数据库表中的列:
对应各条数据记录中相同类型的属性。
每一列中所包含的各个数据项分别描述不同行中数据记录的相关属性。
在关系数据库的表中,还有一个很重要的概念,就是主关键字(PrimaryKey)的概念。
主关键字实际上是每条记录中的一个属性,有时也称作主键或主码。
主关键字是人为指定的,记录中的任何属性都可以作为主关键字。
不过,通常是将比较有明显特征的属性作为主关键字的。
例如,对于以上示例中的表,通常是将学院编号作为主关键字。
关系数据库中包含有多张表,每张表之间通过其中的属性数据项建立直接或间接的联系。
例如,对应以上数据库中的表,图15.3为其中的另一张表。
图15.3关系数据库中的另一张表
对于这张表,通常将课程编号作为主关键字。
同时,注意到在该表中也存在学院编号这一属性。
由于学院编号为前一张表中的主关键字,因此学院编号属性在此处属于外来关键字(ForeignKey)。
通过该外来关键字,可以在以上两张表之间建立起联系。
建立在表的基础上,在关系数据库中还存在视图(View)和索引(Index)的概念。
视图相当于一张虚拟的表。
通常将多表连接查询的结果作为视图,以方便数据查询。
而索引则是直接建立在表上的,相当于一个目录,也是主要用于方便数据查询的。
对数据库的处理过程是以事务为单位进行的。
事务是指作为单个逻辑工作单元执行的一系列操作。
这些逻辑工作单元需要具有以下4个属性,并统称为ACID特性。
❑原子性(Atomicity):
事务中的所有操作要么全做,要么全不做。
❑一致性(Consistency):
事务执行的结果必须是使数据库从一个一致性状态,变为另一个一致性状态。
❑隔离性(Isolation):
一个事务的执行不能被其他事务干扰。
❑持续性(Durability):
一个事务一旦提交,其对数据库中数据的改变就应该是永久的。
最后,对于关系数据库,还应该大致了解一下关于范式的概念。
通常情况下在关系数据库中共有5种范式,目前最高可达到6种。
不过一般情况下,数据库只需满足第三范式就足够了。
下面对前3种范式分别介绍如下。
❑第一范式(1NF):
指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值。
例如,对于以上第一张表而言,是不能把学院编号和学院名称归并为一列的。
❑第二范式(2NF):
满足第二范式的数据划分首先必须满足第一范式。
此外,第二范式同时要求实体的属性完全依赖于主关键字。
例如,若将第二张表中的课程学分作为主关键字,则该表将不满足第二范式。
因为存在着相同学分的课程,课程名称等属性并非根据课程学分而定的。
❑第三范式(3NF):
满足第三范式的数据划分首先也必须满足第二范式。
此外,第三范式同时要求实体中的属性不依赖于其他非主属性。
例如,在第二张表中,是不能将第一张表中的非主属性如院系主任等包含进来的。
可以看到,范式的划分主要是根据不同的数据依赖而来的,并且层级越高的范式要求越严格。
在数据库设计中,遵照范式进行的目的主要是为了减少或避免以下现象的发生。
❑数据冗余
❑插入异常
❑更新异常
❑删除异常
15.1.2DB2简介
DB2是大型机上主要应用的一种关系数据库。
学习DB2,首先应该了解DB2中主要包含有哪些系列的产品。
其中每一个DB2产品对应于一个不同的系统平台。
这些产品分别如下。
❑OS/390与z/OS平台下的DB2。
❑VSE与VM平台下的DB2。
❑iservers下的DB2。
❑Windows平台下的DB2。
❑Unix平台下的DB2。
其中以上前两种产品都属于运行于大型机上的产品。
大型机的型号可以为S/390或者zSeries。
这两种产品实际上是DB2应用得最多的产品,尤其是第一种。
对DB2数据库进行访问的模式通常为客户机/服务器模式,即通常所说的C/S模式。
其中服务器主要包括SQL应用程序接口(API),以及数据库引擎(DatabaseEngine)。
关于SQL,为数据库中最基本的一项操作语言,将在后面的章节中对其进行详细的讲解。
图15.4反映了对DB2进行访问的客户机/服务器模式。
图15.4DB2的C/S模式图
上图中的DRDA(DistributedRelationalDatabaseArchitecture)是指分布式关系数据库体系结构。
而DB2正是属于分布式关系数据库的。
对于应用于大型机中的DB2,首先需要了解其物理环境。
图15.5为DB2在大型机中的物理环境,为DB2学习中最常见到的一个图。
图15.5DB2在大型机中的物理环境
此外,DB2作为数据库,还应了解一下关于数据库管理系统的基本概念。
数据库管理系统即DBMS(DatabaseManagementSystem)。
不同数据库的DBMS功能是不同。
关于DB2的DBMS,主要有以下几项功能。
❑对关系数据库中表的基本管理(Tables)
❑提供优化功能(Optimizer)
❑提供锁的管理功能(LockManager)
❑可进行日志记录(Logging)
❑提供持续操作(ContinuousOperation)
❑提供安全性(Security)
❑提供数据的完整性(Integrity)
❑提供数据的可恢复性(Recovery)
从事关于DB2不同方面的工作,将会用到DB2不同方面的内容。
例如,对于数据库管理员DBA和应用程序开发人员所主要接触到的DB2的内容就不同。
对于开发人员而言,主要需要关注DB2以下这几方面的内容。
❑DB2SQL性能分析(SQLPerformanceAnalyzer)
❑DB2表的编辑(TableEditor)
❑DB2绑定管理(BindManager)
❑DB2路径检查(PathChecker)
❑DB2实用程序(Utilities)
❑DB2请求监控(QueryMonitor)
❑DB2管理工具(AdministrationTool)
❑DB2Web请求工具(WebQueryTool)
最后,利用DB2数据库进行开发时,通常需要遵循一定的步骤进行。
遵循这些步骤,主要是为了规范化开发流程,同时也可减少一定的项目预算风险。
这些步骤依次如下。
(1)建立测试环境
(2)建立SQL原型
(3)绑定Packages和Plans
(4)编写SQL语句
(5)确认目标变化
(6)查询目标属性
(7)应用性能分析
(8)编辑表中数据
(9)载入实际数据
注意:
此处是指整个利用DB2进行开发的流程,而并非指单纯地在COBOL程序中如何访问DB2。
关于如何在COBOL的源代码中访问DB2,将在后面的章节中详细讲解。
15.1.3DB2的组织结构及创建步骤
通过前面的讲解可以知道,DB2数据库对数据的组织与管理是以表为基本单位的。
而在DB2系统中,表是存放在表空间(TableSpace)之中的。
一块表空间可以有一个到多个表。
表空间则存放在数据库(database)之中。
一个数据库也可以有一个到多个表空间。
需要注意的是,此处所说的数据库是一个数据空间上的概念。
图15.6为此结构特征。
图15.6DB2的数据组织结构
同时,DB2在硬件平台上还将涉及到存储组(StorageGroup)和卷(Volume)。
结合前面所讲解的视图和索引的概念,DB2及其硬件平台上中各单元的关系,如图15.7所示。
图15.7DB2及硬件平台上各单元的关系
关于上图所示的存储组,实际上属于一组直接访问存储设备(DASD)上的卷。
这些DASD卷用于分配DB2中的表空间及索引空间。
在DB2中,所有数据库服务进程的集合被称作一个Instance。
一个Instance中有多个数据库,以及一个数据库管理配置文件(DBMCONFIGFILE)。
关于Instance,通常主要有一下几种操作。
❑db2icrt:
建立一个instance(并不激活)。
❑db2ilist:
将多个instance进行列表。
❑db2idrop:
删除一个instance。
❑db2start:
启动一个instance(进行激活)。
同系统的IPL(InitialProgramLoading)类似,DB2数据库的创建也是需要经历一定的步骤的。
这些步骤依次如下。
(1)创建数据库存储空间。
(2)建立数据字典(catalog)及数据库恢复日志(recoverylog)。
(3)建立数据库配置文件(configurationfile),并配置相应的默认值。
(4)绑定(bind)数据库实用程序(utilities)到数据库中。
(5)定义3个特殊的表空间:
SYSCATSPACE、TEMPSPACE、USERSPACE。
需要注意的是,对于这3个表空间,用户只能管理其中的USERSPACE。
(6)将数据库编目在本地数据字典与系统数据字典上,以用于用户查询。
其中本地数据字典在DB2所设的硬盘上。
(7)分配代码集(codeset)、区域信息(territory)、以及比较对照顺序(collatingsequence)。
其中区域信息如当地的日期、时间等等。
(8)建立SYSCAT、SYSFVN、SYSIBM、SYSSTAT、以及scheme。
(9)建立优先级(privilege)。
关于上面提到的scheme,主要需要了解schemename的概念。
关于schemename,实际上是指实体名称中的高位标志字段(high-levelqualifier)。
该字段主要用于标志整个名称。
当建立一个用户名时,必然会产生一个同名的scheme。
例如,以下将scheme设置为了“PAYROLL”。
SETCURRENTSCHEME=‘PAYROLL’
则在此设置的基础上,以下第一条SQL语句在实际执行中将相当于第二条SQL语句。
SELECT*FROMEMPLOYEE
SELECT*FROMPAYROLL.EMPLOYEE
最后,在大型机中实际运行含有DB2的程序,并查看运行结果,主要是通过SPUFI产品进行的。
SPUFI(SQLProcessorUsingFileInput)即使用到文件输出的SQL处理器。
使用SPUFI处理DB2程序的流程如图15.8所示。
图15.8SPUFI在DB2中的应用
15.2DB2的基本应用
DB2在COBOL中的应用与普通的COBOL编码是不同的。
涉及到DB2的代码,实际上是以COBOL为宿主语言,并嵌入到COBOL代码中编写的。
同时,在编码之后,将其编译连接为可执行程序,也是需要经历特定的过程的。
以下分别对这两方面的内容进行讲解。
15.2.1DB2在COBOL中的编码
由于DB2作为关系数据库,因此对其操作仍然主要是通过SQL语句进行的。
SQL(StructuredQueryLanguage)即结构化查询语言的意思,任何关系数据库通常都会用到。
关于SQL语句,将在后面的章节中详细讲解。
此处只考虑在COBOL中是如何利用SQL语句访问和操作DB2数据库的。
在COBOL中调用SQL语句的格式如下。
EXECSQL
SQLstatements
END-EXEC.
可以看到,在COBOL中调用SQL语句主要是通过EXECSQL和END-EXEC对其进行指定的。
这两个命令之间便为通常意义的SQL语句。
此处的SQL语句实际上可以看作是以COBOL为宿主语言,并嵌入到COBOL源码中编写的。
同时,还应了解一下SQLCA的基本概念。
SQLCA(SQLCommunicationArea)即SQL通信区域的意思。
SQLCA主要用于实现COBOL应用程序和DB2数据库之间的交互。
当COBOL程序中需要访问或操作DB2数据库时,需要在工作存储节中将SQLCA包含进来。
并且,还应将数据记录也相应地包含进来。
相关代码如下。
……
DATADIVISION.
WORKING-STORAGESECTION.
EXECSQLINCLUDESQLCAEND-EXEC.
EXECSQLINCLUDETESTRCDEND-EXEC.
……
执行SQL语句后,将会得到一个称作SQLCODE的返回码。
SQLCODE实际上存放于SQLCA之中。
当SQLCODE为0或者100时,表示该条SQL语句执行成功。
当SQLCODE为负数时,则表示该条SQL语句在执行时出现错误。
实际上,COBOL程序中关于DB2方面的代码几乎都是涵盖在EXECSQL和END-EXEC之中的。
以下为一段应用到DB2的完整的COBOL程序代码。
此处仅需通过该段代码对DB2在COBOL中的应用有一个大致的印象。
相应代码如下。
IDENTIFICATIONDIVISION.
PROGRAM-ID.PGMDB99.
AUTHOR.XXX.
*
ENVIRONMENTDIVISION.
*
DATADIVISION.
WORKING-STORAGESECTION.
EXECSQLINCLUDESQLCAEND-EXEC.
EXECSQLINCLUDEEMP99RCDEND-EXEC.
01ERROR-MESSAGE.
03SQL-CODEPICX(10).
03ERR-LENPICS9(4)USAGECOMP
VALUEIS+560.
03E-MESS1PICX(80).
03E-MESS2PICX(80).
03E-MESS3PICX(80).
03E-MESS4PICX(80).
03E-MESS5PICX(80).
03E-MESS6PICX(80).
03E-MESS7PICX(80).
03E-MESS8PICX(80)VALUEIS‘FIXANDRETRY’.
03REC-LENPICS9(8)USAGECOMP
VALUEIS+80.
01WRKFLDS.
03RECKEYPICX(6)VALUEIS‘000000’.
03DBERR-SWPICX
(1)VALUEIS‘N’.
03KPICS9(4)COMP.
03OUTPUT-MSGPICX(80).
*
PROCEDUREDIVISION.
EXECSQLDECLAREEMPCURSORFOR
SELECT*
FROMTSOUD99.EMPLOYEE
END-EXEC.
EXECSQLOPENEMPEND-EXEC.
MOVESQLCODETOSQL-CODE
IFSQLCODE<0
DISPLAY‘I1:
’SQL-CODE
PERFORMDBERR-RETURN
END-IF.
*****STARTOFLOOP*****
PERFORMVARYINGKFROM1BY1
UNTILKIS>100
MOVELOW-VALUESTODCLEMPLOYEE
EXECSQLFETCHEMPINTO:
DCLEMPLOYEE
END-EXEC
MOVESQLCODETOSQL-CODE
IFSQLCODE=100
DISPLAY‘I2:
’>SQL-CODE
DISPLAY‘ENDOFDATA’
GOTOCLOSING
ELSE
DISPLAYK’=’DCLEMPLOYEE
END-IF
END-PERFORM.
*****ENDOFLOOP*****
CLOSING.
EXECSQLCLOSEEMPEND-EXEC.
IFSQLCODE<0
GOTODBERR-RETURN
END-IF.
DISPLAY‘PROGRAMENDEDNORMALLY!
’.
STOPRUN.
DBERR-RETURN.
MOVESQLCODETOSQL-CODE.
DISPLAYSQL-CODE.
DISPLAY‘PROGRAMABEND!
’.
CALL‘DSNTIAR’USINGSQLCAERROR-MESSAGEREC-LEN.
DISPLAYERROR-MESSAGE.
GOBACK.
以上程序实际上首先定义了一个DB2中的游标(CURSOR)。
该游标的名称为EMP。
程序通过该游标将输入数据集TSOUD99.EMPLOYEE中的数据记录选择并输出到显示屏上。
数据的输入及输出都需要借助SPUFI产品进行。
此外还需注意的是,在嵌入到EXECSQL与END-EXEC之间的DB2相关变量是不能有中划线的。
不过这些变量却可以包含下划线。
这点同COBOL正好相反。
COBOL中的变量可以包含中划线,但却不可以有下划线。
15.2.2含DB2的COBOL编译过程
涉及到DB2的COBOL程序的编译过程相对单纯的COBOL程序要复杂一些。
图15.9反映了其编译及连接的大体过程。
图15.9涉及DB2的COBOL程序编译过程
实际上,在应用程序中主要是通过SQL语句访问和操作DB2数据库的。
因此,此处所说的涉及到DB2的COBOL程序通常也可以看作是含有SQL语句的COBOL程序。
由图15.9可知,对此类程序在编译前,首先要进行一个预编译。
预编译所起的作用是将程序的源代码分为以下两部分,并对其分别进行不同的处理。
❑SQL语句部分:
使用DBRM对其进一步处理。
❑COBOL代码部分:
使用COBOL编译器对其进一步处理。
关于DBRM(DatabaseRequestModule),也就是数据库请求模块的意思。
DBRM实现的功能主要有以下两条。
❑绑定Package
❑绑定Plan
此处所说Package即SQL语句处理之后所生成的结果,并存放在DB2之中。
实际上,Package同COBOL代码在编译连接后,生成的加载模块(LoadModule)是比较类似的。
Package的集合在DB2中被称作collection。
而与Package相应的Plan正是反映了DB2搜索collection的顺序。
上图所示的DB2Catalog在前面的DB2物理环境(图15.5)中也曾出现过。
DB2Catalog实际上也就是DB2的数据字典。
所谓数据字典,也就是一张系统表,用来存放数据库所用的有关信息。
对于用户而言,这张表是只读的。
DB2Directory的功能与DB2Catalog在某种意义上比较类似。
不过DB2Directory的执行性能要比DB2Catalog更加好。
DB2Directory是以VSAM文件的形式组织存放数据的。
在DB2Directory中共包含5个结构(Structure),分别如下。
❑SYSUTILX:
用于存放实用程序(Utilities)。
❑SYSLGRNX:
存放活动的(active)及归档的(archive)日志。
❑SPT01:
存放Plan。
❑SCT02:
存放Package。
❑DBD01:
存放描述数据库的相关信息。
此外,当DB2Catalog和DB2Directory中的数据不一致时,需要使用REPAIRDBD语句进行同步。
当将二者进行同步时,将以DB2Directory中的数据为准。
上图中的DCLGEN(DeclarationsGenerator)即声明生成程序。
DCLGEN在DB2中的应用主要有以下两条。
❑产生通过SQL语句声明的表;
❑产生通过COBOL代码声明的对应于表或视图的主变量。
上图中的DSNHLI则是COBOL程序与SQL语句的接口。
DSNHLI中含有相关参数,并在COBOL代码的连接编辑(LinkEditor)步骤中参与进来。
15.3常用SQL语句
前面多次提到,在COBOL应用程序中对DB2数据库进行操作最主要是通过SQL语句进行的。
SQL语句通常可以分为3种类型,分别为DML、DDL以及DCL。
下面分别对这3种类型的SQL语句予以讲解。
15.3.1DML类别的SQL语句
DML(DataManipulationLanguage)即数据操作语言的意思。
DML类别的SQL语句通常主要有以下几种。
❑SELECT语句
❑INSERT语句
❑UPDATE语句
❑DELETE语句
DML类别的SQL语句实际上是作为应用程序开发人员用得最多的一类SQL语句。
下面分别对以上这4种语句进行讲解。
1.SELECT语句
SELECT语句主要用于数据的查询。
SELECT语句是以上4种DML类别的SQL语句中用得最多的一条。
同时,SELECT语句也是在整个SQL语句里用得最多的一条。
下面首先给出DB2中的一张表,并设表名为Q.COURSE,如图15.10所示。
图15.10Q.COURSE表
基于以上表中数据,使用SELECT语句对其最基本的操作便是全选表中所有的数据。
实现全选的语句如下。
SELECT*
FROMQ.COURSE
在实际应用中,更多的情况是只选择表中的部分数据,如特定数据记录中的特定属性。
例如,以下SELECT语句将选择由Simon任课的所有课程的名称。
SELECTNAME
FROMQ.COURSE
WHEREINSTRUCTOR=‘Simon’
以上语句执行后,将选择出以下数据。
JCL
JES2
由此可见,使用SELECT语句进行数据查询选择时