目录
6.3.伪表 【sysibm.sysdummy1】 (从伪表中,查看当前时间)
6.5.db2 date 数据类型 查询条件时 是否需要使用日期转换函数
7.7.查看 与 数据库 连接 的 进程、关闭进程、重新启动数据库
7.29.db2 如何通过命令确认, 何区分那个数据库是主数据库,那个数据库是 备用数据库
7.30.A5 2.14.X 无权限修改,本地表中数据时(不使用SQL,直接在查询的表中修改)
8.6.要查看 DB2 数据库中的索引【列】信息,你可以使用以下 SQL 查询
11.02.查看表的状态,是否是【load pending】 // 表无法使用时,查看
11.03.常见错误(没有【REORG】造成【SQLCODE=-668】)
11.04.直接使用【REORG table schema.tableName】时报错
11.05.【权限问题】SQLCODE: -552, SQLSTATE: 42502
11.07.SQLCODE=-803, SQLSTATE=23505
11.09.★★★【22001】★★★SQLCODE=-302, SQLSTATE=22001 超长
11.11.DB2 SQLCODE=-206, SQLSTATE=42703 定义表字段问题
11.12.SQLCODE=-104, SQLSTATE=42601 SQL语法错误
11.13.SQLCODE=-911, SQLSTATE=40001,SQLERRMC=68 乐观锁
11.14.SQLCODE=-952, SQLSTATE=57014
11.17.ERRORCODE=-4214 // 密码过期,或 密码被锁
11.18.ERRORCODE=-4461, SQLSTATE=42815 (JPA 主键)
11.19.ERRORCODE=-4220 // java.io.CharConversionException
11.20.SQL 3132W // db2 命令行导出数据时,类型是clob的字段, 自动截位警告
11.21.其它错误code汇总(并非100%准确,仅供参考)
11.23.SQLCODE=-668 , SQLSTATE57007---57016---解决办法---reorg table
11.24.SQLCODE=-289 ,SQLSTATE=57011---表空间不足
11.25.SQLCODE-----查看 db2 "? SQL-289" 信息更全---含code对应的错误,及,解决办法
11.26.SQLSTATE-----查看 db2 "? 57011"
11.27.【JPA错误,非DB2】openjpa-2.2.3-SNAPSHOT-r422266:1764177 nonfatal store error
查看存储过程有无错误 (每一个存储过程,会生成一个对应的package)
介绍一下 db2 相关的两个进程 db2fmcd 和 db2sysc
db2除了进程 db2fmcd 和 db2sysc,还有什么其它的进程
21.我没有指定 order by,为什么一般是按照插入顺序取得的。
==========
1.在服务器中,登录DB2用户,并连接DB
=================================
sudo su -
su - DBUser
db2 connect to XXXDB
db2 set schema SchemaName
或者 (db2 set current schema = SchemaName)
查看切换后,当前的Schema的状态 (db2 values current schema)
sudo su -
su - DBUser
db2 connect to XXXDB
db2 set schema SchemaName
db2 values current schema
db2 get db cfg for XXXDB | grep "9"
===
2.Local命令行启动,连接DB
runas /user:db2user "db2cmd cd /D %~dp0"
-- 命令行中启动,执行下面命令,列出本地拥有的数据库
db2 list database directory
-- 连接到你想要连接的数据库
db2 connect to XXXDB
db2 SET SCHEMA schemaName
===
创建数据库
db2 CREATE testdb ON 'c:' USING CODESET IBM_943 TERRITORY JP
territory 英 / ˈterətri / // DB2 TERRITORY JP // 领土,版图,领地;(美国、加拿大等的)准州;(某些国家划分的)地区; (具有某种特性的)地区,地方;
连接数据库
db2 CONNECT TO testdb
===
3.查询各种一览(Table一览,Column一览)
・查看Schema中,表一览
db2 list tables for all | grep "yourSchema"
・查了表中,Column一览
db2 describe table yourSchema.yourTableXXX | grep "xxx"
・查看表空间List
db2 list tablespaces show detail
===
4.SQL
4.1.执行查询SQL
cd /XXXXXX/XXX/ 补足说明,一般DB Server会指定一个「DBUserXXX」可以访问的目录,用于执行SQL文
db2 -tvf "/XXXXXX/XXX/xxx.sql"
db2 -tvf /XXXXXX/XXX/xxx.sql -z XXX.log
或者 (db2 -stvf /XXXXXX/XXX/xxx.sql)
cd /XXXXXX/XXX/
db2 -tvf /XXXXXX/XXX/xxx.sql
db2 -tvf ./xxx.sql
db2 -tvf XXX.sql -z XXX.log
★★★tvf的含义★★★
- "t" 代表 "terminate",表示在执行 SQL 脚本后自动终止数据库连接。
- "v" 代表 "verbose",表示以详细模式运行 SQL 脚本,输出更多的执行信息。
- "f" 代表 "file",表示 xxx.sql 是一个包含 SQL 命令的文件。
"t" 代表?:
还是下面的含义? (好像不是这个含义)
-t:设置命令行界面中查询结果的格式。使用 -t 参数可以在结果中去掉标题(column names)以及以竖线分隔每个字段的空白字符。这样可以使得结果更加紧凑,适合于导出数据或将结果传递给其他命令进行进一步处理。
===
GPT回答问题整理_004_2024/10/30~-优快云博客
==
====
4.2.创建表时,指定表空间
create table 名字 (属性)in 表空间
4.3.创建表空间
create tablespace 表空间名字 pagesize 16k managed by database using (FILE ‘D:/tablespacename/cont1’ 1000)
===
4.4. ★★★★★★常用SQL操作★★★★★★
DB2的SQL操作:update、fetch、left join、alter 等等_db2 fetch-优快云博客
===
5.存储过程创建・执行
・定義
test2.sql
drop procedure yourSchemaName.myProc2
@
create procedure yourSchemaName.myProc2(
in p1 int,
in p2 int,
out p3 int
)
begin
set p3=p1+p2;
end
@
test2.sql
====最简单的存储过程 (没有参数)
create or replace procedure yourSchemaName.myProc22()
begin
declare strJson varchar(300);
call yourSchemaName.myProc2(5,6,strJson);
insert into yourSchemaName.test(json_data) values(strJson);
end
@
==== 稍微复杂的存储过程,有参数,有循环,有变量定义
create or replace procedure yourSchemaName.myProc72(in counts BIGINT, in userId varchar(30))
begin
DECLARE loopCount BIGINT;
DECLARE loginUserId varchar(30);
DECLARE i INT;
SET loopCount = counts;
SET loginUserId = userId || loopCount;
SET i = 1;
WHILE i <= loopCount DO
SET loginUserId = userId || loopCount;
INSERT INTO .....;
INSERT INTO .....;
...;
SET i = i + 1;
END WHILE;
end
@
====
・作成
db2 -td@ -vf ./test2.sql
db2 -td@ -vf ./test22.sql
====
・実行
db2 "call yourSchemaName.myProc22()"
db2 "call myProc72(100, 'user10_')"
・実行 (单独执行)
db2 "call yourSchemaName.myProc2(1,2,?)"
TestMesage=$(db2 "call yourSchemaName.myProc2(1,2,?)")
echo $TestMesage
・查看 所有的 存储过程
SELECT procschema, procname FROM SYSCAT.PROCEDURES where procschema like '%APL%';
・删除存储过程
db2 "drop procedure yourSchemaName.myProc2"
===
6.其他操作 (普通操作)
6.0.导出数据
执行下面的命令
db2 -tvf ./export.sql
===
export.sql
!!!注意!!!:文件的换行要是Linux换行,不然回出错。
===
EXPORT TO filename.csv OF DEL SELECT * from schemaName.yourTableName ordey by xxx with cs;
EXPORT TO filename.csv OF DEL SELECT AAA AS "A"
,BBB AS "B"
,CCC AS "C"
FROM schemaName.yourTableName
WHERE CCCC='xxxxx'==========或者(全量导出)
EXPORT TO filename.csv OF DEL SELECT * from schemaName.yourTableName ordey by xxx with cs
=============或者(不使用SQL文件,直接执行命令)db2 "EXPORT TO filename.csv OF DEL SELECT * from schemaName.yourTableName ordey by xxx with cs;"
会在当前目录下,生成【filename.csv】文件
======
扩展1:【DEL】 的含义:文本格式
ASC = ASCII
DEL = Delimited ASCII
WSF = Worksheet format
IXF = Integrated Exchange Format
ASC 和 DEL 格式的文件是文本文件,可以用任何文本编辑器打开。在Db2中,导出数据时的"DEL"意味着将数据以分隔符(delimiter)分隔的文本文件格式进行导出。默认的分隔符是逗号(","),但也可以使用其他字符作为分隔符。
在Db2中,"OF"是指定导出数据文件的输出格式的关键词。在导出数据时,可以使用不同的输出格式来控制导出的文件类型和结构。当使用"OF DEL"时,表示输出的文件格式为以分隔符(delimiter)分隔的文本文件。
例如:
export to [path(例:D:"TABLE1.ixf)]of ixf select [字段(例: * or col1,col2,col3)] from TABLE1;
export to [path(例:D:"TABLE1.del)]of del select [字段(例: * or col1,col2,col3)] from TABLE1;
扩展2:如何显示列名
EXPORT TO ...
SELECT 1 as id, 'COL1', 'COL2', 'COL3' FROM sysibm.sysdummy1
UNION ALL
(SELECT 2 as id, COL1, COL2, COL3 FROM myTable)
ORDER BY id
================================
6.1.导入数据
XXX.sql
IMPORT FROM tableNameData.csv OF DEL REPLACE INTO schemaname.tableName;
或者
IMPORT FROM tableNameData.csv OF DEL INTO schemaname.tableName;
6.2.常用SQL文
DB2的SQL操作:update、fetch、left join、alter 等等_db2判断字段是否包含某个字符串_sun0322的博客-优快云博客
6.3.伪表 【sysibm.sysdummy1】 (从伪表中,查看当前时间)
select current timestamp from sysibm.sysdummy1
6.4.左外连接
select
t1.columnN AS "N"
,t1.columnO AS "O"
,t1.columnP AS "P"
FROM Table1 t1
LEFT JOIN Table2 t2 on t1.column1 = t2.column1
WHERE t1.id='XXXXX';
===
6.5.db2 date 数据类型 查询条件时 是否需要使用日期转换函数
xxx
对于DB2数据库中的DATE数据类型,一般不需要使用日期转换函数作为查询条件。DB2数据库在处理日期数据类型时,会自动将字符串类型的日期值转换为DATE类型,以便进行比较和计算。
例如,假设有一个名为"table1"的表,其中一个列名为"date_column",其数据类型为DATE。我们想要查询该表中某个日期范围内的数据,可以直接使用日期值作为查询条件,无需使用日期转换函数。
示例查询: SELECT * FROM table1 WHERE date_column >= '2021-01-01' AND date_column <= '2021-12-31';
上述查询语句中,我们直接使用字符串类型的日期值作为查询条件,DB2数据库会自动将其转换为DATE类型,然后进行比较操作。因此,在查询DATE数据类型时,通常不需要使用日期转换函数。
xxx
在DB2数据库中,对于DATE数据类型的查询条件,通常不需要在日期前面补零。DB2数据库会自动识别并解析日期值。
例如,如果要查询某一天的数据,可以直接使用日期格式"YYYY-MM-DD",无需在月份和日期前面补零。DB2数据库会正确识别并处理。
示例查询: SELECT * FROM table1 WHERE date_column = '2021-01-01';
上述查询语句中,我们直接使用字符串类型的日期值"2021-01-01"作为查询条件,无需在月份和日期前面补零。DB2数据库会自动解析该日期,并进行比较操作。
需要补零的情况通常是在字符串拼接或者动态生成查询条件时,为了保证日期格式的统一。但在直接写查询语句时,通常不需要补零。
xxx
6.6.唯一约束(ユニーク制約)
enforced 英[ɪnˈfɔːst] 强迫的
添加
○
db2 'ALTER TABLE "YourSchema "."YourTableName" ADD CONSTRAINT "UN_AAA_000001" UNIQUE ("YouColumnName") ENFORCED'
×
db2 "ALTER TABLE YourSchema.YourTableName ADD CONSTRAINT 'UN_AAA_000001' UNIQUE ('YouColumnName') ENFORCED"
删除
db2 "ALTER TABLE YourSchema.YourTableName DROP CONSTRAINT UN_AAA_000001"
xxx
6.7.xxx
xxx
6.8.xxx
xxx
6.9.xxx
xxx
7.其他知识点,其他操作 (调查时需要的操作)
7.1.DB2 用户
DB2依赖操作系统的安全性,自身没有用户,直接看操作系统中有哪些用户就行
既,你只要手动添加一个db2user,就可以使用这个用户连接数据库。
7.2.DB2 控制中心
打开开始菜单-->ibm db2-->DB2COPY1 (缺省值)-->一般管理工具-->控制中心
(10.0版本以上的取消了控制中心,需要用其他工具;)
7.3.查看DB编码信息
db2 get db cfg for DBName
或者连接DB后「db2 connect to XXXDB」,再执行「db2 get db cfg」
db2 get db cfg for XXXDB | grep "9"
===
7.4.本地的exe执行程序的目录,cmd运行设置
其中【db2cmd】是在以下目录下,并且在环境变量中有设置
C:\IBM\SQLLIB\BIN\db2cmd.exe
如果在环境变量中没有设定,要像下面这么写
runas /user:du2user "C:\IBM\SQLLIB\BIN\db2cmd cd /D %~dp0"
7.5.本地(windows)要启动的服务
【DB2 -DB2COPY1-DB2】
实际文件保存目录
C:\IBM\SQLLIB\BIN\db2syscs.exe
7.6.使用A5连接
直接server连接
serverName:50000
DBName
7.7.查看 与 数据库 连接 的 进程、关闭进程、重新启动数据库
su - xxxUser
db2 connect to XXXDB
db2 set schema SchemaName
db2 values current schema
----
db2 list applications
db2 "force application(xxxAppl Handle)"
db2stop
db2start
====
7.8.表空间:默认4K
create table 名字 (属性)in 表空间
默认的表空间 一般叫userspace1 默认大小是4k
这个默认大小就导致了出现这个问题
也就是说 默认状态下 整一行 所有字段长度的和不能超过4005
超出长度时,会报如下错误
SQL0670N 表的行长度超过 "4005" 字节的限制。 SQLSTATE=54010
7.9.db2检索,按照空格补齐原则进行检索的。
db2检索,按照空格补齐原则进行检索的。 statement和prepareStatement都一样,找一方长度长的,把另一方后边空格补齐。
7.10.DB2创建临时表空间
create temporary tablespace "xxx" IN DATABASE yourDatabase
DB2配置临时表空间_db2 临时表空间_shhcodelife的博客-优快云博客
7.11.支持 !=
ANSI标准中是用<>(所以建议用<>),但为了跟大部分数据库保持一致,数据库中一般都提供了 !=(高级语言一般用来表示不等于) 与 <> 来表示不等于:
MySQL 5.1: 支持 != 和 <>
PostgreSQL 8.3: 支持 != 和 <>
SQLite: 支持 != 和 <>
Oracle 10g: 支持 != 和 <>
Microsoft SQL Server 2000/2005/2008: 支持 != 和 <>
IBM Informix Dynamic Server 10: 支持 != 和 <>
InterBase/Firebird: 支持 != 和 <>
最后两个只支持ANSI标准的数据库:IBM DB2 UDB 9.5:仅支持 <>
Apache Derby:仅支持 <>
7.12.创建数据库
db2 create db yourDB on 'C:' USING CODESET IBM-943 TERRITORY JP
db2 connect to yourDBterritory 英 [ˈtɛrɪtərɪ] n. 领土;地区;范围;领域
7.13.创建表空间
create temporary tablespace "TS_yourTableSpaceNameXXX" IN DATABASE PARTITION GROUP IBMTEMPGROUP
PAGESIZE 8092 MANAGED BY AUTOMATIC STORAGE
USING STOGROUP "IBMTEMPGROUP"
EXTENSIZE 32
PREEFFTCHSIZE AUTOMATIC
BUFFERPOLL "BP_yourBufferPollName"
OVERHEAD INHRIT
NO FILE SYSTEM CACHING
DROPPED TABLE RECOVERY OFF;
7.14.创建表 (创建时,指定表空间)
create table yourSchemaName.yourTableName (
...
) IN "TS_yourTableSpaseName" INDEX IN "yourIndexName"
xxx
7.15.创建 BufferPool
db2 "CREATE BUFFERPOOL BP_XXXXX PAGESIZE 8K"
7.16.创建 Gupup
xxx
7.17.DB2 更改表名
rename table testtable to testtable1
7.18.查看数据库表的索引
select * from syscat.indexes where tabname='YourTableName' and tabschema='YourSchemaName';
7.19.查看表空间
db2 list tablespaces
db2 list tablespaces show detail
===
。。。。
表空间标识 = 4
名称 = SYSTOOLSPACE
类型 = 数据库管理空间
内容 = 所有持久数据。大型表空间。
状态 = 0x0000
详细解释:
正常
总计页数 = 4096
可用页数 = 4092
已用页数 = 116
可用页数 = 3976
高水位标记(页) = 116
页大小(以字节计) = 8192
扩展数据块大小(页) = 4
预取大小(页) = 4
容器数 = 1
。。。。
7.20.【Data】与【TimeStamp】
create table Schema1.testTable(
id Character(11) not null
, testDate Date default Null
, testTimeStamp TIMESTAMP default NULL
, primary key(id)
)
insert into Schema1.testTable values ('10000000001', '2023-10-10 12:12:12' ,''2023-10-10 12:12:12')
可以正常插入,但是【Data】类型的字段,无法保存时间信息。
===
使用命令行查看,显示的值如下
2023-10-10
2023-10-10 12:12:12.000000
使用A5查看,显示的值如下
2023/10/10
2023/10/10 12:12:12
java代码,使用JPA,从数据库里面取出的值如下
2023-10-10
2023-10-10 12:12:12.0
7.21.AIX服务器 DB2 log 在什么位置
在AIX服务器上,DB2日志文件的位置取决于您的DB2实例设置。默认情况下,DB2日志文件位于以下路径中:
/home/db2inst1/sqllib/db2dump/====
如果用户分组,也可能在下面的路径
/home/dba/db2userName/sqllib/db2dump/
7.22.DB2 数据库 导出 整个数据库定义 的 ddl
db2look -d database_name -a -e -l -x -o /AAAA/BBBB/CCCC/output_file.sql
7.23.备份数据
export to /DB/tmp/202308/XXXTable.CSV OF DEL SELECT * FROM XXXTable ORDER BY XXX with cs;
xxx
上面的SQL语句,可以写到【bakupXXXTable.sql】文件中,在使用下面命令执行
db2 -stvf /DB/tmp/202308/bakupXXXTable.sql > bakup_result.txt
===
7.24.坑 null,<>null
MySQL,DB2 都存在此问题
场景1:mysql不等值查询 name<>'张三' ,但是查询不出name 为null的值。
场景2:mysql 不等值查询 name<>null ,但是查询不出name 为null的值。
【分析】
这个问题很坑,一直以为null值能查询出来,<> 属于算术运算符,因此null值不能参入运算。
xxx
7.25.删除表中所有数据
truncate table tablename immediate
--
DELETE FROM (
SELECT * FROM tablename WHERE condition FETCH FIRST 5000 ROWS ONLY
);
---
清空表数据(Truncate Table): 这个方法会立即删除表中的所有数据,并释放表所占用的存储空间。语法中的
IMMEDIATE
关键字用于指示立即执行该操作。
TRUNCATE TABLE tablename IMMEDIATE;
使用
TRUNCATE TABLE
可以快速清空表数据,但要注意的是,这个操作不会激活触发器,并且不会记录在事务日志中,因此无法回滚。分批删除数据(Delete in Batches): 这种方法通过循环分批次删除数据,每次删除一定数量的行,以避免一次性删除大量数据可能带来的性能问题。在每个批次中,会删除符合条件的一定数量的行,并提交事务,以确保删除操作的原子性和数据一致性。
DELETE FROM ( SELECT * FROM tablename WHERE condition FETCH FIRST 5000 ROWS ONLY );
这个语句会从表中选择满足条件的前5000行数据,并将其删除。通过循环调用这个语句,可以逐步删除表中的数据。需要注意的是,这个方法可能会引起数据库锁定和性能问题,特别是在大型表中操作时,因此需要谨慎使用。
根据你的需求和具体情况,选择合适的方法来删除表中的数据。
==
7.26.索引项目的值,可不可以重复
在数据库中,索引的值可以重复也可以不重复,这取决于索引的类型。主要有以下两种类型的索引:
唯一索引(Unique Index):唯一索引要求索引列中的值都是唯一的,即不允许重复值。当你尝试在唯一索引列中插入已经存在的值时,数据库会报错并拒绝操作。唯一索引通常用于确保数据完整性和避免重复数据。
非唯一索引(Non-Unique Index):非唯一索引允许索引列中存在重复的值。这意味着你可以在非唯一索引列中插入任意值,即使已经存在相同的值。非唯一索引常用于加快查询速度,但不要求索引列中的值唯一。
因此,索引项目的值可以重复,也可以不重复,具体取决于索引的定义。
xxx
7.27.创建 唯一索引 与 非唯一索引的语句一样吗
创建唯一索引和非唯一索引的语句在某些方面相似,但在关键部分有所不同。下面是一些通用的数据库管理系统(如MySQL、PostgreSQL、Oracle等)中创建唯一索引和非唯一索引的基本语法示例:
创建非唯一索引的语法示例:
CREATE INDEX index_name ON table_name (column_name);
创建唯一索引的语法示例:
CREATE UNIQUE INDEX index_name ON table_name (column_name);
关键区别在于在创建唯一索引时,在CREATE INDEX
语句之后使用了UNIQUE
关键字来确保索引中的值是唯一的。这意味着在插入或更新数据时,数据库系统会检查索引中的值是否已经存在,如果已经存在,则会触发错误。而创建非唯一索引时则没有这个限制,允许索引中存在重复的值。
请注意,index_name
是索引的名称,table_name
是表的名称,column_name
是要创建索引的列的名称。
7.28.在DB2中,什么是 HADR database
在DB2中,HADR(High Availability Disaster Recovery)是一种数据库复制和故障转移解决方案,用于提供高可用性和灾难恢复能力。HADR主要针对主数据库和备用数据库之间的复制和故障转移功能。
具体来说,在DB2中,HADR database是指配置了HADR功能的数据库。一般情况下,HADR是通过设置主数据库和备用数据库之间的同步复制来实现的,以确保备用数据库保持与主数据库的同步。在HADR配置中,主数据库负责处理所有的写操作,并将这些写操作发生到备用数据库,同时备用数据库也是可读的。当主数据库发生故障或不可访问时,备用数据库可以接管并成为主数据库,从而实现无缝的故障转移和高可用性。
HADR数据库提供了对数据库故障的快速恢复功能,能够帮助组织提高数据库系统的可用性并减少业务中断时间。在DB2中配置和管理HADR数据库需要特定的权限和技能,需要确保在使用HADR功能时遵循最佳实践和安全性要求。
xxx
7.29.db2 如何通过命令确认, 何区分那个数据库是主数据库,那个数据库是 备用数据库
db2pd -db <database_name> -hadr
在DB2数据库中,可以使用以下命令来确认主数据库和备用数据库,并区分它们的角色:
查看数据库状态:
db2pd -db <database_name> -hadr
这个命令会返回数据库的详细信息,包括它们的角色,以及与高可用性和灾难恢复相关的信息。在输出结果中,可以查看以下字段来确定数据库的角色:
- Primary(主数据库)
- Standby(备用数据库)
xxx
7.30.A5 2.14.X 无权限修改,本地表中数据时(不使用SQL,直接在查询的表中修改)
原因是,建表时,使用的用户,和现在登录的用户不匹配。
1.先Dorp tabbleName
2.然后重启下面的服务
DB2_DB2COPY1_DB2_0===========db2syscs.exe=========(25000)
DB2管理サービス(DB2COPY1)=====db2mgmtsvc.exe
DB2DAS_DB2DAOO============ db2dasrrm.exe===【服务】中【登陆为*(ログオン)】中设定的用户应该是「db2user」而不是「本地系统」,不然使用db2user打开命令行操作时,会出现权限相关问题。
3.最后,使用现在登录的用户,重建表。
xxx
7.31.xxx
xxx
8.查看数据库配置信息---Select SQL文
8.1.查看Schema
「db2 "select schemaname from syscat.schemata"」
8.2.查看所有的表
「db2 "select name from sysibm.systables where type='T' and creator=''schemaName"」
8.3.查看表中所有的字段
「db2 "select name from sysibm.syscolumns where tbname='tableName' and tbcreator=''schemaName"」
8.4.查看用户--拥有的---表的操作权限
「db2 "select * from syscat.tabauth where TABSCHEMA='yourSchemaName';"」
xxx
8.5.查看表的索引
db2 describe indexes for table yourSchema.YourTableName
上面查询到的是索引的名字等信息,并没有索引是关联表中哪个字段(【列】)的信息
8.6.要查看 DB2 数据库中的索引【列】信息,你可以使用以下 SQL 查询
这里面可以显示和索引相关的【列】
SELECT INDNAME, TABSCHEMA, TABNAME, COLNAMES, UNIQUERULE
FROM SYSCAT.INDEXES
WHERE TABSCHEMA = 'YourSchemaName' AND TABNAME = 'YourTableName';
==
将
'YourSchemaName'
替换为表所在的模式名称,将'YourTableName'
替换为表的名称。这个查询会返回指定表的所有索引的信息,包括索引名称 (
INDNAME
)、模式名称 (TABSCHEMA
)、表名称 (TABNAME
)、索引列 (COLNAMES
) 和唯一规则 (UNIQUERULE
)。
xxx
xxx
8.7.XXX
xxx
8.8.XXX
xxx
9.DB2命令参数
-a 显示 SQLCA
-c 自动落实
-e 显示 SQLCODE/SQLSTATE
-f 读取输入文件
-l 将命令记录到历史文件中
-n 除去换行字符
-o 显示输出
-p 显示 db2 交互式提示符
-r 将输出报告保存到文件
-s 在命令出错时停止执行
-t 设置语句终止字符
-v 回送当前命令
-w 显示 FETCH/SELECT 警告消息
-x 不打印列标题
-z 将所有输出保存到输出文件
====
10.注意点
10.1.修改表结构时,修改之后,要执行下面的语句
REORG TABLE yourSchema.YourTableName
A、 reorg table <tbschema>.<tablename> 通过重构行来消除“碎片”数据并压缩信息,对表进行重组。表名必须是用 <dbschema> 全限定的。
B、reorg还有一个功能就是可以将表中的数据按照某个索引关键字的顺序排列,从而可以减少某些查询I/O的数量。
10.2.XXX
xxx
10.3.XXX
xxx
10.4.XXX
xxx
11.★★★错误分析调查★★★
11.01.各种错误整理
DB2的ErrorCode 以及各种错误调查_db2 error code_sun0322的博客-优快云博客
11.02.查看表的状态,是否是【load pending】 // 表无法使用时,查看
【load pending】时,此表无法使用!
db2 "load query table <tabname>"
===
11.03.常见错误(没有【REORG】造成【SQLCODE=-668】)
建议在每次使用完alter 操作后都执行一次reorg。
如果不执行,大概率会,报错这个问题:
DB2 SQL Error: SQLCODE=-668, SQLSTATE=57016
11.04.直接使用【REORG table schema.tableName】时报错
因为在某些 图形界面的数据库连接软件中(比如A5),不支持直接这么使用,按照下面方式使用即可成功。
CALL SYSPROC.ADMIN_CMD('REORG table schema.tableName')
在命令行中,可以直接使用,但是注意,要带上双引号,不然提示 SQL2211N 表不存在
db2 "REORG table schema.tableName"
11.05.【权限问题】SQLCODE: -552, SQLSTATE: 42502
使用管理员权限的用户操作即可。
下面的操作都需要管理员权限:
・创建表空间create temporary tablespace "TS_yourTableSpaceNameXXX" IN DATABASE yourDB GROUP IBMTEMPGROUP
PAGESIZE 8092 MANAGED BY AUTOMATIC STORAGE
USING STOGROUP "IBMTEMPGROUP"
EXTENSIZE 32
PREEFFTCHSIZE AUTOMATIC
BUFFERPOLL "BP_yourBufferPollName"
OVERHEAD INHRIT
NO FILE SYSTEM CACHING
DROPPED TABLE RECOVERY OFF;
11.06.【权限问题】SQL1092N
创建数据库,需要管理员权限
db2 create db yourDB on 'C:' USING CODESET IBM-943 TERRITORY JP
db2 connect to yourDB
territory 英 [ˈtɛrɪtərɪ] n. 领土;地区;范围;领域
11.07.SQLCODE=-803, SQLSTATE=23505
违反唯一约束。
(解决:查看主键採番的【值】、有唯一约束的字段的【值】,在现有的数据中是否存在)
发生原因:数据不整合。(不是实际环境跑出来的数据,手动投入数据,造成不整合。)
11.08.SQLSTATE=08001
AIX db2 User 登录时异常USERID DISABLED or RESTRICTED
SQL30082N Security processing failed with reason "19" ("USERID DISABLED or RESTRICTED"). SQLSTATE=08001
===
以root用户登录后
vi /etc/security目录下的lastlog文件===
将锁定用户对应的unsuccessful_login_count=xxx改成=0后保存退出就行
11.09.★★★【22001】★★★SQLCODE=-302, SQLSTATE=22001 超长
插入时报错
插入数据时,某个字段超出了 数据库中 定义的 该字段 的长度。
预编译查询时报错(包括JPA的预编译查询)
当使用PreparedStatement的预编译的模式,即:PreparedStatement ps = conn.prepareStatement("select * from A where a=?");ps.setString(1, "1790000001x");时,
如果位数超长,也会报出上述的异常;
=============
★★★★★★★ ↑ 这个错误,无法确认出到底那个字段超长,只能一个个的确认。。。。。★★★★★★★
===========
11.10.★★★【23502】★★★10.SQLCODE: -407, SQLSTATE: 23502, SQLERRMC: TBSPACEID=2, TABLEID=640, COLNO=55 插入非空字段
非空字段插入
调查具体是那个字段时,使用下面的SQL
SELECT tabschema, tabname, colname
FROM syscat.columns
WHERE colno = 55
AND tabschema = 'yourSchemaName'
AND tabname = 'yourTableName'
11.11.DB2 SQLCODE=-206, SQLSTATE=42703 定义表字段问题
要查询的字段不存在时,便会出现这个错误
xxx
11.12.SQLCODE=-104, SQLSTATE=42601 SQL语法错误
SQL语法错误时,出现如下错误提示
com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601
11.13.SQLCODE=-911, SQLSTATE=40001,SQLERRMC=68 乐观锁
JPA:理由コード(SQLERRMC)68
乐观锁
乐观锁错误通常发生在第一个用户提交事务时。当第一个用户在读取数据后,另一个用户修改了同样的数据并提交了修改,此时第一个用户提交事务时会发现数据已经被修改,导致乐观锁错误。乐观锁的实现通常是在更新数据时先检查数据版本号或者时间戳,如果当前的数据版本号比预期的要旧,就会出现乐观锁错误。
org.apache.openjpa.persistence.OptimisticLockException
"null"で、オブジェクト・ロックを取得できません。
FiledObject:SELECT COUNT(1) FROM XXXX WHERE.....
====
【问】:在查询的时候竟然也会报这个错误!!!??
查询时,使用的是默认的事务隔离级别【with cs】 游标稳定性
stability 英 [stəˈbɪlɪtɪ] n. 稳定(性);坚定
在数据库操作中,乐观锁(optimistic lock)通常用于处理并发访问的问题。当多个用户同时对同一条数据进行读取和修改操作时,可能会出现乐观锁错误。在单纯查询处理时,通常不会触发乐观锁错误,因为查询操作本身不涉及对数据的修改。
乐观锁通常发生在涉及数据修改的操作中,例如更新或删除操作。当多个用户同时对同一条数据进行更新或删除时,系统会检测到数据的版本冲突,从而引发乐观锁错误。在这种情况下,数据库系统会根据设定的乐观锁策略(如版本号、时间戳等)来判断哪个操作应该被允许执行,哪个操作应该被阻塞或回滚。
因此,在单纯查询处理时,不会发生乐观锁错误。乐观锁主要用于处理并发数据修改操作时的冲突,以确保数据的一致性和完整性。
今天一位同学,更新数据库后,没有提交事务,然后程序运行时,在一处检索处理中,报了这个错误。。。
【答】:OpenJAP 查询的时候,会先取得锁,所以会报乐观锁的错。
====
查看未提交的事务(数据库被锁的情况) SQL
SELECT * FROM sysibmadm.locks_held;
SELECT * FROM sysibmadm.locks_held
WHERE TABSCHEMA="XXXXX"
================================
有时上面的SQL查询不出数据,使用下面的SQL
select * from table(snap_get_lock('', -1)) As T where lock_object_type='TABLE_LOCK'
上面的SQL查询出的 ID 和下面得到的ID匹配,可以找到那个IP把数据给锁了(人为修改数据,忘记了提交事务。)
db2 list aplications
================================
xxx
解决1
db2 list aplications
db2 "force application(XXXX)"
db2stoop
db2start
解决2
找到死锁数据库的人(事务一直没有提交的人)
上面【查看未提交事务】时,会得到一个 ID(AGENT_ID),这个ID和【db2 list aplications】中某条记录的(appl.handle)是可以对应的,【db2 list aplications】中每条记录都有IP (Application ID : IP.xxxxx),找到那个IP对应的人。让他把事务提交,问题即可解决。
↑ 这里面还可以看到应用程序信息,比如本地连接数据库时,显示 A5M2.exe
↑ 本地每次连接时,都会创建(分配)一个(appl.handle),只要不断开连接,这个ID一直保持不变。
解决3
db2 get snapshot for locks on dbname 查看锁表 application handle
db2 "list applications" 其中appl.handle为锁表进程
db2 "force application(进程号)"
===
11.14.SQLCODE=-952, SQLSTATE=57014
等待另外一个事务终了超时
-952的 处理被客户程序的取消请求中断
说明:客户端程序发出了取消请求,该请求终止了SQL语句的处理。系统动作:SQL语句已终止,并且对该语句所做的任何更改都已撤消。如果SQL游标与中断的SQL语句相关联,则该游标将关闭。
解决方法 :修改SQL语句的执行时间
如果用到ibatis框架的话,修改SqlMapConfig.xml中的defaultStatementTimeout就可以了
xxx
11.15.SQLSTATE=57019
数据库服务没有启动成功。(电脑右下角的数据库图标上,有一个红色的方块。)
xxx
11.16.SQL1776N
有主副DB服务器,连接副(备用数据库(standby))时,出现此错误
SQL1776N The command cannot be issued on an HADR database. Reason code = "1".
错误代码 SQL1776N 告诉你无法在 HADR database 上执行该命令,原因码为 "1"。这个错误通常发生在试图在 HADR(高可用性和灾难恢复)数据库上执行不允许的操作时。
在 HADR 配置中,有一个主数据库(primary)和一个或多个备用数据库(standby)。主数据库用于处理写操作和大部分读操作,而备用数据库则用于复制主数据库的数据以提供冗余和故障转移。
由于备用数据库是被动的,不接受写操作,所以在备用数据库上执行一些更改操作是不允许的。常见的一些不允许的操作包括插入、更新、删除数据等。
如果你需要在 HADR 数据库上执行某些操作,你可以先将数据库角色切换为主数据库,然后再执行操作。切换数据库角色的具体步骤取决于你的数据库管理系统和配置。
请注意,执行操作时要谨慎,尽量避免在备用数据库上执行写操作,以确保数据的一致性和可用性。如果你需要进一步理解和解决这个问题,可以提供更多相关信息,我将尽力帮助你。
xxx
11.17.ERRORCODE=-4214 // 密码过期,或 密码被锁
lsuser -f userName | grep maxage
13 // 过多久(周数)之后用户必须修改密码?
0 //永远不过期
===
・查看上次修改密码时间
/etc/security/passwd
・查看上次登录时间,登录失败时间・次数
/etc/security/lastlog
xxx
11.18.ERRORCODE=-4461, SQLSTATE=42815 (JPA 主键)
JPA、EJB、事务管理、WebSphere ---相关内容整理_ejb jpa-优快云博客
===
<openjpa-2.2.3-SNAPSHOT-r422266:1764177 fatal general error> org.apache.openjpa.persistence.PersistenceException:[jcc][t4][10145][10897][4.28.11]パラメーター 0 が無効:パラメーター索引が範囲外です。ERRORCODE=-4461, SQLSTATE=42815
==
错误原因
1.复合主键定义有问题
2.查询项目里面没有主键
xxx
11.19.ERRORCODE=-4220 // java.io.CharConversionException
JDBC throws java.io.CharConversionException - Documentation IBM
java.io.CharConversionException. See attached Throwable
for details. ERRORCODE=-4220, SQLSTATE=null"
xxx
再现方法:
编码为CP943 (SJIS)的DB2数据库,存入汉字,
java中,使用SQL取得数据,保存到Bean中时,报错。
解决:
添加如下JVM参数
-Ddb2.jcc.charsetDecoderEncoder=3
只是临时解决,让程序不出异常,取得的字段还是乱码!
影响:
最大级别本番障害(SQL处理位置出错,没有对应的捕获处理,异常抛到外层,一条数据的数据问题,造成整个Batch处理全部挂掉。)
xxx
11.20.SQL 3132W // db2 命令行导出数据时,类型是clob的字段, 自动截位警告
警告信息:
列"XXX_PDF_DATA"の文字列データがサイズ "32700に切り捨てられます。
因为问题:
引发换行
xxx
11.21.其它错误code汇总(并非100%准确,仅供参考)
===
SQLCode SQLState 状态说明
000 00000 SQL语句成功完成
01xxx XXX SQL语句成功完成,但是有警告
+012 01545 未限定的列名被解释为一个有相互关系的引用
+098 01568 动态SQL语句用分号结束
+100 02000 没有找到满足SQL语句的行
+110 01561 用DATA CAPTURE定义的表的更新操作不能发送到原来的子系统
+111 01590 为2型索引设置了SUBPAGES语句
+117 01525 要插入的值的个数不等于被插入表的列数
+162 01514 指定的表空间被置为检查挂起状态
+203 01552 使用非唯一的名字来解决命名的限定列
+204 01532 命名的对象未在DB2中定义
+206 01533 命名的列不在SQL语句中指定的任何表中存在
+218 01537 因为SQL语句引用一个远程对象,不能为该SQL语句执行EXPLAIN
+219 01532 命名的PLAN TABLE不存在
+220 01546 不正确定义PLAN TABLE,检查命名列的定义
+236 01005 SQLDA中的SQLN的值至少应于所描述的列的个数一样大
+237 01594 至少有一个被描述的列应该是单值类型,因此扩展的SQLVAR条目需要另外的空间
+238 01005 至少应有一个被描述的列是一个LOB,因此扩展的SQLVAR条目需要另外的空间
+239 01005 至少应有一个被描述的列应是单值类型,因此扩展的SQLVAR条目需要另外的空间
+304 01515 该值不能被分配给宿主变量,因为该值不再数据类型的范围之内
+331 01520 不能被翻译的字符串,因此被设置为NULL
+339 01569 由于与DB2 2.2版本的子系统连接,所以可能存在字符转换问题
+394 01629 使用优化提示来选择访问路径
+395 01628 设置了无效的优化提示,原因代码指定了为什么,忽略优化提示
+402 01521 未知的位置
+403 01522 本地不存在CREAT ALIAS对象
+434 01608 在DB2未来发布的版本中将不支持指定的特性,IBM建议你停止使用这些特性
+445 01004 值被CAST函数截取
+462 01Hxx 由用户定义的函数或存储过程发出的警告
+464 01609 命名的存储过程超出了它可能返回的查询结果集的个数限制
+466 01610 指定由命名的存储过程返回的查询结果集的个数。成功完成
+494 01614 由存储过程返回的结果集的个数超过了由ASSOCIATE LOCATORS语句指定的结果集定位器的个数
+495 01616 因为倒台SQL的成本估算超出了在ELST中指定的警告阀值,所以发出警告
+535 01591 请求一个主健的定位更新,或请求一个使用自我引出 约束的表的删除操作
+541 01543 命名外健是一个重复的引用约束
+551 01548 命名的授权ID缺少在命名的DB2对象上执行命名操作的权限
+552 01542 命名的授权ID缺少执行命名操作的权限
+558 01516 已经被授权该PUBLIC,因此WITH GRANT OPTION不可用
+561 01523 对ALTER REFERENCES INDEX 和TRIGGER特权,PUBLIC AT ALL LOCATION无效
+562 01560 因为GRANTEE已经拥有这些特权,所以一个或更多的特权被忽略
+585 01625 模式名指定了不止一次
+599 01596 没有为长字符数据类型(BLOB,CLOB和DBCLOB)建立比较函数
+610 01566 由于建立了一个指定为DEFER YES的索引,指定的对象处于PENDING状态,或者因为使用了ALTER INDEX改变关键值的范围,所以指定的对象处于PENDING状态
+625 01518 因为删除了主健索引,所以表定义被标注为不完整
+626 01529 删除了加强UNIQUE约束的索引,唯一性不在被加强
+645 01528 因为建立的索引中没有包含NULL,所以WHERE NOT NULL被忽略
+650 01538 不能更改或者建立已命名的表为从属表
+653 01551 在已指定的分区表空间中尚没有建立指定的分区索引,所以分区索引不可得
+655 01597 为CREATE或ALTER STOGROUP语句指定特定或者非特定的卷ID,在DB2较新发布的版本中(版本6以后)将不再支持他们
+658 01600 当建立目录索引时,不能指定SUBPAGES语句,SUBPAGES将被忽略,并缺省为1
+664 01540 分区索引的限制关键字超出了最大值
+738 01530 已命名的对象的更改可能像只读系统中对象的改变要求一样
+799 0157 SET语句中引用的特定寄存器不存在,将忽略 SET请求
+802 01519 数据溢出或者因除法异常而引起的数据异常错误
+806 01553 ISOLATION(RR)与LOCKSIZE PAGE 冲突
+807 01554 由于十进制乘法导致溢出
+863 01539 连接成功,但是只支持SBCS
+2000 56094 SUBPAGES不等于1的1型索引不能成为数据共享环境中的缓冲池组依赖者
+2002 01624 因为指定的缓冲池不允许超高速缓存,GNPCACHE指定被忽略
+2007 01602 因为DB2子系统的参数禁用“提示(hiats)”所以不能指定优化提示
+30100 01558 分布式协议错误被检测到,提供原来的SQLCODE和SQLSTATE
-007 42601 SQL语句中由非法字符
-010 42603 字符串常量非正常终止;检查到有遗漏的引号标志
-029 42601 需要INTO语句
-060 42815 某特定数据类型的长度或者标量规范无效
-084 42612 不能执行SQL语句,因为该语句对动态SQL无效或者对OS/390的DB2无效
-097 42601 在单位类型、用户自定义的函数以及过程中不能使用带有CAST的LONG VARCHAR或LONGVARGRAPHIC
-101 54001 SQL语句超出了已确定的DB2限制:例如,表的数目太多,语句中的字节太多
-102 54002 字符串常量太长
-103 42604 无效数学文字
-104 42601 SQL语句中遇到非法符号
-105 42604 无效的字符串格式;通常引用一个格式不正确的图形字符串
-107 42622 对象名太长
-108 42601 RENAME语句中指定的名字有错误,不能使用限定词
-109 42601 指定了无效语句;例如CREATE VIEW不能包含ORDER BY 语句
-110 42606 遇到了无效的十六进制的文字
-111 42901 指定的列函数没有给出列名
-112 42607 无效的列函数语法;列函数不能运行与其他的列函数之上
-113 42602 遇到无效字符
-114 42961 该语句的位置名称必须与当前服务器匹配,但是却没有匹配
-115 42601 因为比较运算符没有伴着一个表达式或者列表,遇到了无效谓词
-117 42802 待插入的数值的个数于被插入的行中的列数不相等
-118 42902 数据修改语句(UPDATE或DELETE)和FROM语句中的表和视图命名不合法
-119 42803 HAVING语句中的列的列表与GROUP BY语句中的列列表不匹配
-120 42903 不允许WHERE语句、SET语句、VALUES语句或者SET ASSIGNMENT语句引用列函数
-121 42701 在INSERT或UPDATE语句中,某一列被非法引用了两次
-122 42803 非法使用了列函数。因为没有用于一个列函数的所有列不再GROUP BY语句中
-123 42601 特定位置的参数必须是一个常数或者一个关键词
-125 42805 ORDER BY语句中指定了无效数字,该数字要么小于1要么大于选定的列数
-126 42829 不能为一个UPDATE语句指定ORDER BY语句
-127 42905 在子选择中DISTINCT只能指定一次
-128 42601 SQL谓词中NULL使用不当
-129 54004 SQL语句中包含的表多于15个
-130 22019 ESCAPE语句必须为一个字符
-131 42818 LIKE谓词只能用于字符数据
-132 42824 LIKE语句、ESCAPE语句、LOCATE函数或POSSTR函数中有无效运算对象
-133 42906 无效相关子查询引用
-134 42907 大于255字节的列被不正确使用
-136 54005 排序关键字的长度大于4000字节
-137 54006 被连接的字符串太大;字符的最大值为32767;图形的最大值为16382
-138 22011 SUBSTR列函数的第二个或第三个操作符无效
-142 42612 不支持的SQL语句。该语句可能在另外的RDBMS上有效,也有可能在其他的上下文中有效(例如,VALUES只能在触发器中出现)
-144 58003 指定的段号无效
-147 42809 某一源函数不能更改。要改变源函数,必须删除该源函数并重新建立他
-148 42809 RENAME和ALTER无法执行。RENAME不能对视图或者活动RI.ST表重新命名。ALTER不能用于改变列的长度,因为该列参与了RI、一个用户退出程序、全局的临时表或打开DATACAPTURE CHANGES表的列
-150 42807 触发活动的INSERT,UPDATE或DELETE语句中指定了无效的视图更新或一个无效的转换表
-151 42808 试图更新一个不可更新的视图的列、一个DB2 CATALOG表的列或者一个ROWID列
-152 42809 DROP CHECK试图删除一个参照约束,或者DROP FOREIGN试图删除一个检查约束
-153 42908 无效的视图建立请求,必须为旋转列表中列出的列出的未命名的列或者重复的列提供一个名字
-154 42909 不能用UNION、UNION ALL或者一个远程表建立视图
-156 42809 在视图上建立索引是非法的,或者在ALTER TABLE,CREATE TRIGGER,DROP TABLE或LOCK TABLE语句上指定一个不是表的其他对象这是无效的
-157 42810 必须在FOREIGN KEY语句中指定一个表名
-158 42811 视图的列和选择列表中的列不相匹配
-159 42089 无效DROP或COMMENT ON语句
-160 42813 对该视图的WITH CHECK OPTION无效
-161 44000 正被更新的视图WITH CHECK OPTION语句使得这行不能被插入或更新
-164 42502 用户没有建立这个视图的权限
-170 42605 标量函数指定了无效的参数个数
-171 42815 标量函数指定了无效的数据类型长度或者无效数值
-173 42801 在非只读型的游标上不能指定隔离级别UR
-180 22007 DATE、TIME、TIMESTAMP值的字符串表示法的语法不对
-181 22001 不是有效的DATE、TIME、TIMESTAMP值
-182 42816 在算术表达式中的日期/时间值无效
-183 22008 在算术表达式中返回的日期/时间值的结果不在有效值的范围内
-184 42610 没有正确使用日期/时间值的参数标记
-185 57008 没有定义本定的日期/时间出口
-186 22505 改变本定的日期/时间出口引发这个程序的长度无效
-187 22506 MVS返回无效的当前日期/时间
-188 22503 字符串表示无效
-189 22522 指定的编码字符集的ID无效或没有定义
-190 42837 不能象所设定的那样改变(ALTER)列。只能改变(ALTER)VARCHAR列的长度
-191 22504 字符串中包含了无效的混合数据
-197 42877 当两个或多个表被联合在一起排序时,限定的列名不能在ORDER BY语句中使用
-198 42617 试图对空的字符串发布一个PREPARE或EXECUTE IMMEDIATE语句
-199 42601 SQL语句中使用了非法关键词
-203 42702 模糊列引用
-204 42704 没有定义的对象名
-205 42703 指定的表的列名无效
-206 42703 列名没有在FROM语句所引用的任何表中,或者没有在定义触发器所在的表中
-208 42707 不能ORDER BY指定列,应为该列不在选择列表中
-212 42712 指定的表名在触发器中不允许多次使用,只能使用一次
-214 42822 DISTINCT、ORDER BY 引起的无效表达式
-219 42704 因为PLAN_TABLE不存在,EXPLAIN无法执行
-220 55002 遇到无效的PLAN_TABLE列
-221 55002 如果为PLAN_TABLE定义了可供选择的列,那么,必须定义所有的列
-229 42708 指定的现场找不到
-240 428B4 LOCK TABLE语句的PART子句无效
-250 42718 没有定义本地位置名
-251 42602 记号无效
-289 57011 无法分配所需内存资源(数据库资源不足)
-300 22024 宿主变量或参数中的字符串不是以NULL为终止
-301 42895 无效的宿主变量数据类型
-302 22001 输入的变量值对指定的列无效
-303 42806 因为数据类型不兼容,不能分配数值
-304 22003 因为数据超出了范围,不能分配数值
-305 22002 没有NULL指示符变量
-309 22512 因为引用的宿主变量被设置成NULL,所以谓词无效
-310 22501 十进制的宿主变量或参数包含非十进制数据
-311 22501 输入的宿主变量长度无效,或者时负值或者太大
-312 42618 没有定义宿主变量或者宿主变量不可用
-313 7001 宿主变量的个数不等于参数标识的个数
-314 42714 模糊的宿主变量引用
-327 22525 在最后分区的关键字范围内,不能插入行
-330 22021 不能成功的翻译字符串
-331 22021 字符串不能分配到宿主变量,因为其不能成功的被翻译
-332 57017 不能为两个命名的编码字符集的ID定义翻译规则
-333 56010 子类型无效导致翻译失败
-338 42972 ON语句无效,必须引用连接的列
-339 56082 访问DB2 2.2版本的子系统被拒绝,原因时ASCII到EBCDIC翻译不能进行
-351 56084 SELECT列表中有不支持的数据类型
-352 56084 输入列表中有不支持的数据类型
-355 42993 LOB列太大,以至不能被记录在日志中
-372 428C1 每个表只允许有一个ROWID列
-390 42887 在上下文中指定的函数无效
-392 42855 自从前一次FETCH以来,指定游标的SQLDA已被不恰当的改变
-396 38505 在最后的访问过程中,视图执行SQL语句
-397 428D3 在某一列上不恰当的指定了GENERATED因为该列不是ROWID数据类型
-398 428D2 为某一个宿主变量请求LOCATOR,但是该宿主变量不是一个LOB
-399 22511 在INSERT语句中为ROWID列指定的值无效
-400 54027 在DB2编目中定义的用户自定义索引不能超过100个
-401 42818 算术操作符或比较操作符的操作对象不是兼容的
-402 42819 算术函数不能用于字符或日期时间数据
-404 22001 SQL语句指定的字符串太长
-405 42820 数值文字超出了范围
-406 22003 计算出的或者倒出的数值超出了范围
-407 23502 不能把NULL值插到定义为NOT NULL的列中
-408 42821 数值不能被更新或插入,因为他与列的数据类型不兼容
-409 42607 COUNT函数指定的运算对象无效
-410 42820 浮点文字笔30个字符的最大允许长度长
-411 56040 CURRENT SQLID使用无效
-412 42823 在子查询的选择列表中遇到了多个列
-413 22003 当转换为一个数字型数据类型时,数据溢出
-414 42824 LIKE谓词不能运行于用数字或日期时间类型定义的列
-415 42825 为UNION操作指定的选择列表不是联合兼容的
-416 42907 包含UNION操作符的SQL语句不允许有长的字符串列
-417 42609 两参数标识符作为运算对象被指定在同一谓词的两边
-418 42610 参数标识符使用无效
-419 42911 十进制除法无效
-420 22018 字符串自变量值不符合函数的要求
-421 42826 UNION操作的选择列表中没有提供相同数目的列
-423 0F001 为LOB或结果集定位器指定的值无效
-426 2D528 在不允许更新的应用服务器不允许执行COMMIT语句
-427 2D529 在不允许更新的应用服务器不允许执行ROLLBACK语句
-430 38503 在用户自定义的函数或存储过程中遇到了错误
-433 22001 指定的值太长
-435 428B3 无效的应用定义的SQLSTATE
-438 xxxxx 使用了RAISE_ERROR函数的应用发出了一个错误
-440 42884 存储过程或用户自定义函数的参数列表参数个数于预期的个数不匹配
-441 42601 与标量函数一起使用DISTINCT或ALL是不正确的用法
-443 42601 指定的外部函数返回错误的SQLSTATE
-444 42724 与被称为存储过程或用户自定义函数有关的程序不能找到
-449 42878 对存储过程或用户自定义的 函数,CREATE或ALTER语句不正确(缺失EXTERNAL NAME 子句)
-450 39501 存储过程或用户自定义函数写入存储器的值超过了参数声明的长度
-451 42815 CREATE FUNCTION中指定了不正确的数据类型
-453 42880 用户自定义函数中的RETURNS语句无效
-454 42723 指定的函数识别标记与已存在的另一函数的识别标记冲突
-455 42882 模式名不比配
-456 42710 为用户自定义函数指定的函数名已经存在
-457 42939 用户自定义函数或用户自定义类型正试图使用系统中定义的函数或者类型所用的名称
-458 42883 没有找到函数
-463 39001 特定的外部例程返回无效的SQLSTATE
-469 42886 参数定义为OUT或INOUT的CALL语句必须提供宿主变量
-470 39002 指定了NULL参数,但是该例程却不支持NULL
-471 55023 存储过程或用户自定义函数失败:提供原因代码
-472 24517 外部的函数程序使游标处于打开状态
-473 42918 用户自定义数据类型命名不能和系统定义的数据类型一样
-475 42866 结果类型不能被转换成RETURNS类型
-476 42725 在其模式中该函数不是独一无二的
-478 42893 不能DROP或REVOKE特定的对象,因为其他对象依赖于该对象
-480 51030 直到存储过程已经被CALL后,DESCRIBE PROCEDURE和ASSOCIATE LOCATORS才能被发布
-482 51030 存储过程不返回到任何一个定位器
-483 42885 CREATE FUNCTION语句中的参数个数与源函数中的参数个数不匹配
-487 38001 选择了NO SQL选项建立指定的存储过程或用户自定义函数,但却视图发布SQL语句
-491 42601 CREATE FUNCTION语句无效,因为该语句没有RETURNS语句或者因为该语句没有指定有效的SOURCE或者EXTERNAL语句
-492 42879 指定函数的指定参数的个数有错误
-495 57051 语句的估计处理器成本超出了资源限制
-496 51033 语句无法执行,因为当前服务器与调用存储过程的服务器不同
-497 54041 指定的数据库超过了32767 OBID的上限,或者CREATE DATABASE语句使之达到了32511DBID的上限
-499 24516 指定的游标已被分配到结果集,该结果集来自已经指定的存储过程
-500 24501 因为连接被破坏,WITH HOLD游标被关闭
-501 24501 在试图获取数据或关闭一个游标前必须打开一个游标
-502 24502 在没有关闭游标前不能再次打开游标
-503 42912 因为列在游标的FOR UPDATE OF语句中没有被指定,该游标用于获取该列,所以不能更新该列
-504 34000 不能引用一个游标,因为他不是定义到程序里的
-507 24501 在试图更新或者删除WHERE CURRENT OF前,必须打开游标
-508 24504 因为被引用的游标当前不是处于数据行上,所以不能被更新或删除
-509 42827 除了在游标上指定的那个表(该表由WHERE CURRENT OF语句引用的)以外,再也不能从别的表上更新数据
-510 42828 表或视图不能被修改
-511 42829 对不可修改的表或视图,FOR UPDATE OF语句无效
-512 56023 对远程对象的无效引用
-513 42924 一个别名不能再被定义成另外的别名
-514 26501 游标尚没有被准备
-516 26501 试图描述未准备好的SQL语句
-517 07005 因为SQL语句尚没有准备好,游标无效
-518 07003 试图执行尚没有准备好的SQL语句
-519 24506 当为游标的SQL语句发布一个准备语句是,游标不能是打开的
-525 51015 不能在已指定的程序包中执行SQL语句,因为在绑定时间内该程序包无效
-526 42995 在给定的上下文中,不能使用全局的临时表
-530 23503 对特定的约束名指定了无效的外健值
-531 23504 从版本5开始,父关键字的多行更新将试图删除一个外关键字依赖的父关键字值,在版本5以前,当引用主关键值外健值当前存在时,试图更新该主健值
-532 23504 删除操作违反了已指定的参照约束
-533 21501 多行插入无效,试图将多行插到自我引用的表中
-534 21502 可改变主健列值的更新语句不能在同一时刻用于更新多行
-535 21502 当从自我引用表中删除数据或者更新主健列时,不能指定WHERE CURRENT OF。不是版本5的子系统才调用该代码
-536 42914 因为某一特定表的参照约束存在,所以删除语句无效
-537 42709 在外健语句或主健语句的规范中,每个列的出现不能多于一次
-538 42830 无效的外健;不符合引用的表没有主健
-539 42888 不能定义外健,因为被引用的表没有主健
-540 57001 表定义不完整,直到为主健建立了唯一索引或UNIQUE语句、或者包含GENERATED BYDEFAULT属性的ROWID列
-542 42831 可以为空的列不允许作为主健的一部分包含在内
-543 23511 因为该表是指定了SET NULL删除规则的参照约束的父表而且检查约束不允许NULL,所以DELETE不能发生
-544 23512 不能用ALTER添加检查约束,因为已存在的某行与该检查约束冲突
-545 23513 INSERT或者UPDATE导致检查约束冲突
-546 42621 在CREATE或ALTER TABLE中指定的检查约束无效
-548 42621 因为指定的列而引起的检查约束无效
-549 42509 DYNAMICRULES(BIND)计划或程序包的无效SQL语句
-551 42501 用户试图对不拥有权限的特定的对象进行操作,或者表不存在
-552 42502 用户试图执行未被授权的操作
-553 42503 不能指定CURRENT SQLID,因为用户尚没有被允许改变那个ID
-554 42502 不能对你本身赋予一个权限
-555 42502 不能对你本身撤销一个权限
-556 42504 不能撤销用户没有拥有的权限
-557 42852 指定了不一致的授予或撤销关键词
-558 56025 为授予或撤销语句指定了无效的语句(一个或一组)
-559 57002 DB2权限机制已经禁用,授予或者撤销不能被发布
-567 42501 指定的权限ID缺少对指定的程序包的绑定权限
-571 25000 不允许多点更新
-573 42890 不能定义参照约束,因为已指定的父表中在指定的列上没有唯一健
-574 42864 指定的缺省与列定义冲突
-577 38002 试图修改用户自定义函数中的数据或者存储过程中的数据,但这些对象的建立没有选择MODIFIES SQL DATA选项
-579 38004 试图修改用户自定义函数中的数据或者存储过程中的数据,但这些对象的建立没有选择READ SQL DATA选项,也没有选择MODIFIES SQL DATA选项
-580 42625 CASE表达式中的结果表达式不能都是空的
-581 42804 CASE表达式中的结果表达式为不兼容的数据类型
-582 42625 SEARCHED-WHEN-CLAUSE中的查找条件指定了一个限定的、IN或EXISTS谓词
-583 42845 指定的函数失败,因为他不是决定性的,或者可能有外部动作
-585 42732 在当前路径中模式名不止一次出现
-586 42907 CURRENT PATH专用寄存器在长度上不能超过254字符
-587 428C6 项目引用的列表必须是同一个家族
-590 42734 在命名的存储过程或用户自定义的函数中的参数必须是独一无二的
-592 42510 没有授权权限,让你在WLM环境中建立的存储过程或者用户自定义函数
-601 42710 试图创建(或重命名)已经存在的对象
-602 54008 CREATE INDEX语句中指定的列太多
-603 23515 因为发现有重复值,所以不能建立唯一的索引
-604 42611 在CREATE或ALTER TABLE语句中的为数据类型指定的长度、精度以及标度无效
-607 42832 指定的INSERT、UPDATE或DELETE语句不能被发布,应为这些语句对DB2 CATLOG表执行写操作
-611 53088 当LOCKSIZE是TABLE或者TABLESPACE时,LOCKMAX必须为0
-612 42711 在同一个表、索引或试图中不允许有重复列名
-613 54008 主健或UNIQUE约束太长或者包含了太多的列
-614 54008 已经超过了索引的内部健长度的最大长度(255)限制
-615 55006 不能删除这个程序包,因为该程序包目前正在执行
-616 42893 指定的对象不能被删除,因为其他对象依赖于该对象
-617 56089 对于DB2版本6,1型索引无效。对于以前的版本,1型索引不能用LOCKSIZE ROW或LARGE表空间定义
-618 42832 对DB2 CATALOG表的请求操作时不允许的
-619 55011 DSNDB07不能修改,除非他先被停止了
-620 53001 对在DSNDB07中的表空间不允许指定该关键词
-621 58001 遇到了重复的DBID,遇到了系统问题
-622 56031 不能指定FOR MIXED DATA因为没有安装混合数据选项
-623 55012 不能为单一的表定义多个族索引
-624 42889 不能为单一的表定义多个主健
-625 55014 用主健定义的表要求唯一索引
-626 55015 不能发布ALTER语句来改变PRIQTY SECQTY或ERASE,除非先停止了表空间
-627 55016 不能发布ALTER语句来改变PRIQTY SECQTY或ERASE,除非先把表空间定义为使用存储器组的表空间
-628 42613 指定语句时相互排斥的(例如,不能分区一个分段的表空间)
-629 42834 因为该外健不能包含空值,所以SET NULL无效
-630 56089 不能为1型索引指定WHERE NOT NULL
-631 54008 无效的外健;要么是比254个字节长,要么包含的列数多于40
-632 42915 指定的删除规则禁止把这个表定义为已制定表的从属表
-633 42915 无效删除规则;必须使用特定的强制删除规则
-634 42915 在这种情况下,DELETE CASCADE不允许
-635 42915 删除规则不能有差异或者不能为SET NULL
-636 56016 在分区索引健的升序或降序规范中,分区所以必须与该规范一致
-637 42614 遇到重复的关键词
-638 42601 在CREATE TABLE语句中缺少列定义
-639 56027 带有SET NULL的删除规则的外健的可空列不能是分区索引的列
-640 56089 不能为这个表空间指定LOCKSIZE ROW,因为在该表空间中的表上定义了1型索引
-642 54021 唯一约束包含太多的列
-643 54024 检查约束超出了3800个字符的最大长度
-644 42615 在SQL语句中为关键词指定的值无效
-646 55017 在指定的分区表空间或者缺省表空间中不能创建表,因为指定的表空间已经包含了一个表
-647 57003 指定的缓冲池无效,因为他没有被激活
-650 56090 ALTER INDEX不能被执行;提供了原因代码
-651 54025 如果CREARE或ALTER TABLE被允许,表对象的描述词(object descriptor,OBD)将超过最大值(32KB)
-652 23506 遇到了EDITRPROC或VALIDPROC冲突
-653 57004 在分区表空间中的表不可用,因为分区索引尚未被创建
-655 56036 在卷的列表中,STOGROUP不能指定为特定的或不特定(“*”)的卷
-658 42917 当试图删除指定的对象时,无法删除该对象,该对象的删除必须通过删除与之相关联的对象完成
-660 53035 不正确的分区索引规范,必须为族索引定义有限制的关键字
-661 53036 分区索引没有指定恰当的分区数目
-662 53037 试图在未分区的表空间(分段的或简单的)上建立分区索引
-663 53038 为分区索引指定的关键字限制值是一个无效数字
-665 53039 为ALTER TABLESOACE语句指定了无效的PART语句
-666 57005 SQL语句不能被处理,因为指定的函数当前正处于进行过程中
-667 42917 不能明确的删除分区表空间的族索引,必须除去分区表空间来去掉分区索引
-668 56018 不能向用EDITPROC定义的表中添加列
-669 42917 不能显式的删除分区表空间中的表,必须删除分区表空间来删除表
-670 54010 表的记录长度超过了页面的大小
-671 53040 不能更改指定的表空间的缓冲池,因为这将改变表空间的页面大小
-672 55035 在命名的表上不允许DROP
-676 53041 只有4KB的缓冲池可被用于一个索引
-677 57011 缓冲池扩展失败,由于可用的虚拟内存的大小不足
-678 53045 为才分区索引中指定的限制健提供的值与数据类型不符
-679 57006 不能创建某一个特定对象,因为该对象的一个drop目前正在挂起
-680 54011 对DB2表不能超过750列
-681 23507 列违反了指定的FIELDPROC
-682 57010 不能载入FIELDPROC
-683 42842 列、单值类型、函数或者过程无效,因为不兼容语句。例如,指定的INTEGER具有FORBITDATA选项
-684 54012 指定的文字列表不能超过254个字节
-685 58002 FIELDPROC返回一个无效的域描述
-686 53043 用FIELDPROC定义的一个列不能与一个使用不同的FIELDPROC定义的列作比较
-687 53044 列不能与一个非兼容字段类型的列比较
-688 58002 返回不正确的数据
-689 54011 从属表定义了太多的列
-690 23508 数据定义的控制支持拒绝这个语句
-691 57018 命名的注册表不存在
-692 57018 命名的索引不存在,但命名的注册表需要该索引
-693 55003 命名的注册表/索引的命名列无效
-694 57023 DROP正在命名的注册表上挂起
-696 42898 由于相关的名字或者转换表的名字使用不正确,指定的触发器无效
-697 42899 FOR EACH语句被指定,因此与OLD合NEW相关的名字是不允许的,或者不能为一个BEFORE触发器指定OLD_TABLE和NEW_TABLE
-713 42815 指定的专用寄存器是无效的
-715 56064 命名的程序不能被运行,因为他依赖与你所安装的DB2版本的部件,但是你的数据中心没有安装这个部件
-716 56065 命名的程序使用这个版本的不正确的发行版本做了预编译
-717 56066 BIND失败,因为他依赖与你所安装的DB2版本的部件,但是你的数据中心没有安装这个部件
-718 56067 REBIND失败,因为IBMREQD列无效
-719 42710 不能BIND ADD一个已经存在的程序包
-720 42710 不能BIND REPLACE一个已经存在的程序包版本
-721 42710 程序包的一致性记号必须是独一无二的
-722 42704 绑定错误,因为指定的程序包不存在
-723 09000 一个触发的SQL语句接受到一个错误
-724 54038 达到了(16)级联间接的SQL语句的最大项目
-725 42721 对专门指定的寄存器提供了一个无效值
-726 55030 因为SYSPKSYSTEM条目,不能绑定这个程序包
-728 56080 指定的数据类型不能与私有协议发布一起使用
-729 429B1 用COMMIT ON RETURN定义的存储过程不能用作嵌套的CALL过程的目标
-730 56053 在只读的共享数据库中为表定义的参照完整性无效
-731 56054 VSAM数据集必须用SHAREOPTION(1.3)定义
-732 56055 被定义为只读型数据库却拥有没有定义空间或者索引空间的DB2子系统
-733 56056 只读共享数据库的定义不一致
-734 56057 一旦一个数据库被定义为ROSHARE READ,他将不能被更改为其他不同的ROSHARE状态
-735 55004 用DBID名称标识的数据库不再是一个只读共享数据库
-736 53014 命名的DBID无效
-737 53056 在这种状况下,不能建立一个隐含的表空间
-739 56088 因为同时指定了ALLOW PARALLEL和MODIELES SQL DATA这两个语句,因此已设定的函数将不能再被更改
-740 51034 在这种方式下不能用MODIELES SQL DATA定义指定的函数
-741 55030 已经为命名的共享组成员的数据定义了工作文件数据库
-742 53004 DSNDB07是隐含的工作文件数据库
-746 57053 在特定的触发器、存储过程或函数中的SQL语句违反嵌套SQL限制
-747 57054 指定的表是不可用的除非为LOB数据列建立起必须的辅助表
-748 54042 在指定的辅助表上已经有一个索引
-750 42986 不能对已指定的表重新命名,因为他至少在一个现存的视图或触发器中被引用
-751 42987 存储过程或用户自定义的函数试图执行一个不允许执行的SQL语句。DB2的线程被置于MUST_ROLLBACK状态
-752 0A001 无效CONNECT语句
-763 560A1 无效的表空间名
-764 560A2 LOB表空间必须与其相关的基表空间同在一个数据库中
-765 560A3 表和数据库不兼容
-766 560A4 不能对辅助表进行请求的操作
-767 42626 CREATE INDEX失败,因为在辅助表中为索引指定了列,或者因为没有为非辅助表的索引指定列
-768 560A5 不能为指定的列或者指定的分区建立辅助表,因为其辅助表已经存在
-769 53096 CREATE AUX TABLE的规格与基表不匹配
-770 530A6 指定的表必须有一个ROWID列,那么该表才可以包含一个LOB列
-771 428C7 无效的ROWID列规范
-797 42987 CREATE TRIGGER包含不被支持的语法
-798 428C9 不能把一个值插入到用GENERATED ALWAYS定义的ROWID列
-802 22012 某一特定操作发生了异常错误,被零除
-803 23505 不能插入行,因为这将违反唯一索引的约束
-804 07002 SQLDA的调用参数列表有误
-805 51002 在计划中没有发现DBRM或程序包名
-807 23509 对已指定的环境和连接,该程序包不可用
-808 08001 CONECT语句与程序中的第一个CONNECT语句不一致
-811 21000 当多行作为一内嵌的选择语句的返回结果是,必须使用游标
-812 22508 在CURRENT PACKAGESET中的ID集合是空白的,语句不能被执行
-815 42920 在一个内置选择语句或者一个基本谓词的子查询中,显式的或隐含的指定了GROUP BY或HAVING语句
-817 25000 执行SQL语句将可能导致禁止更新用户数据或DB2编目
-818 05103 划<->载入组件的时间戳不匹配,在执行计划中没有从同一个预编译中建立DBRM,该预编译是作为组件载入的
-819 58004 视图不能重建,因为在DB2编目中存储的分析树长度为0
-820 58004 在这个DB2版本的DB2编目中遇到了无效值
-822 51004 在SQLDA中遇到了无效地址
-840 54004 在选择列表或插入列表中返回的项目太多
-842 08002 到指定位置的连接已经存在
-843 08003 SET CONNECTION或RELEASE语句无法执行,因为连接不存在
-870 58026 宿主变量描述符的个数不等于语句中宿主变量的个数
-872 51302 这个子系统已指定了有效的CCSID
-873 53090 同一SQL语句中,不能同时引用EBCDIC表中的定义的列和ASCII表中定义的列
-874 53901 指定对象的编码方案与其表空间的编码方案不匹配
-875 42988 指定的操作符不能用于ASCII数据
-876 53092 不能为指定的原因创建对象:提供了原因代码
-877 53093 数据库或表空间不允许用ASCII,必须使用EBCDIC
-878 53094 该PLAN——TABLE不能是ASCII,必须使用EBCDIC
-879 53095 指定对象的CREATE或ALTER语句不能将列、单值类型,某个存储过程或用户自定义函数的参数定义为以下类型:MAXED DATA,GRAPHIC,VARGRAPHIC,LONGVARGRAPHIC,因为系统没有为指定的编码方案定义相应的CCSID
-900 08003 应用处理没有连接到应用服务器,语句不能被执行
-901 58004 遇到时断时续的系统错误,该错误不能抑制后继的SQL语句的执行
-902 58005 内部控制块的指针错误,要求重新绑定
-904 57011 指定的资源不可用
-905 57014 超出了资源上限
-906 51005 因为重大错误,SQL语句无法执行
-908 23510 当前资源限制设施的规范或者自动重绑定的系统参数不允许BIND,REBIND,AUTOREBIND
-909 57007 对象已被删除
-910 57007 因为在该对象上挂起DROP,所以不能访问该对象
-911 40001 当前工作单元已被回滚
-913 57033 因为死锁或超时导致不成功执行
-917 42969 绑定程序包已经失败
-918 51021 SQL语句不能被执行,因为连接丢失
-919 56045 需要一个ROLLBACK
-922 42505 连接权限失败。试图从TSO、CICS或IMS访问DB2,同时相应的连接设施处于非活动的状态
-923 57015 因为DB2不可用,所以不能建立连接
-924 58006 遇到了DB2内部的连接错误:提供了原因代码
-925 2D521 SQL的COMMIT语句不能从CICS或IMS/TM发布
-926 2D521 SQL的ROLLBACK语句不能从CICS或IMS/TM发布
-927 51006 当正在连接的环境没有建立时,语言接口被调用。利用DSN命令激发该程序
-929 58002 数据获取退出已经失败(DPROP)
-939 51021 由于远程服务器的未请求的回滚,要求一个回滚
-947 56038 SQL语句失败,因为更新不能被传播(DPROP)
-948 56062 DDF没有启动,分布式操作无效
-950 42705 在SQL语句中指定的位置在SYSIBM.LOCATIONS中没有定义
-965 51021 存储过程非正常终止(在DB2 6之前的版本)
-981 57015 当前不是处于允许SQL的状态时,试图在RRSAF中执行SQL
-991 57015 调用连接不能建立一个到DB2的隐含或开放连接
-1773 null 在 HADR 数据库下不支持的操作(如备库可能不支持写操作)
-2001 53089 为储存过程指定的宿主变量参数的个数不等于预期的参数个数
-20003 560A7 不能为GRECP中的表空间或索引指定GBPCACHE NONE
-20004 560A8 对于WORKFILE对象。8KB或16Kb的缓冲池页面大小无效
-20005 54035 指定的对象类型超出了内部的ID极限
-20006 53097 当没有指定WLM环境时,LOB不能被指定为参数
-20070 53098 不能非LOB列建立一个辅助表
-20071 53099 必须指定WLM环境名
-20072 56052 指定的权限ID不拥有在触发器程序包上执行BIND所需的权限
-20073 42927 不能按照指定的要求更改命名的函数,因为在现存的视图定义中引用了该函数
-20074 42939 不能建立指定的对象,因为“SYS”是一个保留的前缀
-20100 56059 在被触发的SQL语句中有BIND错误,指定了错误的SQLCODE和SQLSTATE
-20101 56059 由于指定的原因代码,该函数失败
-20102 42849 在CREATE或ALTER FUNCTION语句中不能使用指定的选项
-20104 42856 更改一个CCSID失败
-20106 42945 不能改变表空间或数据库的CCSID,因为现存的试图引用
-30000 58008 DRDA分布协议错误;处理可以继续
-30002 57057 使用DRDA的分布式客户把OPEN语句连接到PREPARE,但PREPARE接受到一个SQLCODE为+495的警告
-30020 58009 DRDA分布协议错误;对话被解除
-30021 58010 DRDA分布协议错误;处理不能继续
-30030 58013 违反分布协议:COMMIT不成功,对话被解除(AS)
-30040 57012 因为不能得到资源,执行失败,处理可以继续(AS)
-30041 57013 因为不能得到资源,执行失败,处理不能成功的继续(AS)
-30050 58011 执行不成功,在BIND过程中不能执行语句
-30051 58012 特定的BIND过程不是处于活动状态(远程BIND),从而导致失败
-30052 42932 程序准备的假设错误
-30053 42506 程序包的拥有者遭遇授权失败
-30060 08004 RBD遭遇授权失败
-30061 08004 指定了无效或者没有存在的RDB
-30070 58014 目标子系统不支持这个命令
-30071 58015 目标子系统不支持这个对象
-30072 58016 目标子系统不支持这个参数
-30073 58017 目标子系统不支持这个参数值
-30074 58018 应答信息不被支持
-30080 08001 SNA通信错误
-30081 58019 TCP/IP通信错误
-30082 08001 由于安全冲突、通信失败:提供了原因代码
-30090 25000 指定的操作对远程执行失败
-30104 56095 在绑定选项与绑定值中有错误
-30105 56096 指定的绑定选项不兼容
xxx
11.22.如何查询错误代码
错误代码分类
负值 SQLCODE:表示错误(如 -805)。正值 SQLCODE:表示警告(如 +100 表示未找到数据)。
0:成功执行。
SQLSTATE:标准化 5 字符代码(如 02000 表示未找到数据)。
==SQLCODE
db2 "? SQLxxxx" -- 将 xxxx 替换为错误代码(如 SQL-805 或 SQL0805)
===SQLSTATE
查看 db2 "? 57011"
===
官方文档
=====
SQLSTATE Messages - IBM Documentation
Character data, right truncation occurred; for example, an update or insert value is a string that is too long for the column, or a datetime value cannot be assigned to a host variable, because it is too small.
--
字符数据出现右截断;例如,更新或插入值是一个对于列来说太长的字符串,或者因为太小而无法将日期时间值分配给宿主变量。
===
11.23.SQLCODE=-668 , SQLSTATE57007---57016---解决办法---reorg table
xxx
11.24.SQLCODE=-289 ,SQLSTATE=57011---表空间不足
xxx
11.25.SQLCODE-----查看 db2 "? SQL-289" 信息更全---含code对应的错误,及,解决办法
xxx
11.26.SQLSTATE-----查看 db2 "? 57011"
xxx
11.27.【JPA错误,非DB2】openjpa-2.2.3-SNAPSHOT-r422266:1764177 nonfatal store error
javax.persistence.EntityManager有哪些实现类,以及代码执行后,em.find()方法再次执行原因分析-优快云博客
org.apache.openjpa.persistence.EntityNotFoundException
タイプ "xxxxx.xxxx.xxxx.XXXEntity"、oid "A12345" のインスタンスは、データ・ストアにもう存在していません。これは別のトレサビリティでそのインスタンスを削除したが、キャッシュされたものがこのコンテキストにまだ含まれることを意味している可能性があります。
FailedObject:xxxxx.xxxx.xxxx.XXXEntity-A12345
oid "A12345" : 是查询的表的主键的值。
xxx
11.28.XXX
xxx
11.29.XXX
xxx
===
12.事务
12.1.事务隔离
Order by xxx ASC Fetch first 1 rows only for update with rs
===
DB2中,共有四种隔离级:RS,RR,CS,UR,DB2提供了这4种不同的保护级别来隔离数据。隔离级是影响加锁策略的重要环节,它直接影响加锁的范围及锁的持续时间。两个应用程序即使执行的相同的操作,也可能由于选择的隔离级的不同而造成加锁的结果不同。
---
1、ur(Uncommited Read) 就是俗称“脏读“,在没有提交数据的时候能够读到更新的数据;是最低的隔离级别,并且提供最高的并行性。
---
2、cs(Cursor Stability) 在一个事务中进行查询时,允许读取提交前的数据,数据提交后,当前查询就可以读取到数据,update数据的时候并不锁表,在这一隔离级别中,游标的“当前”行是锁定的。如果该行只是被读,锁定会一直持续到一个新行被访问或者该工作单元终止。如果该行被修改,锁定会一直持续到该工作单元终止。
---
3、rs(Read Stability)读稳定性,在一个事务中进行查询时,不允许读取其他事务update的数据,允许读取到其他事务提交的新增数据,使用读稳定性,在同一个工作单元中的一个程序进程所检索的全部行都会被锁定。对于一个给定的游标,它要锁定所有与结果集匹配的行,例如,如果你有一个含1000行的表并且查询返回10行,那么只有那10行会被锁定。读稳定性使用中等级别的锁定。
---
4、rr(Repeatable Read)可重新性,可 重复读是最高的隔离级别,提供了最大程度的锁定和最少的并行。产生结果集的所有行都会被锁定,也就是说,即使不必出现在最终结果集中的行也会被锁定。在此 该工作单元结束前,任何其它程序都不能修改,删除或插入一个会影响结果集的行。重复读确保程序在一个工作单元中多次进行的同一项查询都返回结果。在一个事务中进行查询时,不允许任何对这个查询表的数据修改。
---※: 在使用第三方 DB 工具中, 验证事务时,比如A5,要打开两个窗口进行检证。
(同一个窗口,使用的是共同的事务,使用两个窗口,可以开启两个不同的事务)
12.2.查看未提交的事务
db2 list applications show detail
该命令显示所有正在运行的应用程序的相信信息,
包括事物ID,状态,开始时间和SQL语句。
未提交的事物,状态为“UOW Waiting”
如果想查看特定 未提交的事务,使用下面命令,可以显示事物的详细信息
db2 get snapshot for application <application_handle>
12.3.查看锁表信息
命令
db2 get snapshot for locks on databasename
或者
db2 list application for database yourDatabaseName show detail
12.4.断掉连接
命令
force application all // 强行终止所有lianjie
terminate // 清除所有db2的后台进程
或者
force application 进程ID // 选择特定的进程ID,Kill掉
12.5.xxx
xxx
13.函数
0.IBM官网查询
TIMESTAMP_FORMAT scalar function - IBM 文档
==
13.1.NVL
NVL(字段,如果为NULL则为值)
如果为 NULL 时,显示的值 (空串不作为NULL判断)
13.2.字符串拼接 ||
使用【||】即可实现字符串拼接
13.3.trim
trim(字段)
去掉空格
13.4.substr
substr(字段,开始索引,截取的长度)
开始索引是从1开始的
13.5.length
length(字段)
13.6.case when
CASE
WHEN length(trim(字段)) <> 0 THEN XXXXXX....
ELSE XXXXXXXX
END
13.7.xxx
xxx
13.8.xxx
xxx
13.9.xxx
xxx
13.10.xxx
xxx
13.11.xxx
xxx
14.存储过程与Package
查看存储过程有无错误 (每一个存储过程,会生成一个对应的package)
db2 "select substr(PKGNAME,1,20), VALID, CREATE_TIME from syscat.packages where PKGSCHEMA='yourSchema'"
删除存储过程时,对应的记录也会被删除掉 !!!
db2 "drop procedure yourSchemaName.myProc2"
===
【DB2 存储过程 和 Package 之间有什么关系】
DB2存储过程和Package是DB2数据库中的两个不同的对象,但它们之间有一定的关系。
・存储过程是一组经过预编译和优化的SQL语句,可以重复调用,用于完成特定的任务。存储过程可以包含标准SQL语句和控制语句,以及一些特定于DB2的扩展语句。
・Package是一个编译单元,它包含预编译SQL语句的信息和执行计划。当存储过程被创建时,DB2会自动创建一个与该存储过程相关的Package,并将其存储在数据库中。当存储过程被调用时,DB2会自动检查相应的Package是否存在,如果存在,则执行相应的SQL语句。
・因此,可以说存储过程和Package之间存在一种依赖关系,存储过程需要Package的支持才能执行其中的SQL语句,而Package则是存储过程的一个重要组成部分。
【DB2 Package 的 VALID 是什么意思】
DB2 Package 的 VALID 表示该 Package 已经被验证过。在 DB2 中,Package 是一个编译好的 SQL 程序的二进制形式,它可以被多次执行,而不需要重新编译。在执行 Package 之前,DB2 会对其进行验证,以确保其语法正确、权限合法等方面的问题。如果 Package 通过验证,则可以被执行,否则将会报错。因此,Package 的 VALID 状态非常重要,它表示该 Package 已经可以被安全地执行。
【存储过程 VALID 的值是 N的原因】
存储过程的 VALID 值为 N 可能有以下原因:
・存储过程的语法错误或逻辑错误:如果存储过程中存在语法错误或逻辑错误,可能导致该存储过程无法被正确编译或执行,从而导致 VALID 值为 N。
===
・存储过程依赖的对象不存在或被修改:如果存储过程依赖的表、视图、函数等对象不存在或被修改,可能会导致存储过程无法被正确执行,从而导致 VALID 值为 N。
====
・存储过程权限不足:如果存储过程所在的用户没有执行该存储过程的权限,或者存储过程依赖的对象所在的用户没有被授予执行权限,也可能导致 VALID 值为 N。
====
・存储过程被禁用:如果存储过程被管理员或数据库管理系统禁用,可能会导致 VALID 值为 N。
===
・存储过程未被正确创建:如果存储过程未被正确创建,或者存储过程所在的数据库或表空间不存在,也可能导致 VALID 值为 N。
15.数据库进程
注意!!! 每个用户都有自己的进程
介绍一下 db2 相关的两个进程 db2fmcd 和 db2sysc
db2fmcd
和db2sysc
是与IBM Db2数据库相关的两个进程。
db2fmcd
:Db2 Fault Monitor进程。它是一个系统级的守护进程,负责监控Db2数据库引擎的运行状况。如果引擎意外关闭或发生故障,db2fmcd
会启动自愈功能,尝试恢复引擎的正常运行状态。它还负责收集运行状况和诊断数据,以供后续故障分析和调试。
db2sysc
:Db2系统服务进程。它是Db2数据库引擎的核心组成部分,负责处理来自客户端的请求,并执行数据库的各种操作。db2sysc
进程通常会有多个实例运行,每个实例对应一个Db2数据库。它提供了多线程、并发处理、数据缓存、日志管理等核心功能,以实现高性能的数据库操作。这两个进程在Db2数据库的运行过程中起到重要的作用:
db2fmcd
保证了数据库引擎的高可用性和自愈能力,能够自动尝试修复引擎出现的故障。db2sysc
处理来自客户端的请求,负责管理和操作数据库的各个方面,如查询、修改、事务管理等。需要注意的是,进程名称可能在不同版本和配置的Db2数据库中有所不同,上述介绍是基于一般情况下的命名约定和功能。详细的信息可以参考Db2文档。
db2除了进程 db2fmcd 和 db2sysc,还有什么其它的进程
除了
db2fmcd
和db2sysc
,IBM Db2数据库还有其他一些重要进程。以下是其中一些常见的进程:
db2acd
:Db2 Administration Server进程。该进程是一个守护进程,负责管理和监控Db2数据库实例的系统资源、配置和访问控制,以及处理来自db2fmd
的指令和事件。
db2agent
:Db2 Agent进程。每个客户端应用程序连接到Db2数据库时,都会有一个相应的db2agent
进程。它负责处理来自应用程序的请求,执行查询,管理事务,并与数据库实例进行通信。
db2gds
:Db2 Gateway进程。该进程是在数据库的分布式环境中使用的,连接远程数据库实例。它负责接收来自本地Db2实例的请求,并将这些请求发送到远程Db2实例,并将结果返回给本地实例。
db2ckpwd
:Db2 Check Password进程。该进程在进行用户身份验证时起作用。当用户尝试进行身份验证时,db2ckpwd
会将用户提供的密码与存储在Db2数据库中的密码进行比较,以验证用户的身份。
db2dad
:Db2 Data Sharing Advisor进程。该进程负责收集和分析数据库的统计信息,并根据这些信息提供性能优化和调优建议。
db2fmp
:Db2 Function Monitor Program进程。该进程用于加载和执行用户定义的SQL函数和存储过程。每个用户定义的函数都会有一个相应的db2fmp
进程来执行相关的逻辑。除了上述进程外,还有一些其他的Db2进程,用于不同的管理、监控和执行任务。具体的进程名称和功能可能会根据不同的Db2版本和配置而有所变化。
xxx
16.IBM 官方 DB2 帮助文档
1.事务隔离级别
11.1
Isolation levels - IBM Documentation
Regardless of the isolation level, the database manager places exclusive locks on every row that is inserted, updated, or deleted. Thus, all isolation levels ensure that any row that is changed by an application process during a unit of work is not changed by any other application process. The database manager releases the exclusive lock when the unit of work is complete.
The database manager supports four isolation levels.
11.5
Isolation levels - IBM Documentation
===
再度整理:
隔离级别 | 脏读 | 不可重复读 | 幻读 |
未提交读(Uncommitted Read) | 是 | 是 | 是 |
游标稳定性(Cursor Stability) | 否 | 是 | 是 |
读稳定性(Read Stability) | 否 | 否 | 是 |
可重复读(Repeatable Read) | 否 | 否 | 否 |
===
Stability 英 [stəˈbɪlɪtɪ] n. 稳定(性);坚定
・未提交读(Uncommitted Read):select不加任何锁,如果一行正在更新但未提交,内存里有两行的,一行是更新前的加了S锁,一行是更新后的加了X锁,未提交读直接读更新后的行。
这就是脏读,因为未提交的数据随时有可能回退,一旦回退,读取的数据肯定是无效的。=============================================
・游标稳定性(Cursor Stability):如果一行正在更新但未提交,它不会等待X行的S锁,直接读取更新前的行,读完了就释放了,这时候就出现不稳定读了,等同一事务下次再读的时候发现
同一行读出来的数据不一样了。游标稳定性隔离级别锁定在事务期间访问的任何行,而游标位于该行上。此锁将一直有效,直到读取下一行或事务结束。但是,如果行中的任何数据被更改,则锁定将保持,直到提交更改。
在此隔离级别下,当可更新游标位于该行上时,任何其他应用程序都无法更新或删除该行。在 CS 下,无法访问其他应用程序的未提交数据。但是,不可重复读取和幻像读取是可能的。
CS 是默认隔离级别。
==================================
・读稳定性(Read Stability) :如果一行正在更新但未提交,他会一直等待更新后行的S锁,这个时候就能保证读稳定性。但是不能避免出现幻读,幻读就是下一次再读的时候数据库
插入了新数据,读稳定性针对的是某一行数据但是,
由于with rs 一直等待事务提交,有可能造成事务死锁,并且等待时间过长时,出现如下错误:
[DB2NT]SQL0952N由于中断,处理被取消 SQLSTATE=57014 DB2被中断,报错: [DB2/NT] SQL0952N 由于中断,处理被取消 SQLSTATE=57014 在DB2的开发过程中
【注意!!!】虽然容易造成死锁,但是,有的时候我们在 select 时,必须使用with rs,比如,某一个表中存在一个「採番用の番号」,在数据库中,100xxxx1-100xxxxx,每次使用一个,并且有对应的是否使用flg,此时查询,就需要使用 with rs,等待上一个事务更新完了,取得其它事务完了后的数据。保证数据的最新化!!!
=======
・可重复读(Repeatable Read) : 可重复读是即解决了读稳定性也解决了幻读问题,直接在表上加IS锁,不能更新也不能插入。
===
db2 "select ..... with ur"
db2 "select ..... with cs" //默认的隔离级别,可以不写with cs
db2 "select ..... with rs"
db2 "select ..... with rr"
===
==
2.XXX
xxx
17.特殊处理
17.1.模拟INSERT FOR UPDATE
"INSERT FOR UPDATE"是一种非标准的SQL语法,不是所有数据库管理系统都直接支持该语法
・MySQL:MySQL的语法使用INSERT INTO ... ON DUPLICATE KEY UPDATE来实现类似的功能。它允许您在插入操作中指定唯一约束(如主键或唯一键),并在冲突时执行更新操作
・在DB2数据库中,没有直接支持"INSERT FOR UPDATE"的语法
====
MERGE INTO target_table AS T
USING (SELECT value1, value2 FROM source_table) AS S
ON (T.id = S.id)
WHEN MATCHED THEN
UPDATE SET T.value1 = S.value1, T.value2 = S.value2
WHEN NOT MATCHED THEN
INSERT (id, value1, value2) VALUES (S.id, S.value1, S.value2);
可以参照上面的 MERGE INTO 语法来实现想要的效果
想要的效果:如果存在ID是1001的数据,更新;不存在,插入
实现代码如下
MERGE INTO target_table AS T
USING (SELECT '1001' AS id from sysibm.sysdummy1) AS S
ON (T.id = S.id)
WHEN MATCHED THEN
UPDATE SET T.value1 = 'xxxxxAAA', T.value2 = 'xxxxxBBB'
WHEN NOT MATCHED THEN
INSERT (id, value1, value2) VALUES ('1001', 'xxxxxAAA', 'xxxxxBBB');
====
JPA执行
String sql = "MERGE INTO target_table AS T "
+ "USING (SELECT id, value1, value2 FROM source_table) AS S "
+ "ON (T.id = S.id) "
+ "WHEN MATCHED THEN "
+ " UPDATE SET T.value1 = S.value1, T.value2 = S.value2 "
+ "WHEN NOT MATCHED THEN "
+ " INSERT (id, value1, value2) VALUES (S.id, S.value1, S.value2)";
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
Query query = entityManager.createNativeQuery(sql);
query.executeUpdate();
entityManager.getTransaction().commit();
entityManager.close();
====
JPA的API
EntityManager (Java(TM) EE 7 Specification APIs)
====
18.更多命令操作
DB2常用命令总结_db2 list application show detail-优快云博客
查看DB2数据库:db2 list db directory
查看DB2数据库应用:db2 list applications
查看DB2数据库应用与进程号:db2 list applications show detail
杀掉进程: db2 force application (id)
查看DB2数据库配置:db2 get db cfg for DB_NAME
查看DB2归档日志路径:db2 get db cfg for DB_NAME|grep "LOGARCHMETH1"
查看首活动日志:db2 get db cfg for DB_NAME|grep -i "First active log file"
清理日志:db2 prune logfile prior to S0009392.LOG ##其中S0009392.LOG是首活动日志,此命令可以将当前首活动日志文件之前的归档日志文件全部删除
手工归档产生日志命令:db2 archive log for db DB_NAME
创建数据库:db2 create db DB_NAME
删除数据库:db2 drop database DB_NAME(如果不能删除,尝试断开激活的连接或重启db2)
断开数据库连接:db2 connect reset 或者 db2 terminate
连接数据库:db2 connect to DB_NAME 或 db2 connect to DB_NAME user USER_NAME using PASSWORD
列出系统表:db2 list tables for system
查询列出所有表:db2 list tables for all
查看特定用户表:db2 list tables for schema user
查看表结构:db2 describe table TB_NAME或者describe select * from schema.TB_NAME
生成所有对象的DDL:db2look -d DB_NAME -a -e -m -l -f -o bak.sql
复制一张表:db2 create table TB1 like TB2
查询表:db2 "select * from table tablename where ..."
查看正在执行的sql:db2 list application show detail |grep -i exe
看数据库表空间:db2pd -db DB_NAME -tablespace
查看死锁:db2 get snapshot for locks on DB_NAME 或者db2 "select agent_id,tabname,lock_mode from table(snap_get_lock('DB_NAME')) as ll"
查看错误代码信息:db2 ? 08003(SQLSTATE值) 可以获取sql错误含义
查看当前DB2的版本:db2 "select * from sysibm.sysversions"
查看DB2的TABLESPACE的状况:db2 "select * from sysibm.SYSTABLESPACES"
启动DB2数据库服务:db2start
激活数据库实例:db2 activate database DB_NAME
查看激活状态的数据库:db2 list active databases
查看失效数据库实例:db2 deactivate database DB_NAME
关闭DB2数据库服务:db2stop
查看DB2消耗资源多的SQL:db2top -d DB_NAME 其中db2top是连在一起的,查看消耗资源 按照提示按 l ,出现Application Handle,记录下资源消耗大的Application Handle(stat) 按 q 退出
测试SQL的执行性能:db2batch -d DB_NAME -f select_sql -r benchmark.txt -o p3其中select_sql 是要测试的语句
==
19.DB2数据类型
===
==
===
==
20.【坑】DB2字段名超过30位时。
可以正常创建表
・select * from XXXTab; 正常
・select XXX_XXX_XXXXXXXXXXXXXXXAAAAB_ABCD from XXXTab; 时报错【坑】
・使用JPA查询,根据ID生成SQL再次查询的SQL中, 字段只截取到30位 【超坑】
・使用 db2 DESCRIBE TABLE schema_name.table_name; 命令查看表结构时,得到的也只是前30位
・报错【DB2 SQLCODE=-206, SQLSTATE=42703 定义表字段问题】 字段不存在
==
21.我没有指定 order by,为什么一般是按照插入顺序取得的。
1. 物理存储顺序
在大多数数据库中,数据在物理存储上是按照插入顺序排列的(尤其是在堆表(heap table)中)。如果没有创建聚集索引(clustered index)或对表进行重组,数据库可能会按照物理存储顺序返回数据,这通常与插入顺序一致。
2. 默认行为
在没有 ORDER BY 的情况下,数据库不保证返回顺序,但通常默认会按照物理存储顺序返回数据。对于堆表(没有聚集索引的表),物理存储顺序通常与插入顺序一致,因此你可能会观察到数据似乎是按照插入顺序返回的。
3. 聚集索引的影响
如果表上有聚集索引(clustered index),数据会按照聚集索引的顺序存储和返回,而不是插入顺序。如果没有聚集索引,数据通常会按照插入顺序存储,因此返回顺序可能与插入顺序一致。
4. 优化器的默认选择
数据库优化器在没有 ORDER BY 的情况下,通常会选择成本最低的执行计划。对于小型表或未索引的表,优化器可能会选择全表扫描,此时返回顺序通常与物理存储顺序一致。5. DB2 的具体实现
在 DB2 中,如果没有 ORDER BY,默认返回顺序取决于表的存储结构和访问路径。对于堆表,数据通常是按照插入顺序存储的,因此返回顺序可能与插入顺序一致。
但如果表上有索引,优化器可能会选择使用索引访问数据,此时返回顺序可能不再与插入顺序一致。
总结
如果没有 ORDER BY,数据库通常会按照物理存储顺序返回数据,而物理存储顺序可能与插入顺序一致(尤其是对于堆表)。这种行为是默认现象,但不是官方保证的,返回顺序可能受到存储结构、索引、优化器等因素的影响。
22.如何查看DB2中的表,是否定义了聚集索引
==
聚集索引(Clustered Index) 是一种数据库索引类型,它决定了表中数据的物理存储顺序。每个表只能有一个聚集索引,因为数据行本身只能以单一的顺序存储。聚集索引的键值通常用于排序表的数据行,因此在查询时,聚集索引可以显著提高数据的检索效率,尤其是范围查询。
在 DB2 中查看表是否定义了聚集索引在 DB2 中,聚集索引称为“聚簇索引”(Clustering Index)。要查看某个表是否定义了聚簇索引,可以使用以下步骤:
使用系统目录表查询:
DB2 提供了系统目录表来存储数据库对象的元数据。可以通过查询这些表来获取关于索引的信息。
==
SELECT INDNAME, COLNAMES, CLUSTERRATIO --, CLUSTERED
FROM SYSCAT.INDEXES
WHERE TABSCHEMA = '你的SCHEMA名' AND TABNAME = '你的表名';
===
INDNAME
:索引名称。COLNAMES
:索引列的名称。CLUSTERRATIO
:聚簇比率,表示数据行按索引顺序存储的程度 不是聚集索引时,值为-1CLUSTERED
:指示该索引是否为聚簇索引。'Y'
表示是聚簇索引,'N'
表示不是。DB2中,没有这个项目
==
23.聚集索引 和 普通索引有什么区别
特性 | 聚集索引 | 普通索引 |
---|---|---|
数据存储顺序 | 决定数据的物理存储顺序 | 不影响数据的物理存储顺序 |
索引与数据的关系 | 索引的叶子节点存储数据行 | 索引的叶子节点存储指针 |
索引数量 | 每个表只能有一个 | 每个表可以有多个 |
范围查询性能 | 高效 | 较低 |
等值查询性能 | 高效 | 高效 |
插入/更新/删除性能 | 较慢 | 较快 |
存储空间 | 不需要额外空间 | 需要额外空间 |
选择聚集索引还是普通索引,取决于具体的查询需求和表的设计。通常,主键列适合作为聚集索引,而其他经常查询的列可以创建普通索引。
聚集索引(Clustered Index)与普通索引(Non-Clustered Index)的区别
聚集索引和普通索引是数据库中两种常见的索引类型,它们在存储方式、功能和性能上有显著的区别。以下是两者的主要区别:
1. 数据存储方式
聚集索引:
聚集索引决定了表中数据的物理存储顺序。
表的数据行按照聚集索引的键值排序存储。
每个表只能有一个聚集索引,因为数据行只能以单一的顺序存储。
普通索引:普通索引不会影响表中数据的物理存储顺序。
它只是一个独立的数据结构(通常是 B+ 树),存储索引键值和指向实际数据行的指针。
一个表可以有多个普通索引。
2. 索引与数据的关系
聚集索引:
聚集索引的叶子节点直接存储数据行。
聚集索引和数据行是紧密绑定的,索引本身就是数据的一部分。
普通索引:普通索引的叶子节点存储的是索引键值和指向数据行的指针(如行 ID 或聚集索引键)。
普通索引和数据行是分离的,索引只是一个辅助结构。
3. 性能
聚集索引:
对于范围查询(如 BETWEEN、>、< 等)效率较高,因为数据行是连续存储的。
对于主键查询效率非常高,因为数据行可以直接通过索引定位。
但插入、更新和删除操作可能较慢,因为需要维护数据的物理顺序。
普通索引:对于等值查询(如 WHERE column = value)效率较高。
对于范围查询效率较低,因为需要多次查找指针并访问数据行。
插入、更新和删除操作相对较快,因为不需要调整数据的物理顺序。
4. 索引数量
聚集索引:
每个表只能有一个聚集索引(因为数据行只能以单一的顺序存储)。
普通索引:每个表可以有多个普通索引。
5. 适用场景
聚集索引:
适合用于经常需要范围查询或排序的列,例如日期列、主键列。
适合用于查询中经常作为 WHERE 条件的列。
普通索引:适合用于经常需要等值查询的列,例如外键列。
适合用于查询中需要快速定位特定值的列。
6. 索引存储空间
聚集索引:
不需要额外的存储空间来存储数据行,因为索引和数据行是合一的。
普通索引:需要额外的存储空间来存储索引键值和指向数据行的指针。
====
24.runstats on table 作用
RUNSTATS ON TABLE my_schema.my_table WITH DISTRIBUTION AND DETAILED INDEXES ALL;
1. 作用
RUNSTATS 的主要作用是为 DB2 优化器提供表和索引的统计信息,以便优化器能够选择最优的查询执行计划。具体包括:
收集表的行数、页数、数据分布等信息。
收集索引的键值分布、深度、叶子页数等信息。
更新系统目录表(Catalog Tables)中的统计信息。
===
参数 | 说明 |
---|---|
ON TABLE schema.table_name | 指定要收集统计信息的表。 |
WITH DISTRIBUTION | 收集列的分布统计信息,适用于有高度倾斜数据的列。 |
AND DETAILED INDEXES ALL | 收集索引的详细统计信息,包括索引键的分布。 |
AND INDEXES ALL | 收集表上所有索引的统计信息。 |
AND INDEXES (index_name1, ...) | 收集指定索引的统计信息。 |
ALLOW WRITE ACCESS | 允许在运行 RUNSTATS 时对表进行写操作(默认)。 |
ALLOW READ ACCESS | 允许在运行 RUNSTATS 时对表进行只读操作。 |
SHRLEVEL REFERENCE | 使用表级锁,确保统计信息的准确性。 |
SHRLEVEL CHANGE | 使用行级锁,允许并发操作,但可能影响统计信息的准确性。 |
SET PROFILE ONLY | 仅更新统计信息配置文件,不实际收集统计信息。 |
===
25.REORG TABLE 作用
修改表后,使用下面命令
REORG TABLE yourSchema.YourTableName
reorg //DB2 // re-organization // 重组
===