当前位置: 首页 > news >正文

DB2—03(DB2中常见基础操作)

DB2—03(DB2中常见基础操作)

  • 1. 前言
    • 1.1 oracle和mysql相关
  • 2. db2中的"dual"
    • 2.1 SYSIBM.SYSDUMMY1
    • 2.2 使用VALUES
    • 2.3 SYSIBM.SYSDUMMY1 "变" dual
  • 3. db2中常用函数
    • 3.1 nvl()、value()、COALESCE()
    • 3.2 NULLIF() 函数
    • 3.3 LISTAGG() 与 xml2clob()、xmlagg()
  • 4. DB2中自定义函数
    • 4.1 简单入门函数
      • 4.1.1 语法结构
      • 4.1.2 例子
        • 4.1.2.1 例子1——求两数和
        • 4.1.2.2 例子2——自定义等差数列的n项和
    • 4.2 返回table的自定义函数
    • 4.3 自定义递归查询函数
  • 5. 解决 db2-表 处于暂挂状态

1. 前言

1.1 oracle和mysql相关

  • 部分语法和oracle、mysql都大同小异、关于oracle和mysql的可以看下面的文章:
    • Oracle 常用简单sql操作(insert into、merge into、start with connect by prior以及 regexp_substr等各种函数用法详解).
    • Oracle自定义函数、Oracle存储过程多种用法讲解以及动态创建表的存储过程.
    • Oracle中分割字符串的方法.
    • oracle递归查询(start with connect by prior)以及 树形统计connect_by_root(子节点汇总到父节点).
    • Oracle自定义函数实现递归查询(用自定义函数替换connect_by_root).
    • Mysql 创建存储过程和函数及各种例子

2. db2中的"dual"

2.1 SYSIBM.SYSDUMMY1

  • db2中没有这个表,在db2中类似dual表的是 SYSIBM.SYSDUMMY1,效果如下:
    SELECT 1+1 FROM SYSIBM.SYSDUMMY1;SELECT CURRENT DATE FROM SYSIBM.SYSDUMMY1;--查询当前日期
    
    在这里插入图片描述

2.2 使用VALUES

  • 如果嫌 SYSIBM.SYSDUMMY1 麻烦,可以使用 VALUES 命令获取结果,如下:
    VALUES (3+2);values length('abc');values CURRENT DATE;
    
    在这里插入图片描述
    在这里插入图片描述

2.3 SYSIBM.SYSDUMMY1 “变” dual

  • 如果你习惯了dual,那就为 SYSIBM.SYSDUMMY1 创建别名dual,如下:
    CREATE ALIAS dual FOR SYSIBM.SYSDUMMY1; --创建别名SELECT 5+7 FROM dual;
    
    在这里插入图片描述

3. db2中常用函数

3.1 nvl()、value()、COALESCE()

  • 先说一下nvl()
    • nvl(),语法如下:
      nvl(val1,val2)
      
    • 功能:
      如果val1为空(注意:这里的空是null,不算空字符串),则返回val2,否则返回val1本身,例子如下:
      SELECT nvl(null,0),nvl(234,0),nvl('','aa') FROM SYSIBM.SYSDUMMY1; 
      
      在这里插入图片描述
    • 注意:
      其表达式的值可以是数字型、字符型和日期型。但是表达式1和表达式2的数据类型必须为同一个类型
    • value()COALESCE() 用法同nvl()
  • 再说一下nvl2()
    SELECT nvl2(null,0,1),nvl2(234,0,1),nvl2('','不空','空') FROM SYSIBM.SYSDUMMY1; 
    
    在这里插入图片描述
  • 接着说一下 value()COALESCE()
    value()COALESCE() 就简单,因为用法同nvl(),给两个语句,自己下去测测看:
    SELECT value(null,0),value(56,0),value('','bb') FROM SYSIBM.SYSDUMMY1; SELECT COALESCE(null,0),COALESCE(56,0),COALESCE('','bb') FROM SYSIBM.SYSDUMMY1; 
    
    在这里插入图片描述
  • 最后选哪个,个人觉得还是用nvl()nvl2() 吧,除了熟悉之外还有就是以后换数据库的话也好移植。

3.2 NULLIF() 函数

  • 如果相同返回NULL,否则返回第一个参数,如下:
    在这里插入图片描述

3.3 LISTAGG() 与 xml2clob()、xmlagg()

  • 关于这三个函数的使用,如下:
    DB2中实现数据字段的拼接(LISTAGG() 与 xml2clob、xmlagg).

4. DB2中自定义函数

4.1 简单入门函数

4.1.1 语法结构

4.1.2 例子

4.1.2.1 例子1——求两数和
  • 代码如下(end后面不用结束符合):
    create or replace function fun_sum_number(num1 bigint,num2 bigint)
    returns bigint
    BEGINdeclare v_result bigint;SET v_result = num1 + num2;return v_result;
    END
    
  • 测试如下:
    values(fun_sum_number(1,5));
    
    在这里插入图片描述
