DB2相关纪要

服务器操作指令

查看数据库全局变量 db2set
查看数据库版本(可以看得到数据库的安装位置) db2level
查看当前数据库管理实例 db2 get instance

踢出所有应用 db2 force application
删除数据库:db2 drop db crmdb
创建数据库:db2 create database crmdb on '/db2acrmdata1/acrmdb/crmusr' using codeset GBK territory CN PAGESIZE 32768
创建表空间 db2 create tablespace CRMUSR managed by database using /(/'/db2acrmdata1/acrmdb/crmusr/crmusrtablespace/'/)

连接数据库 db2 connect to crmdb user crmusr using crmusr
db2 connect to umsdb user umsusr using umsusr
断开(当前)所有数据库连接 db2 connect reset

列出所有的数据库 db2 list db directory
查看数据库节点列表 db2 list node directory
查看事务日志特性 db2 get db cfg for crmdb | grep log
查看表空间信息 db2pd -tablespaces -alldb
查看所有的表 db2 list tables for all

导出数据 db2move umsdb export

查看数据库表空间详情 db2 list tablespaces show detail(需连接数据库)

更改日志缓存大小 db2 update db cfg for crmdb using logretain off logprimary 160 logsecond 40 logfilsiz 25600(文件个数160,每个大小4k*25600=100M)

更改日志缓存位置 db2 update db cfg for crmdb using newlogpath '/db2acrmactlog/acrmdb'

创建外邦数据库

db2 catalog tcpip node NODE_UMS remote localhost server 60000
db2 create wrapper drda
db2 create server serv_ums type DB2/UDB version 9.7 wrapper "DRDA" authorization "umsusr" password "umsusr" options (NODE 'NODE_UMS',dbname 'umsdb')
db2 create user mapping for "NODE_UMS" server serv_ums options(remote_authid 'umsusr',remote_password 'umsusr')

赋予权限 db2 grant dbadm on database to user crmusr

SQL语句

1、locate("",字段);"含于字段中>0"
2、获取当前时间

SELECT CURRENT TIMESTAMP FROM SYSIBM.SYSDUMMY1;

3、日期转换

t.stat_date=date(to_char(to_date(t2.tbsdy,'yyyymmdd'),'yyyy-mm-dd'))

4、语句结构
①case when
CASE
WHEN 条件
THEN 语句
ELSE 语句
END
示例:

UPDATE
    CRMUSR.TLR_INFO
SET
    TLR_NAME=
    CASE
        WHEN TLR_NAME IS NULL
        OR  LENGTH(TLR_NAME)<2
        THEN '农'
        ELSE LEFT(TLR_NAME,LENGTH(TLR_NAME)-2)||'农'
    END,
    IDNUMBER=
    CASE
        WHEN IDNUMBER IS NULL
        OR  LENGTH(IDNUMBER)<6
        THEN '090200'
        ELSE LEFT(IDNUMBER,LENGTH(IDNUMBER)-6)||'090200'
    END,
    MOBILE=
    CASE
        WHEN MOBILE IS NULL
        OR  LENGTH(MOBILE)<4
        THEN '9629'
        ELSE LEFT(MOBILE,LENGTH(MOBILE)-4)||'9629'
    END,
    EXT4='';

②merge into

MERGE INTO A表
USING B表
ON A和B关联条件
WHEN MATCH THEN
执行语句(默认对A)
WHEN NOT MATCHED THEN
执行语句(默认对A)
示例:
--/
BEGIN
    MERGE INTO PDM_PCUST_COMM_INFO A
    USING PDM_PCUST_COMM_INFO_LD B
    ON A.CUST_CORE_NO = B.CUST_CORE_NO AND A.RI_TYPE = B.RI_TYPE AND A.RI_NO = B.RI_NO
    WHEN MATCHED THEN
    UPDATE SET
        A.PRIORITY = B.PRIORITY,
        A.RI_ATTR = B.RI_ATTR,
        A.RI_DATA = B.RI_DATA,
        A.RI_ZIP = B.RI_ZIP,
        A.RI_ADDR = B.RI_ADDR,
        A.INPUTER = B.INPUTER,
        A.INPUT_TM = B.INPUT_TM,
        A.IS_MSG_SIGN_NUM = B.IS_MSG_SIGN_NUM,
        A.IDU_FLAG = 'U',
        A.IDU_DATE = date('2018-08-15')
    WHEN NOT MATCHED THEN
    INSERT
        (   A.CUST_CORE_NO ,
            A.RI_TYPE ,
            A.RI_NO ,
            A.PRIORITY ,
            A.RI_ATTR ,
            A.RI_DATA ,
            A.RI_ZIP ,
            A.RI_ADDR ,
            A.INPUTER ,
            A.INPUT_TM ,
            A.IS_MSG_SIGN_NUM ,
            A.IDU_FLAG ,
            A.IDU_DATE
        )
        VALUES
        (
            B.CUST_CORE_NO ,
            B.RI_TYPE ,
            B.RI_NO ,
            B.PRIORITY ,
            B.RI_ATTR ,
            B.RI_DATA ,
            B.RI_ZIP ,
            B.RI_ADDR ,
            B.INPUTER ,
            B.INPUT_TM ,
            B.IS_MSG_SIGN_NUM ,
            'I',
            date('2018-08-15')
        );
    
    COMMIT;
