DB2—03(DB2中常见基础操作)
DB2—03(DB2中常见基础操作)
- 1. 前言
-
- 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
2.2 使用VALUES
2.3 SYSIBM.SYSDUMMY1 “变” 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;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;
- 测试如下:
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;SET 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-表 处于暂挂状态
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/207562.html
如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!