DB2常用命令、操作、SQLCode总结

目录

1.在服务器中,登录DB2用户,并连接DB

2.Local命令行启动,连接DB

3.查询各种一览(Table一览,Column一览)

・查看Schema中,表一览

・查了表中,Column一览

・查看表空间List

4.SQL

4.1.执行查询SQL

★★★tvf的含义★★★

4.2.创建表时,指定表空间

4.3.创建表空间

4.4. ★★★★★★常用SQL操作★★★★★★

5.存储过程创建・执行

・定義

・作成

・実行

・実行 (单独执行)

・查看 所有的 存储过程

・删除存储过程

6.其他操作 (普通操作)

6.0.导出数据

6.1.导入数据

6.2.常用SQL文

6.3.伪表  【sysibm.sysdummy1】 (从伪表中,查看当前时间)

6.4.左外连接

6.5.db2 date 数据类型 查询条件时 是否需要使用日期转换函数

6.6.xxx

6.7.xxx

7.其他知识点,其他操作 (调查时需要的操作)

7.1.DB2 用户

7.2.DB2 控制中心

7.3.查看DB编码信息

7.4.本地的exe执行程序的目录,cmd运行设置

7.5.本地(windows)要启动的服务

7.6.使用A5连接

7.7.查看 与 数据库  连接 的 进程、关闭进程、重新启动数据库

7.8.表空间:默认4K

7.9.db2检索,按照空格补齐原则进行检索的。

7.10.DB2创建临时表空间

7.11.支持 !=

7.12.创建数据库

7.13.创建表空间

7.14.创建表 (创建时,指定表空间)

7.15.创建 BufferPool

7.16.创建  Gupup

7.17.DB2 更改表名

7.18.查看数据库表的索引

7.19.查看表空间

7.20.【Data】与【TimeStamp】

7.21.AIX服务器 DB2 log 在什么位置

7.22.DB2 数据库 导出 整个数据库定义 的 ddl

7.23.备份数据

7.24.坑 null,<>null

7.25.删除表中所有数据

7.26.索引项目的值,可不可以重复

7.27.创建 唯一索引 与 非唯一索引的语句一样吗

7.28.xxx

7.29.xxx

8.查看数据库配置信息---Select SQL文 

8.1.查看Schema

8.2.查看所有的表

8.3.查看表中所有的字段

8.4.查看用户--拥有的---表的操作权限

8.5.查看表的索引

8.6.要查看 DB2 数据库中的索引【列】信息,你可以使用以下 SQL 查询

8.7.XXX

8.8.XXX

9.DB2命令参数

10.注意点

10.1.修改表结构时,修改之后,要执行下面的语句

10.2.XXX

10.3.XXX

10.4.XXX

11.★★★错误分析调查★★★

11.01.各种错误整理

11.02.查看表的状态,是否是【load pending】 // 表无法使用时,查看

11.03.常见错误(没有【REORG】造成【SQLCODE=-668】)

11.04.直接使用【REORG table schema.tableName】时报错

11.05.【权限问题】SQLCODE: -552, SQLSTATE: 42502

11.06.【权限问题】SQL1092N

11.07.SQLCODE=-803, SQLSTATE=23505

11.08.SQLSTATE=08001

11.09.★★★【22001】★★★SQLCODE=-302, SQLSTATE=22001  超长

11.10.★★★【23502】★★★10.SQLCODE: -407, SQLSTATE: 23502, SQLERRMC: TBSPACEID=2, TABLEID=640, COLNO=55   插入非空字段

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.15.SQLSTATE=57019

11.16.XXX

11.17.XXX

12.事务

12.1.事务隔离

12.2.查看未提交的事务

12.3.查看锁表信息

12.4.断掉连接

12.5.xxx

13.函数

13.1.NVL

13.2.字符串拼接 ||

13.3.trim

13.4.substr

13.5.length

13.6.case when

13.7.xxx

13.8.xxx

13.9.xxx

13.10.xxx

13.11.xxx

14.存储过程与Package

查看存储过程有无错误 (每一个存储过程,会生成一个对应的package)

【DB2 存储过程 和 Package 之间有什么关系】

【DB2 Package 的 VALID 是什么意思】

【存储过程 VALID 的值是 N的原因】

15.数据库进程

介绍一下 db2 相关的两个进程 db2fmcd 和 db2sysc

db2除了进程 db2fmcd 和 db2sysc,还有什么其它的进程

16.IBM 官方 DB2 帮助文档

