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
3 DB2报错相关
3.1 db2 通用错误 查询
db2 错误查询
针对db2错误,查询方法如下:
进入db2cmd,连接数据库。
db2 ? sql-433
3.2 db2报错 SQL1042C
db2 SQL1042C 发生了意外的系统错误。 SQLSTATE=58004
系统:windowsServer
问题原因:使用
误删已存在的数据库的日志文件夹,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 解决方案:
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)去除,成功执行。