4.1.2.2 例子2——自定义等差数列的n项和
  • 最小数、最大数以及步长确定的等差数列的n项和,实现代码如下:
    CREATE OR REPLACE FUNCTION fun_all_num_sum(start_num bigint, end_num bigint, step_num bigint)RETURNS bigintLANGUAGE SQLBEGINDECLARE loop_start bigint;DECLARE total_sum bigint;SET loop_start = start_num;SET total_sum = 0;WHILE loop_start <= end_num DOSET total_sum = total_sum + loop_start;--step_num 步长SET loop_start = loop_start + step_num;END WHILE;RETURN total_sum;END
    
  • 效果如下:
    SELECT fun_all_num_sum(1,3,1),fun_all_num_sum(1,4,1),fun_all_num_sum(2,8,2) FROM SYSIBM.SYSDUMMY1 ;
    
    在这里插入图片描述

4.2 返回table的自定义函数

  • 代码如下:
    CREATE OR REPLACE FUNCTION fun_query_dog_by_id(dogId varchar(10)) 
    RETURNS TABLE(DOG_ID varchar(10), dog_name varchar(10), dog_kind varchar(10)
    )
    RETURN
    SELECT DOG_ID, dog_name, dog_kind
    FROM dog
    WHERE dog.DOG_ID  = fun_query_dog_by_id.dogId;
    --或者直接 WHERE dog.DOG_ID  = dogId;
    --WHERE dog.DOG_ID  = dogId;
    
  • 测试如下:
    • 原表数据
      在这里插入图片描述
    • 使用函数查询
      SELECT * FROM table(fun_query_dog_by_id('A10001'));
      
    在这里插入图片描述

4.3 自定义递归查询函数

  • 先看原始数据结构
    在这里插入图片描述
  • 根据部门ID找公司ID,函数实现如下:
    CREATE OR REPLACE FUNCTION fun_get_company_id_by_dept_id(v_dept_id varchar(10))
    RETURNS varchar(10)
    LANGUAGE SQL
    BEGINDECLARE dept_level bigint;DECLARE loop_dept_id varchar(10);DECLARE result_company_id varchar(10);select t.DEPT_LEVEL into dept_level from sys_company_dept t where t.dept_id = v_dept_id;--如果本身就是公司,直接返回,如果是部门循环找上级直到找到公司IDSET loop_dept_id = v_dept_id;WHILE dept_level >= 2 DOSELECT t1.PARENT_ID ,t2.DEPT_LEVEL into loop_dept_id,dept_level FROM sys_company_dept t1LEFT JOIN sys_company_dept t2 ON t1.PARENT_ID  = t2.DEPT_ID where t1.dept_id = loop_dept_id;END WHILE;SET result_company_id = loop_dept_id;RETURN result_company_id;
    END
    
  • 效果如下:
    在这里插入图片描述
  • 递归查询部门及对应的公司列表,如下:
    SELECT temp.*,t2.DEPT_NAME AS company_name FROM (
    SELECT t1.*,fun_get_company_id_by_dept_id(t1.DEPT_ID) AS company_id FROM sys_company_dept t1
    )temp LEFT JOIN sys_company_dept t2 ON temp.company_id = t2.DEPT_ID 
    
    在这里插入图片描述

5. 解决 db2-表 处于暂挂状态

  • 有时当对表数据进行操作时,表锁了,处于暂挂状态,如果其他解决方法不能解决的话可以尝试用以下语句进行解锁,命令语句如下:
    call sysproc.admin_cmd('reorg table 表名')
    
http://www.lryc.cn/news/240592.html

相关文章:

  • 华为云cce健康检查有什么用?配置需要注意什么?
  • 微信小程序会议OA-登录获取手机号流程登录-小程序导入微信小程序SDK(从微信小程序和会议OA登录获取手机号到登录小程序导入微信小程序SDK)
  • 原来 TinyVue 组件库跨框架(Vue2、Vue3、React、Solid)是这样实现的?
  • 自定义label组件
  • 【Linux】使用Makefile自动化编译项目:简化开发流程、提高效率
  • 浅谈开源和闭源的认知
  • 你了解Postman 变量吗?
  • ArmSoM-RK3588编解码之mpp编码demo解析:mpi_enc_test
  • 【ES6.0】-详细模块化、export与Import详解
  • 网工内推 | Base北京,国企网工运维,最高30k*14薪,IE认证优先
  • SQL LIKE 运算符:用法、示例和通配符解释
  • 编译原理Lab1-用FLEX构造C-Minus-f词法分析器
  • 网络安全之渗透测试入门准备
  • 【MySQL】宝塔面板结合内网穿透实现公网远程访问
  • 通过AX6000路由器,实现外部访问内网的任意主机
  • 如何应用ChatGPT撰写、修改论文及工作报告,提供写作能力及优化工作??
  • camera-caps:Jetson设备上的一种实用的V4L2可视化界面
  • CAN基础知识
  • vue3跨域怎么解决?
  • 强化学习小笔记 —— 如何选择合适的更新步长
  • 容斥 C. Strange Function改编题
  • C++笔记
  • python-opencv 培训课程笔记(1)
  • 【C++初阶】STL详解(七)Stack与Queue的模拟实现
  • 校园报修抢修小程序系统开发 物业小区报修预约上门维修工单系统
  • 【Android】Hilt比Android好在哪里
  • 计算方法 期末总结
  • 【面试】jvm中堆是分配对象存储的唯一选择吗
  • 音视频同步笔记 - 以音频时间为基
  • JavaScript 原始数据类型和对应的对象类型(内置对象)之间的关系