1.事务隔离级别

2.XXX

17.特殊处理

17.1.模拟INSERT FOR UPDATE


==========

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

===

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)以及以竖线分隔每个字段的空白字符。这样可以使得结果更加紧凑,适合于导出数据或将结果传递给其他命令进行进一步处理。

===

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-CSDN博客

===

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的博客-CSDN博客

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.xxx

xxx

6.7.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的博客-CSDN博客

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 yourDB

territory  英 [ˈ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
);

---

  1. 清空表数据(Truncate Table): 这个方法会立即删除表中的所有数据,并释放表所占用的存储空间。语法中的IMMEDIATE关键字用于指示立即执行该操作。

     

    TRUNCATE TABLE tablename IMMEDIATE;

    使用TRUNCATE TABLE可以快速清空表数据,但要注意的是,这个操作不会激活触发器,并且不会记录在事务日志中,因此无法回滚。

  2. 分批删除数据(Delete in Batches): 这种方法通过循环分批次删除数据,每次删除一定数量的行,以避免一次性删除大量数据可能带来的性能问题。在每个批次中,会删除符合条件的一定数量的行,并提交事务,以确保删除操作的原子性和数据一致性。

     

    DELETE FROM ( SELECT * FROM tablename WHERE condition FETCH FIRST 5000 ROWS ONLY );

    这个语句会从表中选择满足条件的前5000行数据,并将其删除。通过循环调用这个语句,可以逐步删除表中的数据。需要注意的是,这个方法可能会引起数据库锁定和性能问题,特别是在大型表中操作时,因此需要谨慎使用。

根据你的需求和具体情况,选择合适的方法来删除表中的数据。

==

7.26.索引项目的值,可不可以重复

在数据库中,索引的值可以重复也可以不重复,这取决于索引的类型。主要有以下两种类型的索引:

  1. 唯一索引(Unique Index):唯一索引要求索引列中的值都是唯一的,即不允许重复值。当你尝试在唯一索引列中插入已经存在的值时,数据库会报错并拒绝操作。唯一索引通常用于确保数据完整性和避免重复数据。

  2. 非唯一索引(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.xxx

xxx

7.29.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的博客-CSDN博客

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"

xxx

解决

db2 list aplications

db2 "force application(XXXX)"

db2stoop

db2start

===

11.14.SQLCODE=-952, SQLSTATE=57014   

等待另外一个事务终了超时

-952的 处理被客户程序的取消请求中断
说明:客户端程序发出了取消请求,该请求终止了SQL语句的处理。

系统动作:SQL语句已终止,并且对该语句所做的任何更改都已撤消。如果SQL游标与中断的SQL语句相关联,则该游标将关闭。

解决方法 :修改SQL语句的执行时间
如果用到ibatis框架的话,修改SqlMapConfig.xml中的defaultStatementTimeout就可以了

xxx

11.15.SQLSTATE=57019

数据库服务没有启动成功。(电脑右下角的数据库图标上,有一个红色的方块。)

xxx

11.16.XXX

xxx

11.17.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.函数

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

db2fmcddb2sysc是与IBM Db2数据库相关的两个进程。

  • db2fmcd:Db2 Fault Monitor进程。它是一个系统级的守护进程,负责监控Db2数据库引擎的运行状况。如果引擎意外关闭或发生故障,db2fmcd会启动自愈功能,尝试恢复引擎的正常运行状态。它还负责收集运行状况和诊断数据,以供后续故障分析和调试。

  • db2sysc:Db2系统服务进程。它是Db2数据库引擎的核心组成部分,负责处理来自客户端的请求,并执行数据库的各种操作。db2sysc进程通常会有多个实例运行,每个实例对应一个Db2数据库。它提供了多线程、并发处理、数据缓存、日志管理等核心功能,以实现高性能的数据库操作。

这两个进程在Db2数据库的运行过程中起到重要的作用:

  • db2fmcd保证了数据库引擎的高可用性和自愈能力,能够自动尝试修复引擎出现的故障。
  • db2sysc处理来自客户端的请求,负责管理和操作数据库的各个方面,如查询、修改、事务管理等。

需要注意的是,进程名称可能在不同版本和配置的Db2数据库中有所不同,上述介绍是基于一般情况下的命名约定和功能。详细的信息可以参考Db2文档。

db2除了进程 db2fmcd 和 db2sysc,还有什么其它的进程

除了db2fmcddb2sysc,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)

====

  • 2
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值