END
/

5、添加表字段

ALTER TABLE CDM_PCUST_BUSI_INF ADD COLUMN STATS_DT DATE;
ALTER TABLE CDM_PCUST_BUSI_INF DROP COLUMN STATS_DT ;

6、查看表结构
select * from sysibm.columns where table_name='表名'(34列)
select * from sysibm.syscolumns where tbname='表名'(43列更全)
db2 describe table 表名(6列,只能在db2服务器上使用命令执行)
7、查看当前用户
SELECT CURRENT USER FROM SYSIBM.SYSDUMMY1;
8、存储过程输出
CALL DBMS_OUTPUT.PUT_LINE('content');
9、查看rownum
SELECT ROW_NUMBER() OVER() AS rownum,A.* FROM CRMUSR.T_CAMP_P_KPI_TARGET_SQL A
10、定义分号
VALUES CHR(39)
11、转换为浮点类型(如果字符串有非数字会报错)
VALUES DOUBLE(字符串或数字)
12、字符串截取''之前的字符串
CASE WHEN LOCATE('
',T.KPI_CD)=0 THEN T.KPI_CD WHEN LOCATE('',T.KPI_CD)>0 THEN LEFT(T.KPI_CD,LOCATE('',T.KPI_CD)-1) END
13、创建序列

CREATE SEQUENCE "CRMUSR"."SEQ_T_CAMP_P_KPI_SERI_INFO" AS BIGINT
    MINVALUE 1 MAXVALUE 9999
    START WITH 1 INCREMENT BY 1
    CACHE 20 CYCLE NO ORDER;

14、只取前n行数据
FETCH FIRST n ROW ONLY
15、临时表操作
--创建临时表

DECLARE GLOBAL TEMPORARY TABLE
SESSION.ORG_LIST
(
   BRCODE VARCHAR(30)
)
ON  COMMIT PRESERVE ROWS NOT LOGGED WITH REPLACE IN CRM_UTMP32K1;

--使用临时表

INSERT INTO SESSION.ORG_LIST VALUES ();

16、在存储过程中查找

select text,routinename from syscat.routines where text like '%T_CAMP_P_KPI_SERI_RESULT%'

17、服务器导入导出
导出:export to ******.del of del (select……) 【del定界ASCII文件,ASCII字符流】
导入:load from ******.del of del insert into (表名) nonrecoverable【表状态置为nonrecoverable,防止别的操作锁表】
18、DECIMAL格式注意
可怜的db2,oracle一个round可以解决的事,db2需要各种转换
19、获取字符串的最后4位
values substr('123456789',length('123456789')-3,4)
oracle可以直接使用substr('123456789',-4,4)
20、执行一段多个SQL(文件的形式)
①修改或建立存储过程
[H144037:crmusr:/home/crmusr]vi content.sql
[H144037:crmusr:/home/crmusr]db2 -td@ -vf content.sql
②修改或建立视图
db2 -tvf ./view/T_ACC_BOND_INFO.sql
21、创建副表,复制表结构
create table CDM_PCUST_DYN_INFZ like CDM_PCUST_DYN_INF
22、特殊字符串连接(配合日期)

SET STMT = 'LOAD FROM (SELECT * FROM CDM_CCUST_BUSI_INF where STATS_DT= DATE('''||WORK_DATE||''')-1 days) OF CURSOR INSERT INTO CRMUSR.CDM_CCUST_BUSI_INF_LD NONRECOVERABLE';
CALL SYSPROC.ADMIN_CMD(STMT);

23、判断是否为月末
获取下一天:values DAY(DATE('2018-09-10') +1 DAY);
IF DAY(时间 + 1 DAY) = 1 THEN
END IF;
24、拿到重复的数据
①表 expect distinct表 (去除表中的数据)
②group by having count(*)>1

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。