基本操作 db2


1    Sql语句相关
1.1  db2 double改为字符串

select ''''||SpouseCertID from aaa

 

1.2  db2 linux建库导表
####db2iv97 登陆
--建库
db2 CREATE DATABASE WQBANK USING CODESET GBK TERRITORY CN COLLATE USING SYSTEM PAGESIZE 16 K

db2 connect to WQBANK user db2iv97 using db2iv97
--更改日志文件大小:
db2 update database configuration for WQBANK using LOGFILSIZ 102400	
--更改主日志文件的数目:
db2 update database configuration for WQBANK using LOGPRIMARY 10
--更改辅助日志文件的数目:
db2 update database configuration for WQBANK using LOGSECOND 10
--更改检查死锁的时间间隔:
db2 update database configuration for WQBANK using DLCHKTIME 10000
--更改锁定列表:
db2 update database configuration for WQBANK using MAXLOCKS 70
--更改sql语句堆大小:
db2 update database configuration for WQBANK using STMTHEAP 10000
--更改锁超时:
db2 update database configuration for WQBANK using LOCKTIMEOUT 30


###cd 到备份文件路径,将备份文件所有人修改为db2iv97,并确定有读写权限

---导表结构,导3-5遍
db2 -tvf db2look.ddl -td@

---导数据
db2move wqbank import

 

 

1.3  db2 查询表结构

select * from sysibm.syscolumns where tbname = 'BUSINESS_CONTRACT'

 

 

1.4  db2查看数据库代码集

db2 查看代码集:

db2 get db cfg for sample

 

注意:

写法:db2set codepage=1386

注意:1386为GBK,1208为UTF-8

通常windows下默认为GBK,所以windows上有字符集为UTF-8的db2数据库导数据导不出的时候,需要db2codepage配置即可==》将db2codepage设置为1208,导出数据,然后再将1386设置回去即可。

(原因:系统是GBK,数据库是UTF8,所以把系统设置成UTF8,方便导出,但是过后要设置回去,否则,其他GBK的库和其他应用可能出问题)

 

 

1.5  db2存储过程执行方式

1  在dbvisizer客户端

函数和存储过程都要执行为

--/

...

/

 

2  在db2cmd数据库端

进入存储过程sql的路径

db2 -tvf xxx.sql -td@

注意:sql文件中存储过程要在结尾用@结束

 

 

1.6  db2存储过程demo

1  带输出参数的存储过程

--/

CREATE   PROCEDURE proc_GETWASTEDATE (in pCodeNo varchar(40), in pItemNo varchar(40),out occurdate2 varchar(10))   
language sql
begin  
select occurdate into occurdate2 from (select  bw.OCCURDATE as OCCURDATE,bw.ACTUALCREDITSUM as ACTUALCREDITSUM,row_number() over()  as R from DB2ADMIN.BUSINESS_WASTEBOOK bw  where  bw.RELATIVESERIALNO = pCodeNo and bw.OCCURDIRECTION = '1'   order by bw.serialno desc) where R = pItemNo ;
end
/

 

1.7  db2函数纪要

区分大小写

 

 

 

 

2    db2cmd  相关
2.1  db2cmd windows卸载db2数据库

1    查询并删除已有的数据库

windows R==》cmd==>db2cmd 打开db2命令窗口。

查询已有的数据库目录:db2 list database directory

取消节点编目:(我建的数据库版本太高,只空建数据库,导入不成功,故卸载当前数据库):db2 uncatalog db WQBANK

 

2    控制面板卸载

windows r==》control==》Db2 express-C - DB2COPY1==》卸载

 

 
2.2  db2cmd 执行 .sql文件脚本

基本语法:<切换到脚本所在路径下>

db2 -svtf Script.sql

 

参数中:      
                s     代表遇到错误时中止运行脚本      
                v     代表输出结果到屏幕      
                t     指以;号作为每行的分隔符      
                f     指后面需跟脚本文件名

 

 

 

2.3  db2cmd 数据库的启动关闭

db2 启动单个库

在db2cmd窗口 启动访问:

db2 deactivate db sample

 

 停止访问:

db2 uncatalog database sample
db2 terminate  

db2 terminate  除了断开连接以外,它还终止clp(命令行处理器)的后台进程,也就是常见的db2bp:back-end process

启动访问:
db2 catalog database sample
db2 terminate
db2 connect to sample

DB2 Catalog(中文翻译:编目)就是将远程的DB Server的信息“映射”到本地来,方便接下来的DB操作

 

 

2.4  db2cmd  常用sql
db2cmd
db2 list db directory        --查看db2数据库列表
db2 start        --启动db2数据库
db2 connect to WQBANK user db2admin using abc_123 --连接db2数据库(可以写sql命令)
db2 select userid from user_info --查询sql命令

 

 

3    DB2报错相关
3.1  db2  通用错误  查询

db2 错误查询

针对db2错误,查询方法如下:

进入db2cmd,连接数据库。

db2 ? sql-433

 

3.2   db2报错 SQL1042C

db2 SQL1042C  发生了意外的系统错误。  SQLSTATE=58004

系统:windowsServer

问题原因:使用

db2 restore db WQTEST user db2admin using DB2_admin from H:\20180314\test into AA方式还原数据库。

误删已存在的数据库的日志文件夹,db2 connect to db和db2  drop db dbname报错

db2 SQL1042C  发生了意外的系统错误。  SQLSTATE=58004

 

解决方法:直接将其他的日志文件夹复制改为已删的日志文件夹,db2 drop db dbname,  drop成功后,重新还原一下数据库即可

 

 

 

 

3.3   db2报错 SQL6036N 

db2 SQL6036N  START 或 STOP DATABASE MANAGER 命令已在处理之中

解决方案:

db2cmd中依次执行

db2_kill,

db2start

即可。

问题原因:db2挂起,杀掉db2相关进程即可。

相关网页连接:

http://www-01.ibm.com/support/docview.wss?uid=swg21427711

 

 

3.4   db2报错 SQL1035N 

db2 SQL1035N  操作失败,因为无法以请求的方式来连接指定的数据库。  SQLSTATE=57019

问题现象:我是在备份数据库的时候遇到这种错误,

问题原因:查到原因是备份数据库的时点,还有其他用户正在连接当前数据库。

解决方案:解决问题的关键是:等所有用户都不操作数据库的时候在备份

 

 

 

3.5   db2报错 SQLCODE=-811 

db2  SQLCODE=-811, SQLSTATE=21000

问题:今天查询多表关联的时候报错,

报错内容为:Caused by com.ibm.db2.jcc.am.SqlException: DB2 SQL Error: SQLCODE=-811, SQLSTATE=21000, SQLERRMC=null, DRIVER=4.8.87

 

网络答案为:查询语句的结果 多于一行。

 

思考:应该在函数里报的错,找到报错的函数GETBUILDERNAME()

 

select BC.CUSTOMERNAME
FROM BUSINESS_CONTRACT BC,CREDITLINE_RELA CR
WHERE CR.LineNo = BC.SerialNo and CR.ObjectType='BusinessContract' and CR.ObjectNo=pSerialNo and CR.FLAG ='3030010' group by BC.CUSTOMERNAME;

 

函数含义为根据房贷的合同流水号CREDITLINE_RELA.objectno找到开发商楼宇按揭的流水号lineno,理论上,每个合同应该只有一条额度,出现这种问题,肯定是

 

两条CREDITLINE_RELA 记录的ObjectNo相同,lineno不同。

 

于是sql查询:

select lineno,CREDITLINE_RELA.OBJECTNO from DB2ADMIN.CREDITLINE_RELA where CREDITLINE_RELA.OBJECTTYPE = 'BusinessContract' and FLAG ='3030010' group by lineno,objectno having count(serialno) > 1;

查到重复的ObjectNo,对比删除掉后,重新跑批正常。

 

 

 

3.6   db2报错 SQL0551N  

db2 导出权限  SQL0551N  "DB2ADMIN" 不具有对对象 "NULLID.DB2L0H00" 执行操作 "EXECUTE"

原因:db2admin用户无该库的导出权限

 

解决方案:

在server端 在该库下给该用户赋权即可。

 

开始==》IBM DB2==>DB2COPY1(缺省值)==》一般管理工具==》控制中心==》所有数据库==》WQCDP==》用户名和组对象==》数据库用户 ==》db2admin==》更改用户权限==》数据库管理员权限和安全管理员权限  勾选==》确定

 

无需重启数据库,重新导出即可

 

 

3.7   db2报错 Error Code: -20054

db2    Error Code: -20054, SQL State: 55019

1    错误:

Error Code: -20054, SQL State: 55019

2    原因:

表加字段后,删除字段,但是没有删掉。再次删除的报错如上。

3    分析:

出错原因锁表,解锁即可。

4    解决方案:

CALL SYSPROC.ADMIN_CMD('reorg table 表名');
 
 
 
3.8   db2报错 SQLCODE=-206 DB2 SQL Error: SQLCODE=-206, SQLSTATE=42703

1    今天在db2命令窗口中执行  db2 -t -vf db2look.ddl  导入数据库表结构的时候报了一个错。

报错如下:

 [Error Code: -206, SQL State: 42703]  DB2 SQL Error: SQLCODE=-206, SQLSTATE=42703, SQLERRMC=NLS_STRING_UNITS, DRIVER=4.15.82

 

后来查看ddl文件,单个执行插入index

SET NLS_STRING_UNITS = 'SYSTEM';

 

CREATE INDEX "DB2ADMIN"."IDX_EVALUATE_RECORD" ON "DB2ADMIN"."EVALUATE_RECORD"   ("SERIALNO" ASC)      COMPRESS NO   INCLUDE NULL KEYS ALLOW REVERSE SCANS;

 

执行不成功,报错。

但是去掉   标蓝部分后可以执行.

  

解决方法:标蓝部分去除,成功执行。

转载请注明:菜鸟乙

 

 

3.9   db2报错 SQLCODE=-668

DB2 SQL Error: SQLCODE=-668, SQLSTATE=57016

今天,测试环境调查报告报出空指针异常。经排查。

是其中一个表report_record查询的时候报错。

 

报错:

DB2 SQL Error: SQLCODE=-668, SQLSTATE=57016

 

原因:

因为是新导的数据库(db2 load方式加载的数据),经过网上的查询。

使用reorg table解表,依然报错。

 

查询表的状态:

db2 load query table report_record

显示暂挂状态

 

然后进行解挂:

db2 load from /dev/null of del terminate into report_record

 

解挂之后,再次在db2客户端查询report_record,可以查询到,同样,在调查报告部分,不再报空指针异常。

至此,问题解决。

 

 

 

3.A   db2报错 SQLCODE=-551, SQLSTATE=42501
今天我把db2数据库由a库导入b库。(a库,b库的用户名,密码完全一致)

导入成功后,查询b库的c表:

select * from c;

报错如下:

SQLCODE=-551, SQLSTATE=42501

经多方查询,

 

问题:  单表授予查询权限

原因:是没有给c表赋予查询权限。

1    赋予单表查询权限

网络上给出答案:

db2 grant select on table DB2ADMIN.c to DB2ADMIN With Grant Option

在db2命令窗口中,执行该sql后,查询c表,能够查询成功。

 

 

 那么问题来了,我把a库的表结构,函数,视图,数据等等全部导入b库,肯定每一个表都要查询的呀

从网上搜索很长时间,查询到

select *  from syscat.tables where  syscat.tables.TABSCHEMA = 'DB2ADMIN' order by syscat.tables.TABNAME

我看出了差异,在a库里,tabschma和owner都是同一用户,在b表库不是。

经过排查,得知b库中owner为Administrator,显然,向b库导入表结构的时候,拥有权限的是Administrator.

讲到这里大家应该明白了吧。我数据库的用户名和当时电脑的用户名称不一致。

于是,我想到,是不是能够,在向b库导入表结构的时候,在db2命令窗口中,将Administrator切换到DB2ADMIN?(于是删掉库重新导入)

 

于是步骤如下:

。。。

查看当前用户 db2 select current schema from sysibm.sysdummy1

切换用户模式 db2 set current schema db2admin

连接数据库 db2 connect to WQBANK2 user db2admin using DB2_admin

导入表结构 db2 -t -vf db2look.ddl

 

但是导入结果差强人意,在b库中,owner依然是Administrator。(即b库导表结构时,owner只取决于电脑的用户)

 

于是,目前为止,只有两种方式能解决我的问题了

1    重新登录电脑,将用户切换到db2admin,再进行导入。

2    在Administrator用户下,在db2命令窗口中,找到数据库赋予权限的方法。

由于,工作的电脑的库在远程上,客户方有很多其他资源在服务器上,因此1方法很自然不能使用,被排除(避免引起权限冲突)

2方法经过多方查询,查到一种折中的方法来解决。

 

问题:  数据库授予查询权限

原因:  数据库授予查询权限

2    赋予数据库查询权限

a    在数据库客户端(dbvisualizer)执行以下命令

select 'db2 grant select on table DB2ADMIN.'|| tabname ||' to DB2ADMIN With Grant Option' from syscat.tables where tabschema='DB2ADMIN';

循环取值

b     将查询的结果,copy出来,直接放到db2命令窗口,运行完毕,所有数据库表都可以查询

注意  不能直接把db2 grant的多条查询放到db2命令窗口,不然不执行,目前为止不明白为什么

 

 

 

现在表能够查询了,但是表还是不能修改呀,视图不能操作呀。于是,在此基础上,我又稍作修改。

问题:  数据库授予修改等权限

原因:  数据库授予修改等权限

3    赋予数据库修改等权限

a    在数据库客户端(dbvisualizer)执行以下命令

select 'db2 grant select,INSERT,update,delete,ALTER,CONTROL on table DB2ADMIN.'|| tabname ||' to DB2ADMIN ' from syscat.tables where tabschema='DB2ADMIN'循环取值

b     将查询的结果,copy出来,直接放到db2命令窗口,运行完毕,所有数据库表都可以查询

注意  不能直接把db2 grant的多条查询放到db2命令窗口,不然不执行,目前为止不明白为什么

 

然后问题完美解决。然后还有个问题,就是我这个新库是否有connect的权限呀?(db2 connect权限和select等权限不是一个级别)只能到明天再看了。

 

 

 

3.B  db2报错 Error Code: -104, SQL State: 42601

今天db2数据库建立函数,实现两个金额相加的功能,新建的函数报错。具体报错内容如下:

 ... Physical database connection acquired for: DB2  10:39:57  [CREATE - 0 row(s), 0.000 secs]  [Error Code: -104, SQL State: 42601]  DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=declare basum decimal(;NO EXTERNAL ACTION

;<psm_begin_function_compou, DRIVER=4.15.82 ... 1 statement(s) executed, 0 row(s) affected, exec/fetch time: 0.000/0.000 sec  [0 successful, 0 warnings, 1 errors]

 后经解决后函数如下:可以使用

 --/ CREATE FUNCTION GETTHIRDGUARCONPANYSUM(pSerialNo varchar(30)) returns decimal(24,2) language sql SPECIFIC SQL180104155828802 begin atomic declare sumThirdCompBAMoney decimal(24,2); declare sumThirdCompBCMoney decimal(24,2); declare sumThirdCompMoney decimal(24,2);

set sumThirdCompBAMoney = (select sum(ba.BUSINESSSUM) from CREDITLINE_RELA cr,flow_object fo,business_apply ba where cr.lineno = pSerialNo and cr.objecttype = 'CreditApply' and fo.OBJECTNO = cr.objectno and fo.phaseno not in ('0010','8000','1000') and ba.serialno = cr.objectno and cr.objectno not in (select bc.RELATIVESERIALNO from business_contract bc,CREDITLINE_RELA ccr where ccr.ObjectType='BusinessContract' and ccr.lineno = pSerialNo and ccr.objectno = bc.serialno)); IF (sumThirdCompBAMoney IS NULL ) THEN SET sumThirdCompBAMoney = 0.00;  END IF;

set sumThirdCompBCMoney = (select sum(nvl(balance,businesssum)) from CREDITLINE_RELA cr,business_contract bc where cr.ObjectType='BusinessContract' and cr.lineno = pSerialNo and cr.objectno = bc.serialno and (bc.finishdate is null or bc.finishdate = '') and (bc.PIGEONHOLEDATE is null or bc.PIGEONHOLEDATE = '')); IF (sumThirdCompBCMoney IS NULL ) THEN SET sumThirdCompBCMoney = 0.00;  END IF;

set sumThirdCompMoney = sumThirdCompBAMoney+sumThirdCompBCMoney; return sumThirdCompMoney;end /

 

 

3.C  db2报错 SQL5005C 错误
db2 WIN10安装DB2后启动报 SQL5005C 错误

今天遇到了个这么奇葩的问题,在安装db2数据库完成后,登录的时候提示 SQL5005C 错误

然后网上有各种说法也没有解决问题

我是用db2用户新建的库,电脑当前用户是weijingli,用weijingli等录电脑建库报错。

于是,我在电脑上新建db2用户。

windows L 锁屏,重新用db2用户登录,

重新建库,发现db2建库成功。

至此,问题解决

3.D  db2报错 事务日志满

问题:

在db2命令行界面执行db2 delete A表的时候,报错:事务日志满。

原因:

A表有60多万条数据,执行的时候由于数据量过大导致事务日志满。

解决方案:

a  方案:停掉所有应用程序,重启数据库

db2 force applications all
db2stop(注意,必须在Administrator用户下执行)
db2start

但是数据量太大,db2 delete 依然执行不了

 

b  方案:增大日志文件大小

该方案是从网上搜的,执行的时候报错,所以依然失败

 

c  方案:drop表,重新导入表结构和索引

考虑到表的数据量实在太大,在db2客户端delete的时候直接崩掉。

所以我把A表相关的表结构和索引导了出来。

直接drop掉表,重新导入。

执行成功。

 

3.E  db2报错 windows db2命令窗口删除数据库删除不了

首先,你需要查看链接该数据库有多少应用
db2 list applications
--然后在杀掉这些应用db2
--db2 force applications all
最后停止数据库
db2 deactivate database cms
断开
db2 terminate
然后就可以删除该数据库了
db2 drop database cms

 

 

3.F  db2报错 DB21034E

1    今天在db2命令窗口中执行  db2 -t -vf db2look.ddl  导入数据库表结构的时候报了一个错。

报错如下:

该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0204N  "DB2ADMIN.CUSTOMER_RELATIVE" 是一个未定义的名称。  LINE NUMBER=2.
SQLSTATE=42704

 

经过多方查询,依然没有找到解决方法。

后来查看ddl文件,单个执行插入table

CREATE TABLE "DB2ADMIN"."BUG_REPORT"  (
    "BUGID" VARCHAR(32) NOT NULL ,
    "INPUTTIME" VARCHAR(20) , 
    "SOLVERESULT" VARCHAR(250) ,
    "SOLVETIME" VARCHAR(20) )  
   IN "USERSPACE1" 
   ORGANIZE BY ROW;

执行不成功,报错。

但是去掉   IN "USERSPACE1" 
   ORGANIZE BY ROW后可以执行.

思索:通过标红部分,应该是没有建立相对应的表空间。

db2 list tablespaces

查看表空间,果然如此。

 

解决方法:然后我把ddl的全部相关表空间设置的部分( IN "USERSPACE1"     ORGANIZE BY ROW)去除,成功执行。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM