title: DB2


注意:判空使用IS [NOT] NULL

1:不允许修改字段的名称(只能先删除,再添加)。

2:不允许减小字段的长度。

3:不允许修改字段类型(如把 Integer 修改成 varchar)。

4:如果必须修改上三条中的情况,只能重新建表(

update

  1. 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
DISTINCTORDER 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() 返回SMALLINTINTEGER、BIGIT或者DECIMAL参数的字符串值。
	CHR函数返回由参数指定的ASCII码的字符,参数可以是INTEGERSMALLINTSELECT 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;
变量1DECLARE  MAT_NO   VARCHAR (20);
变量2DECLARE  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 就是把游标里面的值取出,存入一個变量里面。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