db2 数据库 基础 知识 入门.docx
- 文档编号:6605673
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:33
- 大小:43.21KB
db2 数据库 基础 知识 入门.docx
《db2 数据库 基础 知识 入门.docx》由会员分享,可在线阅读,更多相关《db2 数据库 基础 知识 入门.docx(33页珍藏版)》请在冰豆网上搜索。
db2数据库基础知识入门
DB2基础
DB2是IBM一种分布式数据库解决方案。
说简单点:
DB2就是IBM开发的一种大型关系型数据库平台.它支持多用户或应用程序在同一条SQL语句中查询不同database甚至不同DBMS中的数据。
目前,DB2有如下一些版本:
(比如DB2forUnix,DB2forWindows,DB2forAS/400,DB2forOS/390等)
DB2是IBM公司开发的关系数据库管理系统,它有多种不同的版本,如:
DB2工作组版(DB2WorkgroupEdition)、DB2企业版(DB2EnterpriseEdition)、DB2个人版(DB2PersonalEdition)和DB2企业扩展版(DB2Enterprise-ExendedEdition)等,这些产品基本的数据管理功能是一样的,区别在于支持远程客户能力和分布式处理能力。
个人版适用于单机使用,即服务器只能由本地应用程序访问。
工作组版和企业版提供了本地和远程客户访问DB2的功能(当然远程客户要安装相应客户应用程序开发部件),企业版包括工作组版中的所有部件外再增加对主机连接的支持。
企业扩展版允许将一个大的数据库分布到同一类型的多个不同计算机上,这种分布式功能尤其适用于大型数据库的处理。
DB2可运行在OS/2、WindowsNT、UNIX操作系统上,通常将运行在这些平台上的DB2产品统称为DB2通用数据库,这主要是强调这些产品运行环境类似,并共享相同的源代码。
DB2通用数据库主要组件包括数据库引擎(DalabaseEngine)应用程序接口和一组工具。
数据库引擎提供了关系数据库管理系统的基本功能,如管理数据、控制数据的访问(包括并发控制)、保证数据完整性及数据安全。
所有数据访问都通过SQL接口进行。
db2起源于systemr和systemr*。
他支持从pc到unix,从中小型机到大型机;从ibm到非ibm(hp及sununix系统等)各种操作平台。
他既可以在主机上以主/从方式独立运行,也可以在客户/服务器环境中运行。
其中服务
平台可以是os/400,aix,os/2,hp-unix,sun-solaris等操作系统,客户机平台可以是os/2或windows,dos,aix,hp-ux,sunsolaris等操作系统。
一、db2核心数据库的特色
db2数据库核心又称作db2公共服务器,采用多进程多线索体系结构,可以运行于多种操作系统之上,并分别根据相应平台环境作了调整和优化,以便能够达到较好的性能。
(1)支持面向对象的编程
db2支持复杂的数据结构,如无结构文本对象,可以对无结构文本对象进行布尔匹配、最接近匹配和任意匹配等搜索。
可以建立用户数据类型和用户自定义函数。
(2)支持多媒体应用程序
db2支持大二分对象(blob),允许在数据库中存取二进制大对象和文本大对象。
其中,二进制大对象可以用来存储多媒体对象。
(3)备份和恢复能力
(4)支持存储过程和触发器,用户可以在建表时显示的定义复杂的完整性规则
(5)支持的硅sql查询
(6)支持异构分布式数据库访问
(7)支持数据复制
二、开发工具
ibm提供了许多开发工具,主要有visualizerquery,visualage,visualgen。
visualizer是客户/服务器环境中的集成工具软件,主要包括visualizerquery可视化查询工具,visualizerultimediaquery可视化多媒体查询工具,visualizerchart可视化图标工具,visualizerprocedure可视化过程工具,visualizerstatistics可视化统计工具,visualizerplans可视化规划工具,visualizerdevelopment可视化开发工具。
visualage是一个功能很强的可视化的面向对象的应用开发工具,可翼大幅度的提高软件开发效率。
其主要特征有:
(1)可视化程序设计工具。
(2)部件库。
包括支持图形用户接口的预制不见,以及包含数据库查询、事务和本地、远程函数的通用部件。
(3)关系数据库支持。
(4)群体程序设计。
(5)支持增强的动态连接库。
(6)支持多媒体。
(7)支持数据共享。
visualgen是ibm所提供的高效开发方案中的重要组成部分。
它集成了第四代语言、客户/服务器与面向对象技术,给用户提供了一个完整、高效的开发环境。
三、DB2数据库的安装
这是在IBMRS6000操作系统为AIX安装的,HP9000上雷同
1.注册为具有超级用户权限的用户(root)
2.将标有“DB2通用数据库企业版”的软件光盘插入驱动器
3.输入如下命令,以创建一个目录来安装该CD-ROM:
#mkdir-p/cdrom其中cdrom表示CD-ROM安装目录。
输入如下命令,来分配CD-ROM文件系统:
#smittystorage
4.选择文件系统
5.选择添加/更改/显示/删除文件系统
6.选择CDROM文件系统
7.选择添加CDROM文件系统
8.在弹出窗口中,输入如下项作为安装点:
/cdrom
9.通过输入以下命令来安装CD-ROM文件系统:
smitmountf
10.在文件系统名称字段中输入值。
例如,该名称可能是/dev/cd0。
11.在安装目录字段中输入值。
例如,此值可能是/cdrom。
12.将安装为只读系统设置为Yes。
13.单击确定。
14.cd/cdrom
15.输入./db2setup命令以启动DB2安装程序。
安装DB2V6窗口打开。
16.按Tab键更改突出显示的选项,按Enter键选择或取消选择选项。
(1)在服务器上安装,一般选择安装以下三个产品:
注意:
要显示想要安装的DB2产品的部件,选择定制。
要在任何时候返回至先前窗口,选择取消。
?
DB2AdministrationClient
选择定制安装这个产品,
?
DB2UDBenterpriseedition
选择定制安装这个产品,
?
DB2SoftwareDeveloperKit
如果同时做开发,需要定制安装此产品。
(2)在“DB2产品信息”和“DB2产品库”只选择中国语言ZH_CN支持。
17.在16步确认后,将开始安装数据库程序。
在安装过程中,还需确认以下问题:
(1)是否建立DB2管理帐户,一般选择建立:
按缺省建立db2管理用户db2as(使用缺省的UID,GroupId,安装home路径),在语言支持上,
只选择中国语言ZH_CN支持。
(2)是否建立DB2的实例,一般选择建立:
?
按缺省建立db2管理用户db2inst1:
db2iadm1(使用缺省的UID,GroupId,安装home路径),
在语言支持上,只选择中国语言ZH_CN支持。
?
按缺省建立db2用户db2fenc1:
db2fenc1(使用缺省的UID,GroupId,安装home路径),
在语言支持上,只选择中国语言ZH_CN支持。
?
是否建立sample数据库(为了检查数据库的安装是否正确,一般选择建立sample数据库)
?
是否选择DB2的实例进程在操作系统启动时,自动执行初始化
如果在独立服务器上安装使用,可选择autostart,但在aix+hacmp+db2的双机共享环境中,不要选择
autostart,DB2实例进程的启动,由hacmp来控制。
18.安装结果:
数据库程序安装完成后,DB2的软件程序安装在/usr/lpp目录中,
DB2DIR=/usr/lpp/DB2_06_01
注意:
如果安装过程中没有指定建立实例和管理帐户,在安装完成后可以使用命令创建实例(db2icrt)。
或者要创建或添加新的实例、“管理服务器”或其他DB2产品和部件,输入如下命令:
/usr/lpp/DB2_06_01/install/DB2setup
19.验证安装
在安装时若没有选择建立sample数据库,在安装完成后可以通过命令(db2sampl)创建SAMPLE数据库,
并通过使用命令行处理器与该数据库相连来验证安装:
(1)作为具有系统管理(SYSADM)权限的用户向系统注册。
如:
db2inst1
(2)输入DB2sampl命令以便创建SAMPLE数据库。
(3)创建SAMPLE数据库时,用数据库别名SAMPLE将它自动编目。
(4)输入DB2start命令以启动数据库管理程序。
(5)输入下列命令来与SAMPLE数据库相连,检索在部门20中工作的所有雇员的列表,并重设数据库连接:
DB2connecttosample
DB2"select*fromstaffwheredept=20"
DB2connectreset
注意:
在验证安装后,可除去SAMPLE数据库以释放磁盘空间。
输入DB2dropdatabasesample命令
来卸下SAMPLE数据库。
若尚未未安装DB2工具,则您可以通过创建SAMPLE数据库,并通过使用命令行处理器与该数据库
相连来验证安装,如下所示:
步骤1.作为具有系统管理(SYSADM)权限的用户向系统注册。
步骤2.输入db2sampl命令以便创建SAMPLE数据库。
创建SAMPLE数据库时,用数据库别名SAMPLE将它自动编目。
步骤3.输入db2start命令以启动数据库管理程序。
步骤4.输入下列命令来与SAMPLE数据库相连,检索在部门20中工作的所有雇员的列表,并重设数据库连接:
db2connecttosample
db2"select*fromstaffwheredept=20"
db2connectreset
如以上命令均正确执行,则证明DB2UDB数据库服务器的安装已经成功完成.
四、DB2数据库的备份和恢复
最近,我恢复了一个数据库.其中的辛苦不予言表,我想写出自己用到的一些语句,和遇到相同问题的xdjm共勉。
首先谈db2数据库的备份,我用的是backup命令。
db2backupdatabase数据库名(我的库是jsdb)
忘了说了,在backup之前需要停止你要备份的数据库,我用了db2stopforce(之所以用force参数是因为这样好停懒省事:
)和db2start。
这样就保证可以成功backup了。
备份完成后db2会告诉你一个时间戳,例如:
20040831(之后好几位)这样就会在当前目录下产生一个与你数据库名相同的文件夹名例如:
jsdb。
这个文件夹目录层次很重要,如果错了会在恢复时提示找不到文件。
备份完成以后就是恢复了,我用的是restore命令。
db2restoredatabase数据库名(jsdb)takenat时间戳(20040831)
执行这个语句要注意两点:
1,要把备份文件夹考到当前目录下(我用了一个cdc:
\命令设当前目录为c盘,将jsdb文件夹考到c盘根目录下);2,时间戳要和jsdb目录中的一致。
这样,就完成了恢复数据库了。
五、DB2编程序技巧
1DB2编程
1.1建存储过程时Create后一定不要用TAB键
createprocedure的create后只能用空格,而不可用tab健,否则编译会通不过。
切记,切记。
1.2使用临时表
要注意,临时表只能建在usertemporytablesspace上,如果database只有systemtemporytablespace是不能建临时表的。
另外,DB2的临时表和sybase及oracle的临时表不太一样,DB2的临时表是在一个session内有效的。
所以,如果程序有多线程,最好不要用临时表,很难控制。
建临时表时最好加上withreplace选项,这样就可以不显示的drop临时表,建临时表时如果不加该选项而该临时表在该session内已创建且没有drop,这时会发生错误。
1.3从数据表中取指定前几条记录
select*fromtb_market_codefetchfirst1rowsonly
但下面这种方式不允许
selectmarket_codeintov_market_codefromtb_market_codefetchfirst1rowsonly;
选第一条记录的字段到一个变量以以下方式代替
declarev_market_codechar
(1);
declarecursor1cursorforselectmarket_codefromtb_market_codefetchfirst1rowsonlyforupdate;
opencursor1;
fetchcursor1intov_market_code;
closecursor1;
1.4游标的使用
注意commit和rollback
使用游标时要特别注意如果没有加withhold选项,在Commit和Rollback时,该游标将被关闭。
Commit和Rollback有很多东西要注意。
特别小心
游标的两种定义方式
一种为
declarecontinuehandlerfornotfound
begin
setv_notfound=1;
end;
declarecursor1cursorwithholdforselectmarket_codefromtb_market_codeforupdate;
opencursor1;
setv_notfound=0;
fetchcursor1intov_market_code;
whilev_notfound=0Do
--work
setv_notfound=0;
fetchcursor1intov_market_code;
endwhile;
closecursor1;
这种方式使用起来比较复杂,但也比较灵活。
特别是可以使用withhold选项。
如果循环内有commit或rollback而要保持该cursor不被关闭,只能使用这种方式。
另一种为
pcursor1:
forloopcs1ascousor1cursoras
selectmarket_codeasmarket_code
fromtb_market_code
forupdate
do
endfor;
这种方式的优点是比较简单,不用(也不允许)使用open,fetch,close。
但不能使用withhold选项。
如果在游标循环内要使用commit,rollback则不能使用这种方式。
如果没有commit或rollback的要求,推荐使用这种方式(看来For这种方式有问题)。
修改游标的当前记录的方法
updatetb_market_codesetmarket_code='0'wherecurrentofcursor1;
不过要注意将cursor1定义为可修改的游标
declarecursor1cursorforselectmarket_codefromtb_market_code
forupdate;
forupdate不能和GROUPBY、DISTINCT、ORDERBY、FORREADONLY及UNION,EXCEPT,orINTERSECT但UNIONALL除外)一起使用。
1.5类似decode的转码操作
oracle中有一个函数selectdecode(a1,'1','n1','2','n2','n3')aa1from
db2没有该函数,但可以用变通的方法
selectcasea1
when'1'then'n1'
when'2'then'n2'
else'n3'
endasaa1from
1.6类似charindex查找字符在字串中的位置
Locate(‘y’,’dfdasfay’)
查找’y’在’dfdasfay’中的位置。
1.7类似datedif计算两个日期的相差天数
days(date(‘2001-06-05’))–days(date(‘2001-04-01’))
days返回的是从0001-01-01开始计算的天数
1.8写UDF的例子
C写见sqllib\samples\cli\udfsrv.c
1.9创建含identity值(即自动生成的ID)的表
建这样的表的写法
CREATETABLEtest
(t1SMALLINTNOTNULL
GENERATEDALWAYSASIDENTITY
(STARTWITH500,INCREMENTBY1),
t2CHAR
(1));
在一个表中只允许有一个identity的column.
1.10预防字段空值的处理
SELECTDEPTNO,DEPTNAME,COALESCE(MGRNO,'ABSENT'),ADMRDEPTFROMDEPARTMENT
COALESCE函数返回()中表达式列表中第一个不为空的表达式,可以带多个表达式。
和oracle的isnull类似,但isnull好象只能两个表达式。
1.11取得处理的记录数
declarev_countint;
updatetb_testsett1=’0’
wheret2=’2’;
--检查修改的行数,判断指定的记录是否存在
getdiagnosticsv_count=ROW_COUNT;
只对update,insert,delete起作用.
不对selectinto有效
1.12从存储过程返回结果集(游标)的用法
1、建一sp返回结果集
CREATEPROCEDUREDB2INST1.Proc1()
LANGUAGESQL
resultsets2(返回两个结果集)
------------------------------------------------------------------------
--SQL存储过程
------------------------------------------------------------------------
P1:
BEGIN
declarec1cursorwithreturntocallerfor
selectmarket_code
fromtb_market_code;
--指定该结果集用于返回给调用者
declarec2cursorwithreturntocallerfor
selectmarket_code
fromtb_market_code;
openc1;
openc2;
ENDP1
2、建一SP调该sp且使用它的结果集
CREATEPROCEDUREDB2INST1.Proc2(
outout_market_codechar
(1))
LANGUAGESQL
------------------------------------------------------------------------
--SQL存储过程
------------------------------------------------------------------------
P1:
BEGIN
declareloc1,loc2result_set_locatorvarying;
--建立一个结果集数组
callproc1;
--调用该SP返回结果集。
associateresultsetlocator(loc1,loc2)withprocedureproc1;
--将返回结果集和结果集数组关联
allocatecursor1cursorforresultsetloc1;
allocatecursor2cursorforresultsetloc2;
--将结果集数组分配给cursor
fetchcursor1intoout_market_code;
--直接从结果集中赋值
closecursor1;
ENDP1
3、动态SQL写法
DECLARECURSORC1FORSTMT1;
PREPARESTMT1FROM
'ALLOCATEC2CURSORFORRESULTSET?
';
4、注意:
一、如果一个sp调用好几次,只能取到最近一次调用的结果集。
二、allocate的cursor不能再次open,但可以close,是closesp中的对应cursor。
1.13类型转换函数
selectcast(currenttimeaschar(8))fromtb_market_code
1.14存储过程的互相调用
目前,csp可以互相调用。
Sqlsp可以互相调用,Sqlsp可以调用Csp,但Csp不可以调用Sqlsp(最新的说法是可以)
1.15C存储过程参数注意
createprocedurepr_clear_task_ctrl(
ININ_BRANCH_CODEchar(4),
ININ_TRADEDATEchar(8),
ININ_TASK_IDchar
(2),
ININ_SUB_TASK_IDchar(4),
OUTOUT_SUCCESS_FLAGINTEGER)
DYNAMICRESULTSETS0
LANGUAGEC
PARAMETERSTYLEGENERALWITHNULLS(如果不是这样,sql的sp将不能调用该用c写的存储过程,产生保护性错误)
NODBINFO
FENCED
MODIFIESSQLDATA
EXTERNALNAME'pr_clear_task_ctrl!
pr_clear_task_ctrl'@
1.16存储过程fence及unfence
fence的存储过程单独启用一个新的地址空间,而unfence的存储过程和调用它的进程使用同一个地址空
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- db2 数据库 基础 知识 入门