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 
BEGIN declare  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  bigint LANGUAGE  SQL BEGIN DECLARE  loop_start bigint ; DECLARE  total_sum bigint ; SET  loop_start =  start_num; SET  total_sum =  0 ; WHILE  loop_start <=  end_num DO SET  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 
BEGIN DECLARE  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  DO SELECT  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.mzph.cn/news/161995.shtml 
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!