DB2常见错误笔记
title: DB2。
·
文章目录
-
- 常用函数
-
-
- db2错误代码
-
-
- SQLCODE=-104, SQLSTATE=42601
- DB2 sqlcode:-117 sqlstate:42802
- SQLCODE=-119 , SQLSTATE=42803
- SQLCODE=-204, SQLSTATE=42704
- SQLCODE=-206, SQLSTATE=42703
- Error Code: -214, SQL State: 42822
- SQLCODE=-302, SQLSTATE=22001
- SQLCODE=-420, SQLSTATE=22018
- SQLCODE=-421, SQLSTATE=42826
- SQLCODE=-433, SQLSTATE=22001
- SQLCODE=-440, SQLSTATE=42884
- SQLCODE=-551, SQLSTATE=42501
- SQLCODE=-668, SQLSTATE=57016
- SQLCODE=-670, SQLSTATE=54010
- SQLCODE=-727, SQLSTATE=56098
- SQLCODE=-801, SQLSTATE=22012
- SQLCODE=-803,SQLSTATE=23505
- SQLCODE=-952, SQLSTATE=57014
- SQLCODE=-1015, SQLSTATE=55025
- 类型转换
-
- 索引
-
- 存储过程
-
- 游标
-
文章目录
- 常用函数
-
- db2错误代码
-
-
- SQLCODE=-104, SQLSTATE=42601
- DB2 sqlcode:-117 sqlstate:42802
- SQLCODE=-119 , SQLSTATE=42803
- SQLCODE=-204, SQLSTATE=42704
- SQLCODE=-206, SQLSTATE=42703
- Error Code: -214, SQL State: 42822
- SQLCODE=-302, SQLSTATE=22001
- SQLCODE=-420, SQLSTATE=22018
- SQLCODE=-421, SQLSTATE=42826
- SQLCODE=-433, SQLSTATE=22001
- SQLCODE=-440, SQLSTATE=42884
- SQLCODE=-551, SQLSTATE=42501
- SQLCODE=-668, SQLSTATE=57016
- SQLCODE=-670, SQLSTATE=54010
- SQLCODE=-727, SQLSTATE=56098
- SQLCODE=-801, SQLSTATE=22012
- SQLCODE=-803,SQLSTATE=23505
- SQLCODE=-952, SQLSTATE=57014
- SQLCODE=-1015, SQLSTATE=55025
-
- 类型转换
- 索引
- 存储过程
- 游标
title: DB2
注意:判空使用IS [NOT] NULL
1:不允许修改字段的名称(只能先删除,再添加)。
2:不允许减小字段的长度。
3:不允许修改字段类型(如把 Integer 修改成 varchar)。
4:如果必须修改上三条中的情况,只能重新建表(
update
- UPDATE 表名称 SET 字段 = ‘’ , 字段 = ‘’ WHERE 条件;
db2修改字段长度
alter table 表名 alter column 字段名 set data type varchar(7700)
添加字段
alter table 表名 add 字段名 类型(大小)
删除字段
alter table 表名 drop column 字段名;
依据表明查找表信息
SELECT TABSCHEMA,TABNAME,TBSPACE,OWNER FROM SYSCAT.TABLES WHERE TBSPACE='USERSPACE1' order by TABSCHEMA,TABNAME
常用函数
SUBSTR
substr(string,start,length)
SUBSTR(ST_NO ,1,1);从第一位开始,截取一位,没有下标0,从1开始
right
RIGHT(slabid,11)
从右边算,取多少位,不够则保持原本的数
有些数据库不存在此函数,可使用substr替代
RIGHT(slabid, 11) = SUBSTR(slabid, -11)
LENGTH
LENGTH(字段),返回长度
CASE WHEN THEN END
case 字段 when when后只能跟数值
case when 字段表达式 when后只能跟表达式
db2错误代码
SQLCODE=-104, SQLSTATE=42601
字符、标记或子句无效或丢失,sql语句不正确
DB2 sqlcode:-117 sqlstate:42802
待插入的数值的个数于被插入的行中的列数不相等
SQLCODE=-119 , SQLSTATE=42803
HAVING语句中的列的列表与GROUP BY语句中的列列表不匹配
字段与条件不匹配,查询是否条件少
SQLCODE=-204, SQLSTATE=42704
数据库中没有该Schema,或者没有该表
SQLCODE=-206, SQLSTATE=42703
1. 使用的表中是否存在【SQLERRMC=TASK_TYPE】引用的字段。
2. 确认是SQL中使用字段是写错误了,还是表中不存在相关字段。
Error Code: -214, SQL State: 42822
DISTINCT、ORDER BY 引起的无效表达式
SQLCODE=-302, SQLSTATE=22001
sql中要更新的某个字段的长度超过了数据库表中字段的定义长度。
SQLCODE=-420, SQLSTATE=22018
数据类型不匹配
SQLCODE=-421, SQLSTATE=42826
字符串自变量值不符合函数的要求
上次出现这种情况是:两个sql 使用联合去重查询(union),列没有对应上,一个两列一个三列
SQLCODE=-433, SQLSTATE=22001
数据长度超出预定长度
SQLCODE=-440, SQLSTATE=42884
应该是函数使用不正确,参数不对
SQLCODE=-551, SQLSTATE=42501
没权限:
用户试图对不拥有权限的特定的对象进行操作,或者表不存在
SQLCODE=-668, SQLSTATE=57016
SQLCODE=-668, SQLSTATE=57016, SQLERRMC=7
【表被暂挂,锁住,命令行中:reorg table tablename,
dbvisualizer客户端:CALL SYSPROC.ADMIN_CMD('REORG table schema.tableName ')】
【
SELECT * FROM TABLE (SNAP_GET_LOCK ('', -1)) AS T WHERE lock_object_type = 'TABLE_LOCK';
FORCE application (agent_id);
】
【碎片过多?】
【造成死锁,删表,重建 2021/02/25】
【删表,重建 2021/03/01】
SQLCODE=-670, SQLSTATE=54010
创建表时设置大的字段空间可以,修改就报此异常,不知道为什么
SQLCODE=-670, SQLSTATE=54010, SQLERRMC=8101;USERSPACE1, DRIVER=3.50.152 【表的长度太长,超过了一个页面所能容纳的数据量】
SQLCODE=-727, SQLSTATE=56098
操作的数据类型不对
SQLCODE=-801, SQLSTATE=22012
用零作除数是无效的
SQLCODE=-803,SQLSTATE=23505
主键冲突:主键重复或者为空
SQLCODE=-952, SQLSTATE=57014
-952的 处理被客户程序的取消请求中断
说明:客户端程序发出了取消请求,该请求终止了SQL语句的处理。
系统动作:SQL语句已终止,并且对该语句所做的任何更改都已撤消。如果SQL游标与中断的SQL语句相关联,则该游标将关闭。
解决方法 :修改SQL语句的执行时间
如果用到ibatis框架的话,修改SqlMapConfig.xml中的defaultStatementTimeout就可以了
SQLCODE=-1015, SQLSTATE=55025
数据库状态不一致,可能已停止,连接断开
类型转换
转为数字类型
FLOAT('1231')
DOUBLE('22')
INT()
BIGINT()
SMALLINT()
REAL()返回一个数值的单精度浮点数表示。
DEC[IMAL]() 返回一个数值、DECIMAL的字符串、INTEGER的字符串、FLOAT-POINT的字符串、日期、时间或时间戳的DECIMAL数值。
HEX()返回一个字符串的值的16进制表示。
FLOOR() 小于或等于参数的最大整数。
保留小数后几位
DEC(CAST(1 AS FLOAT)/3,10,6)
hive:
cast(column_name as decimal(10,2))
转换为字符串类型
CHAR(ARG)
VARCHAR(ARG,LENGTH) 长度可变
DIGITS() 返回SMALLINT、INTEGER、BIGIT或者DECIMAL参数的字符串值。
CHR函数返回由参数指定的ASCII码的字符,参数可以是INTEGER或SMALLINT。 SELECT CHR(167) FROM TEST
对比差异性结果
MINUS:将存在差异的数据select出来
SELECT Txn_Date FROM Store_Information
MINUS
SELECT Txn_Date FROM Internet_Sales;
索引
添加索引
create index 索引名字 on 表名 (字段,字段)
删除索引
drop index 索引名 on 表名;
查看索引
select * from sysibm.sysindexes where tbname = '表名';--表名要区分大小写
describe indexes for table 表名;
存储过程
查询存储过程语句
select * from syscat.PROCEDURES WHERE PROCNAME = 'P_PROC_APPEND'
DECLARE 声明一个变量
DECLARE 变量名 VARCHAR 作用域为批处理文件
游标:DECLARE CURSOR1 CURSOR WITH HOLD FOR CURSOR1_SQL;
变量1:DECLARE MAT_NO VARCHAR (20);
变量2:DECLARE MAT_SEQ_NO INTEGER;
DECLARE V_LOG_SCHEMA VARCHAR(32) DEFAULT 'BGTAMSSI00 ';
SET 变量名='1' set赋值
CALL 使用
call 表名.存储过程
PREPARE 预处理语句
# 定义预处理语句
PREPARE stmt_name FROM preparable_stmt;
# 执行预处理语句
EXECUTE stmt_name [USING @var_name [, @var_name] ...];
# 删除(释放)定义
{DEALLOCATE | DROP} PREPARE stmt_name;
EXECUTE IMMEDIATE 运行DDL语句
SET V_QUERY_STR = '
ALTER TABLE BGTAMSSI00.T_DWD_TMP_ZZQM_ALLO_TEMP
ADD COLUMN FCL_START_POS DECIMAL(16,4)
ADD COLUMN FCL_END_POS DECIMAL(16,4)
ADD COLUMN CUT_WIDTH DECIMAL(10,4)
ADD COLUMN IN_SRC_WT_1 DECIMAL(16,4)
ADD COLUMN IN_SRC_WT_2 DECIMAL(16,4)
ADD COLUMN IN_SRC_WT_3 DECIMAL(16,4)
ADD COLUMN FTYL DECIMAL(16,6)
ADD COLUMN CCL DECIMAL(16,6)
ADD COLUMN SDL DECIMAL(16,6)
';
EXECUTE IMMEDIATE V_QUERY_STR;
COMMIT;
GRANT EXECUTE ON PROCEDURE 表名.存储过程 TO USER
grant execute on procedure 表名.存储过程 to ‘dba’@'localhost’
GRANT EXECUTE ON PROCEDURE "BGTAMSSI00"."P_DWD_FACT_ZZQM_ALLO"( VARCHAR(10) ) TO USER "BGMOQ000" WITH GRANT OPTION;
IF THEN ELSE END IF;
IF ARG >1
THEN
SET TB_NAME='T_DWD_TMP_ZZQM_ALLO_TEMP23';
ELSE
SET TB_NAME='T_DWD_TMP_ZZQM_ALLO_TEMP';
END IF;
游标
游标一般格式
DECLARE 游标名称 CURSOR FOR SELECT 字段1,字段2,字段3,... FROM 表名 WHERE ...
OPEN 游标名称
FETCH NEXT FROM 游标名称 INTO 变量名1,变量名2,变量名3,...
WHILE @@FETCH_STATUS=0
BEGIN
SQL语句执行过程... ...
FETCH NEXT FROM 游标名称 INTO 变量名1,变量名2,变量名3,...
END
CLOSE 游标名称
DEALLOCATE 游标名称 (删除游标)
示例
table1结构如下
id int
name varchar(50)
declare @id int
declare @name varchar(50)
declare cursor1 cursor for --定义游标cursor1
select * from table1 --使用游标的对象(跟据需要填入select文)
open cursor1 --打开游标
fetch next from cursor1 into @id,@name --将游标向下移1行,获取的数据放入之前定义的变量@id,@name中
while @@fetch_status=0 --判断是否成功获取数据 进入循环
begin
update table1 set name=name+'1'
where id=@id --进行相应处理(跟据需要填入SQL文)
fetch next from cursor1 into @id,@name --将游标向下移1行 相当于for(int i;i<n;i++) 中的i+1
end
close cursor1 --关闭游标
deallocate cursor1
@@FETCH_STATUS =0 FETCH 语句成功
@@FETCH_STATUS =-1 FETCH 语句失败或此行不在结果集中
@@FETCH_STATUS =-2 被提取的行不存在
FETCH 游标 INTO 变量名
fetch 就是取值,into就是到哪里去。
fetch into 就是把游标里面的值取出,存入一個变量里面。
更多推荐
所有评论(0)