DB 2 V 9.7 Javaカスタム関数UDFを実現

14237 ワード

DB 2 V 9.7 Javaカスタム関数UDFを実現
  • 1.Javaコード作成、UDFクラス
  • を実現
  • .Javaコードのコンパイル
  • 3.classファイル
  • を配置する
  • 4.関数の作成(スペースに注意)
  • 張小意外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.コンパイル時にdb 2に付属のJavaバージョン番号db 2 get dbm cfg Java Development Kit installation path(JDK_PATH)=/home/db 2 inst 1/sqllib/java/jdk 64 Cd/home/db 2 inst 1/sqllib/java/jdk 64./java-version B.ローカルUDFを対応するJavaバージョン番号に変更してclassファイルにコンパイルする
    3.classファイルの配置
    A.コンパイルされたclassファイルは/home/db 2 inst 1/sqllib/functionの下に置かれ、777権限が付与されるB.db 2 forceアプリケーションall C.Db 2 stop D.Db 2 start
    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