DB2V9.7实现Java自定义函数UDF

本文详细介绍了如何在DB2 V9.7中实现Java自定义函数UDF,包括编写Java代码、根据DB2的Java版本编译、放置class文件以及创建数据库函数的步骤。

张小竟2019年3月13日上午于北京记

1.Java代码编写,实现UDF类
import COM.ibm.db2.app.UDF;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class with_circle extends UDF {
    public static Connection conn=null;

    static {
        try {
            conn=getCon();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    /**
     * 入口
     * @param p_id
     * @return
     */
    public static String  cicle(String p_id){
        String sql =zz_sql(p_id);
        Long cn =getCount(sql);
        String str ="";
        if(cn!=null){
            str=String.valueOf(cn);
        }
        return str;
    }


    public static Connection getCon()  throws Exception{
        Class.forName("com.ibm.db2.jcc.DB2Driver").newInstance();
        String url = "jdbc:db2://188.96.86.72:50000/AUDIT";
        String user = "db2inst1";
        String password = "root";
        Connection conn = DriverManager.getConnection(url, user, password);
        return conn;
    }
    public static String zz_sql(String p_id){
        String sql ="with n(id) as " +
                " (select k.id  " +
                "    from AUDIT.k_di as k " +
                "   where " ;
        if(p_id==null||p_id.equalsIgnoreCase("null")){
            sql=sql+"      k.p_id  is null ";
        }else {
            sql =sql+"      k.p_id ='"+p_id+"' ";
        }
        sql =sql+
                "  UNION ALL " +
                "  select k.id " +
                "    from AUDIT.k_di as k, n " +
                "   where k.p_id = n.id) " +
                "select count(id) as cn from n";
        return sql;
    }

    public static Long getCount(String sql){
        try{
            Statement stms=conn.createStatement();
            ResultSet rs=stms.executeQuery(sql);
            while (rs.next()){
                long cn =rs.getLong("cn");
                return cn;
            }
            rs.close();
            stms.close();
            conn.close();
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    public static void main (String[]args){
        //Long cn =cicle("null");
        //System.out.println(cn);
    }
}
2.编译Java代码

A.编译的时候查看下db2自带的Java版本号
db2 get dbm cfg
Java Development Kit installation path (JDK_PATH) = /home/db2inst1/sqllib/java/jdk64
Cd /home/db2inst1/sqllib/java/jdk64
./java -version
B.本地UDF改成相应的Java版本号并且编译成class文件

3.放置class文件

A.编译好的class文件放置在/home/db2inst1/sqllib/function下并授予777权限
B.db2 force application all
C.Db2stop
D.Db2start

4.创建函数 (注意空格)
CREATE FUNCTION WITH_NEW(p_id VARCHAR(256)) 
RETURNS VARCHAR(256)
SPECIFIC WITH_NEW
EXTERNAL NAME 'with_circle!cicle(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值