`
ldzyz007
  • 浏览: 717283 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

DB2 FUNCTION【DB2中增加自定义函数】

 
阅读更多
1.SQL语句:直接利用SQL语句创建DB2函数

SET SCHEMA DB2INFO;

SET CURRENT PATH = "SYSIBM","SYSFUN","SYSPROC","DB2INFO";

CREATE FUNCTION "DB2INFO"."CONVERTYMD"
("SSRC" VARCHAR(30),
  "SMOD" VARCHAR(30),
  "ICYCLE" INTEGER,
  "STYPE" VARCHAR(2)
)
  RETURNS VARCHAR(30)
  SPECIFIC "DB2INFO"."SQL100205164226500"
  LANGUAGE SQL
  NOT DETERMINISTIC
  READS SQL DATA
  STATIC DISPATCH
  CALLED ON NULL INPUT
  EXTERNAL ACTION
  INHERIT SPECIAL REGISTERS
  BEGIN ATOMIC
    DECLARE i_pos INTEGER;
    DECLARE s_res VARCHAR(30);
    DECLARE s_mods VARCHAR(30);
    DECLARE s_date VARCHAR(30);
    DECLARE S_DAY VARCHAR(2);
    DECLARE S_LAST_DAY VARCHAR(2);
    DECLARE S_YYYYMM VARCHAR(30);
    SET S_RES = UCASE(RTRIM(SSRC));
    SET S_MODS = UCASE(RTRIM(SMOD));
    SET I_POS = LOCATE(S_MODS,S_RES);
    IF I_POS=0 THEN
      RETURN 'NULL';
    END IF;
    IF UCASE(RTRIM(STYPE))='W' THEN
      SET S_DATE = RTRIM(CHAR(CURRENT DATE - (ICYCLE*7) DAYS,ISO));
      RETURN REPLACE(S_RES,S_MODS,SUBSTR(S_DATE,1,LENGTH(S_MODS)));
    END IF;
    IF UCASE(RTRIM(STYPE))='D' THEN
      SET S_DATE = RTRIM(CHAR(CURRENT DATE - ICYCLE DAYS,ISO));
      RETURN REPLACE(S_RES,S_MODS,SUBSTR(S_DATE,1,LENGTH(S_MODS)));
    END IF;
    IF(UCASE(RTRIM(STYPE))='H') THEN
      SET S_DATE = RTRIM(CHAR(date(CURRENT TIMESTAMP - ICYCLE HOURS),ISO))||
        ' '|| RTRIM(CHAR(time(CURRENT TIMESTAMP - ICYCLE HOURS)));
      RETURN REPLACE(S_RES,S_MODS,SUBSTR(S_DATE,1,LENGTH(S_MODS)));
    END IF;
    IF UCASE(RTRIM(STYPE))='M' THEN
      SET S_DAY = RTRIM(SUBSTR(S_RES,LENGTH(S_MODS)+2,2));
      SET S_LAST_DAY = RTRIM(CHAR(DAY(CURRENT DATE - (ICYCLE-1) MONTHS -DAY(
        CURRENT DATE -(ICYCLE-1) MONTHS) days)));
      SET S_YYYYMM = SUBSTR(RTRIM(CHAR(CURRENT DATE - ICYCLE MONTHS,ISO)),1,
        LENGTH (S_MODS));
      IF int(S_DAY)>int(S_LAST_DAY) THEN
        SET S_RES = REPLACE(S_RES,S_DAY,S_LAST_DAY);
      END IF;
      RETURN REPLACE(S_RES,S_MODS,S_YYYYMM);
    END IF;
    RETURN 'NULL';
  END;

使用方法:select convertymd(20100617) from sysibm.sysdummy1;
******************************************************************************************************
2.C语言
2.1:在UNIX下编写C程序然后编译成可执行文件 application_id,chmod 文件权限后在执行第二步,可执行文件放在/home/db2inst1/sqllib/function/ DB2的安装目录
2.2:创建DB2函数
CREATE FUNCTION "DB2INFO"."APPLICATION_ID" ( )
  RETURNS VARCHAR(128)
  SPECIFIC "DB2INFO"."APPLID"
  EXTERNAL NAME 'application_id!getApplicationId'
  LANGUAGE C
  PARAMETER STYLE SQL
  DETERMINISTIC
  NOT FENCED
  THREADSAFE
  CALLED ON NULL INPUT
  NO SQL
  NO EXTERNAL ACTION
  NO SCRATCHPAD
  NO FINAL CALL
  ALLOW PARALLEL
  DBINFO
  STATIC DISPATCH
  INHERIT SPECIAL REGISTERS;
******************************************************************************************************
3.Java类 【跨平台WINDOWS/UNIX/LINUX】
3.1:编写java类程序然后编译成可执行文件UserFunction.class*,chmod 文件权限后在执行第二步,JAVA类文件放在/home/db2inst1/sqllib/function/ DB2的安装目录
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import COM.ibm.db2.app.*;
/**
* DB2用户自定义函数java实现
*
* @author jason.cheng
*/
public class UserFunction extends UDF {
       
        private static String NULL_VALUE = null;
       
        public static String dateToFormat(String data){
                return patternDate(data);
        }
       
        public static String getReplace(String data){
                return patternReplace(data);
        }
       
        public static String patternDate(String data) {

                String[] pattern_YYYYMMDD = {
                                "(2//d{3}(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))",
                                "YYYYMMDD" };
                String[] pattern_YYYYMM = { "((2//d{3}(0[1-9]|1[0-2])))", "YYYYMM" };
                String[] pattern_YYYY = { "(2//d{3})", "YYYY" };
                String[] pattern_MMDD = {
                                "(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8])))",
                                "MMDD" };
                String[] pattern_DD = { "((0|1|2)[0-9]|3[0-1])$", "DD" };

                Pattern YYYYMMDD = Pattern
                                .compile("(([^0-9]|^)2//d{3}(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))((?=[^0-9])|$)");
                Pattern YYYYMM = Pattern
                                .compile("(([^0-9]|^)(2//d{3}(0[1-9]|1[0-2])))((?=[^0-9])|$)");
                Pattern YYYY = Pattern.compile("([^0-9]|^)(2//d{3})((?=[^0-9])|$)");
                Pattern MMDD = Pattern
                                .compile("([^0-9]|^)(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8])))((?=[^0-9])|$)");
                Pattern DD = Pattern.compile("(_(0|1|2)[0-9]|3[0-1])$");

               
                if (YYYYMMDD.matcher(data).find())
                        return replace(data, pattern_YYYYMMDD);
                else if(YYYYMM.matcher(data).find())
                        return replace(data,pattern_YYYYMM);
                else if(YYYY.matcher(data).find())
                        return replace(data,pattern_YYYY);
                else if(MMDD.matcher(data).find())
                        return replace(data, pattern_MMDD);
                else if(DD.matcher(data).find())
                        return replace(data, pattern_DD);
                else{
                        return data;
                }
        }
       
       
        public static String patternReplace(String data) {

                String[] pattern_YYYYMMDD = {
                                "(2//d{3}(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))",
                                "YYYYMMDD" };
                String[] pattern_YYYYMM = { "((2//d{3}(0[1-9]|1[0-2])))", "YYYYMM" };
                String[] pattern_YYYY = { "(2//d{3})", "YYYY" };
                String[] pattern_MMDD = {
                                "(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8])))",
                                "MMDD" };
                String[] pattern_DD = { "((0|1|2)[0-9]|3[0-1])$", "DD" };

                Pattern YYYYMMDD = Pattern
                                .compile("(([^0-9]|^)2//d{3}(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))((?=[^0-9])|$)");
                Pattern YYYYMM = Pattern
                                .compile("(([^0-9]|^)(2//d{3}(0[1-9]|1[0-2])))((?=[^0-9])|$)");
                Pattern YYYY = Pattern.compile("([^0-9]|^)(2//d{3})((?=[^0-9])|$)");
                Pattern MMDD = Pattern
                                .compile("([^0-9]|^)(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8])))((?=[^0-9])|$)");
                Pattern DD = Pattern.compile("(_(0|1|2)[0-9]|3[0-1])$");

               
                if (YYYYMMDD.matcher(data).find())
                        return replaceStr(data, pattern_YYYYMMDD);
                else if(YYYYMM.matcher(data).find())
                        return replaceStr(data,pattern_YYYYMM);
                else if(YYYY.matcher(data).find())
                        return replaceStr(data,pattern_YYYY);
                else if(MMDD.matcher(data).find())
                        return replaceStr(data, pattern_MMDD);
                else if(DD.matcher(data).find())
                        return replaceStr(data, pattern_DD);
                else{
                        return "";
                }
        }


        public static void main(String[] args) {
               
                //sql语句中的使用
                //select dateToFormat(source),getReplace(source) from meta;
                String str = "DB2APP.SDH_AREA_INFO_BASIC_2009";
                System.out.println(dateToFormat(str));
                System.out.println(getReplace(str));
        }
       
        public static String replaceStr(final String sourceString, String[] result) {
                Pattern pattern = Pattern.compile(result[0]);
                Matcher matcher = pattern.matcher(sourceString);
                String temp = NULL_VALUE;
                if(matcher.find()){
                        temp = sourceString.substring(matcher.start(), matcher.end());
                }
                return temp;
        }

        public static String replace(final String sourceString, String[] result) {
                Pattern pattern = Pattern.compile(result[0]);
                Matcher matcher = pattern.matcher(sourceString);
                String temp = matcher.replaceAll(result[1]);
               
                return temp;
        }
}

3.2:创建DB2函数,创建函数的时候可以根据JAVA类中提供的方法进行多个函数的创建

CREATE FUNCTION "DB2INFO"."CONVERTYMDEX"
("DATASTR" VARCHAR(256)
)
  RETURNS VARCHAR(256)
  SPECIFIC "DB2INFO"."CONVERTYMDEX"
  EXTERNAL NAME 'UserFunction!dateToFormat(Ljava/lang/String;)Ljava/lang/String;'
  LANGUAGE JAVA
  PARAMETER STYLE JAVA
  NOT DETERMINISTIC
  FENCED
  THREADSAFE
  RETURNS NULL ON NULL INPUT
  NO SQL
  EXTERNAL ACTION
  NO SCRATCHPAD
  NO FINAL CALL
  ALLOW PARALLEL
  NO DBINFO
  STATIC DISPATCH
  INHERIT SPECIAL REGISTERS;
******************************************************************************************************
总结:
  1.c/C++,Java提供了更为灵活的语法,可以替代SQL不能完成的工作
  2.Java提供的函数执行效率和SQL函数对比,前者执行效率更高
  3.系统环境需要支持JAVA类,尤其是在LINUX/UNIX下
  4.c/C++,Java自定义函数需要DB2 INST1数据库管理员权限去创建,创建后给不同的数据库用户进行赋权操作
******************************************************************************************************
分享到:
评论

相关推荐

    db2调自定义函数(小例)

    DB2的用户自定义函数功能极大地扩展了SQL查询的能力,允许开发者将复杂的业务逻辑封装到自定义函数中,从而提高数据库应用程序的性能和灵活性。通过遵循上述步骤,你可以轻松地在DB2中创建和调用自定义函数,为你的...

    db2中自定义函数文档

    在DB2数据库管理系统中,自定义函数允许用户根据特定需求扩展SQL语言的功能。这些函数可以是标量函数、行函数或表函数,分别用于返回单一值、多列数据集(行)或整个结果集(表)。本文将深入探讨如何在DB2中创建...

    db2 function 和 procedure

    根据参数数量和返回类型,DB2函数可以分为标量函数(Scalar Function)、聚合函数(Aggregate Function)和窗口函数(Window Function)。 2. **创建函数**:使用`CREATE FUNCTION`语句来定义一个新的函数。例如,...

    db2创建加密function.zip---废弃

    在`function新建过程.TXT`中,可能详细描述了在DB2中创建加密函数的过程。这个过程通常包括以下步骤: 1. 定义函数结构:声明函数的输入参数,如待加密的数据和密钥,以及返回值类型。 2. 编写SQL或PL/SQL代码:这...

    自定义函数实例

    为了使C语言编写的自定义函数能够在DB2中使用,还需要在数据库中创建一个相应的外部函数。这通常涉及到创建一个与C函数对应的SQL函数声明,指定函数的输入输出参数、返回类型以及C函数的位置等信息。 #### 结论 ...

    db2创建加密function.zip

    这里我们讨论的"db2创建加密function"指的是在DB2中定义一个可以对数据进行加密和解密的自定义函数,通常涉及编程语言如Java的集成以及SQL过程语言(PL/SQL)的使用。 首先,`EncryAES.java`可能是一个实现AES...

    db2 创建正则表达式函数

    本文将深入探讨如何在不支持正则表达式的DB2版本中创建和使用自定义正则表达式函数。 首先,我们需要了解正则表达式的基础知识。正则表达式是由特殊字符和普通字符组成的模式,用于匹配字符串。例如,`\d+`匹配一个...

    DB2 日常维护汇总

    * \SQLLIB\FUNCTION:默认的用户自定义函数目录 * \SQLLIB\FUNCTION\UNFENCED:默认的非隔离用户自定义函授目录 * \SQLLIB\HELP:联机帮助文件 * \SQLLIB\JAVADB2:所需的 JAVA 类库 * \SQLLIB\MISC:包含 HTML 搜索...

    DB2中REVERSE函数的实现方法

    在数据库管理领域,DB2是一个强大的关系型数据库管理系统,它提供了丰富的函数和操作来处理数据。在本话题中,我们将探讨...在DB2中,如果需要使用`REVERSE`函数,记得自定义一个,因为它是DB2标准库中未包含的功能。

    How to easily create DB2 user function by DB Query Analyzer 6.03

    2. 使用工具的SQL编辑器编写定义用户函数的SQL语句,通常会涉及`CREATE FUNCTION`关键字,指定函数名、参数列表、返回类型以及函数体。 3. 在函数体内部,使用SQL语句实现所需的功能逻辑。 4. 在SQL语句之间使用逗号...

    自定义函数-根据相同的key合并值

    对于数据库管理,比如在DB2中,自定义函数可能涉及到SQL的用户定义函数(UDF)。DB2支持多种类型的UDF,包括标量UDF(返回单个值)、表UDF(返回多行结果集)和聚合UDF(如SUM、AVG等)。如果需要根据相同键合并值,...

    db2语法大全

    DB2 语法大全 - CREATE FUNCTION 语句详解 ...CREATE FUNCTION 语句是 DB2 中定义函数的基本语句,通过该语句可以创建标量函数、行函数和表函数,并指定函数的参数、返回类型、函数体和与数据库的交互方式。

    ORACLE转DB2对照全解

    集合是用于存储多个元素的数据结构,常用于存储过程和函数中。 ##### 4.1 批量集合 **Oracle:** ```sql TYPE t1 IS TABLE OF NUMBER INDEX BY PLS_INTEGER; t1_tab t1; ``` **DB2:** ```sql DECLARE t1_tab ...

    DB2数据库常用命令手册

    - 函数文件通常位于`C:\sqllib\function`目录下。 #### 九、优化表结构 **命令:** - `db2 reorg table <table_name>`:对表进行重新组织。 - `db2 runstats on table <table_name> with distribution and indexes ...

    DB2-date-function.rar_db2 date functi

    在DB2中,处理日期和时间是常见的操作,这通常涉及到日期函数的使用。本资料"DB2日期函数"集中总结了DB2在处理日期和时间上的经验和转换语法,对于理解和运用这些函数具有很高的参考价值。 在DB2中,日期和时间函数...

    db2傻瓜疑问1000例

    - `db2admin create`:在Windows或OS/2系统中创建DB2实例。 - `db2admin drop`:在Windows或OS/2系统中删除DB2实例。 - `db2get admincfg`:显示DB2管理员配置信息。 - `db2update admincfg`:更新DB2管理员配置信息...

    db2创建用户以及授予权限1

    - `CREATE_NOT_FENCED`: 允许用户创建未围栏(user-defined function)的函数。 - `IMPLICIT_SCHEMA`: 允许用户在没有显式使用`CREATE SCHEMA`的情况下创建模式。 - `LOAD`: 允许用户将数据加载到表中。 - `...

Global site tag (gtag.js) - Google Analytics