ORACLE调用JAVA实现字符串分隔函数

问题描述

ORACLE数据库中没有字符分割函数,虽然可以利用数据库编程自己去实现,但是代码复杂并且效率堪忧。
ORACLE11G兼容了JAVA,并且内置了JDK1.5,很多时候在数据库中很难实现的操作,但是在JAVA中却直接有函数供你使用,那么,我们是否能将JAVA的.class文件映射成ORACLE的存储过程呢?答案是肯定可以的!

存储过程实现

  1. 创建并编译 JAVA SOURCE;
create or replace and compile java source named get_62191_attr as
import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import java.sql.Clob;
import java.sql.SQLException;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author v-yuzhenc
 */
public class Get_62191_attr{
    
    

  //获取指定因子对应的值中的某个字段的值,所有记录通过指定分隔符分开
  //有java中的转义字符,必须使用\\先转义
  public static String getattr1(String s,int idx, String rec_sep, String field_sep, String out_sep) {
    
    

    String res = "";
    try{
    
    
        if (s != ""){
    
    
            String[] records = s.split(rec_sep);
            for (int i = 0; i < records.length; i++) {
    
    
                String[] fields = records[i].split(field_sep);
                if (i == 0){
    
    
                    res = fields[idx-1];
                }else {
    
    
                    res = res + out_sep + fields[idx-1];
                }
            }
        }
    }catch (Exception e){
    
    
        res = "";
    }
    return res;
  }

  //获取指定因子对应的值中的某个字段的值,所有记录通过指定分隔符分开
  //有java中的转义字符,必须使用\\先转义
  public static String getattr1_clob(Clob c,int idx, String rec_sep, String field_sep, String out_sep) {
    
    

    String res = "";
    String s = "";
    try{
    
    
        s = ClobToString(c);
        if (s != ""){
    
    
            String[] records = s.split(rec_sep);
            for (int i = 0; i < records.length; i++) {
    
    
                String[] fields = records[i].split(field_sep);
                if (i == 0){
    
    
                    res = fields[idx-1];
                }else {
    
    
                    res = res + out_sep + fields[idx-1];
                }
            }
        }
    }catch (Exception e){
    
    
        res = "";
    }
    return res;
  }

  //获取某个串中所有因子id,通过指定分隔符分开
  /*
    s:字符串
    sep1:最外层分隔符  |
    sep2:因子与因子值之间的分隔符   :
    res_sep:以指定分隔符分隔输出所有因子id
  */
  //有java中的转义字符,必须使用\\先转义
  public static String getattr2(String s, String sep1, String sep2, String res_sep) {
    
    

    String res = "";
    try{
    
    
        if (s != ""){
    
    
            String[] attr = s.split(sep1);
            for (int i = 0; i < attr.length; i++) {
    
    
                String[] attr1 = attr[i].split(sep2);
                if (i == 0){
    
    
                    res = attr1[0];
                }else {
    
    
                    res = res + res_sep + attr1[0];
                }
            }
        }
    }catch (Exception e){
    
    
        res = "";
    }
    return res;
  }

  //获取某个串中所有因子id,通过指定分隔符分开
  /*
    s:字符串
    sep1:最外层分隔符  |
    sep2:因子与因子值之间的分隔符   :
    res_sep:以指定分隔符分隔输出所有因子id
  */
  //有java中的转义字符,必须使用\\先转义
  public static String getattr2_clob(Clob c, String sep1, String sep2, String res_sep) {
    
    

    String res = "";
    String s = "";
    try{
    
    
        s = ClobToString(c);
        if (s != ""){
    
    
            String[] attr = s.split(sep1);
            for (int i = 0; i < attr.length; i++) {
    
    
                String[] attr1 = attr[i].split(sep2);
                if (i == 0){
    
    
                    res = attr1[0];
                }else {
    
    
                    res = res + res_sep + attr1[0];
                }
            }
        }
    }catch (Exception e){
    
    
        res = "";
    }
    return res;
  }

  //获取某个串中所有因子id对应的因子值
  /*
    s:需要解析的字符串
    attr_id:因子id
    sep1:因子间分隔符
    sep2:因子与因子值之间分隔符
  */
  //有java中的转义字符,必须使用\\先转义
  public static String getattr3(String s, int attr_id, String sep1, String sep2) {
    
    

    String res = "";
    try{
    
    
        if (s != ""){
    
    
            String[] attr = s.split(sep1);
            for (int i = 0; i < attr.length; i++) {
    
    
                String[] attr1 = attr[i].split(sep2);
                if (attr_id == Integer.parseInt(attr1[0])){
    
    
                    res = attr1[1];
                } else {
    
    
                }
            }
        }
    }catch (Exception e){
    
    
        res = "";
    }
    return res;
  }

  //获取某个串中所有因子id对应的因子值
  /*
    s:需要解析的字符串
    attr_id:因子id
    sep1:因子间分隔符
    sep2:因子与因子值之间分隔符
  */
  //有java中的转义字符,必须使用\\先转义
  public static String getattr3_clob(Clob c, int attr_id, String sep1, String sep2) {
    
    

    String res = "";
    String s = "";
    try{
    
    
        s = ClobToString(c);
        if (s != ""){
    
    
            String[] attr = s.split(sep1);
            for (int i = 0; i < attr.length; i++) {
    
    
                String[] attr1 = attr[i].split(sep2);
                if (attr_id == Integer.parseInt(attr1[0])){
    
    
                    res = attr1[1];
                } else {
    
    
                }
            }
        }
    }catch (Exception e){
    
    
        res = "";
    }
    return res;
  }

  //获取字符串中指定分隔符分隔后的字符串个数
  public static int my_slip1(String s, String sep){
    
    
      int res = 0;
      try{
    
    
          if (s != ""){
    
    
              String[] attr_id = s.split(sep);
              res = attr_id.length;
          }
      }catch(Exception e){
    
    
          res = 0;
      }
      return res;
  }

  //获取字符串中指定分隔符分隔后的字符串个数
  public static int my_slip1_clob(Clob c, String sep){
    
    
      int res = 0;
      String s = "";
      try{
    
    
          s = ClobToString(c);
          if (s != ""){
    
    
              String[] attr_id = s.split(sep);
              res = attr_id.length;
          }
      }catch(Exception e){
    
    
          res = 0;
      }
      return res;
  }

  //获取字符串中指定分隔符分隔后第几个字符串
  public static String my_slip2(String s, String sep, int num){
    
    
      String res = "";
      try{
    
    
          if (s != ""){
    
    
              String[] attr_id = s.split(sep);
              res = attr_id[num-1];
          }
      }catch(Exception e){
    
    
          res = "";
      }
      return res;
  }

  //获取字符串中指定分隔符分隔后第几个字符串
  public static String my_slip2_clob(Clob c, String sep, int num){
    
    
      String res = "";
      String s = "";
      try{
    
    
          s = ClobToString(c);
          if (s != ""){
    
    
              String[] attr_id = s.split(sep);
              res = attr_id[num-1];
          }
      }catch(Exception e){
    
    
          res = "";
      }
      return res;
  }

    // Clob类型 转String
    public static String ClobToString(Clob clob) throws SQLException, IOException {
    
    
      String reString = "";
      Reader is = clob.getCharacterStream();// 得到流
      BufferedReader br = new BufferedReader(is);
      String s = br.readLine();
      StringBuffer sb = new StringBuffer();
      while (s != null) {
    
    // 执行循环将字符串全部取出付值给StringBuffer由StringBuffer转成STRING
        sb.append(s);
        s = br.readLine();
      }
      reString = sb.toString();
      if(br != null){
    
    
          br.close();
      }
      if(is != null){
    
    
          is.close();
      }
      return reString;
     }
}

  1. 创建存储过程指向对应的JAVA类(这里采用软件包的形式);
  2. 创建包头;
CREATE OR REPLACE PACKAGE pkg_62191_java IS

  --获取串中的因子值
  --分隔符若为java中的转义字符,需加上 \ 进行转义
  FUNCTION f_62191_getattr(
    str_string VARCHAR2,       --需要解析的因子串
    attr_id IN NUMBER,         --因子id
    str_sep IN VARCHAR2,       --多个因子串之间的分隔符
    str_sep_sub VARCHAR2       --因子与因子值之间的分隔符
  ) RETURN VARCHAR2;

  --获取串中的因子值
  --分隔符若为java中的转义字符,需加上 \ 进行转义
  FUNCTION f_62191_getattr_clob(
    str_string CLOB,       --需要解析的因子串
    attr_id IN NUMBER,         --因子id
    str_sep IN VARCHAR2,       --多个因子串之间的分隔符
    str_sep_sub VARCHAR2       --因子与因子值之间的分隔符
  ) RETURN VARCHAR2;

  --获取串中的字段值
  --分隔符若为java中的转义字符,需加上 \ 进行转义
  FUNCTION f_62191_getattr(
    str_string VARCHAR2,       --需要解析的串
    col_site NUMBER,           --字段的位置,第几个字段
    str_sep IN VARCHAR2,       --多条记录之间的分隔符
    str_sep_sub VARCHAR2,      --字段间的分隔符
    col_sep VARCHAR2           --输出的某个字段多条记录用什么分隔符分开
  ) RETURN VARCHAR2;           --返回以指定分隔的某字段的多个记录

  --获取串中的字段值
  --分隔符若为java中的转义字符,需加上 \ 进行转义
  FUNCTION f_62191_getattr_clob(
    str_string CLOB,       --需要解析的串
    col_site NUMBER,           --字段的位置,第几个字段
    str_sep IN VARCHAR2,       --多条记录之间的分隔符
    str_sep_sub VARCHAR2,      --字段间的分隔符
    col_sep VARCHAR2           --输出的某个字段多条记录用什么分隔符分开
  ) RETURN VARCHAR2;           --返回以指定分隔的某字段的多个记录

  --获取串中的多有因子
  --分隔符若为java中的转义字符,需加上 \ 进行转义
  FUNCTION f_62191_getattr(
    str_string VARCHAR2,          --需要解析的串
    str_sep VARCHAR2,         --最外层分隔符
    str_sep_sub VARCHAR2,     --因子与因子值之间的分隔符
    col_sep VARCHAR2          --以指定分隔符分隔输出所有因子id
  ) RETURN VARCHAR2;

  --获取串中的多有因子
  --分隔符若为java中的转义字符,需加上 \ 进行转义
  FUNCTION f_62191_getattr_clob(
    str_string CLOB,          --需要解析的串
    str_sep VARCHAR2,         --最外层分隔符
    str_sep_sub VARCHAR2,     --因子与因子值之间的分隔符
    col_sep VARCHAR2          --以指定分隔符分隔输出所有因子id
  ) RETURN VARCHAR2;

  --获取字符串中指定分隔符分隔后的字符串个数
  --特殊字符转义
  FUNCTION my_slip(
    str VARCHAR2,        --字符串
    str_sep VARCHAR2     --分隔符
  ) RETURN NUMBER;

  --获取字符串中指定分隔符分隔后的字符串个数
  --特殊字符转义
  FUNCTION my_slip_clob(
    str CLOB,        --字符串
    str_sep VARCHAR2     --分隔符
  ) RETURN NUMBER;

  --获取字符串中指定分隔符分隔后第几个字符串
  --特殊字符转义
  FUNCTION my_slip(
    str VARCHAR2,        --字符串
    str_sep VARCHAR2,    --分隔符
    num NUMBER           --返回字符数组中的第几个
  ) RETURN VARCHAR2;

  --获取字符串中指定分隔符分隔后第几个字符串
  --特殊字符转义
  FUNCTION my_slip_clob(
    str CLOB,        --字符串
    str_sep VARCHAR2,    --分隔符
    num NUMBER           --返回字符数组中的第几个
  ) RETURN VARCHAR2;

END pkg_62191_java;
/
  1. 创建包体;
CREATE OR REPLACE PACKAGE BODY pkg_62191_java IS

  --获取串中的因子值
  --分隔符若为java中的转义字符,需加上 \ 进行转义
  FUNCTION f_62191_getattr(
    str_string VARCHAR2,       --需要解析的因子串
    attr_id IN NUMBER,         --因子id
    str_sep IN VARCHAR2,       --多个因子串之间的分隔符
    str_sep_sub VARCHAR2       --因子与因子值之间的分隔符
  ) RETURN VARCHAR2
  AS
  LANGUAGE JAVA NAME
  'Get_62191_attr.getattr3(java.lang.String,int,java.lang.String,java.lang.String) return java.lang.String';

  --获取串中的因子值
  --分隔符若为java中的转义字符,需加上 \ 进行转义
  FUNCTION f_62191_getattr_clob(
    str_string CLOB,       --需要解析的因子串
    attr_id IN NUMBER,         --因子id
    str_sep IN VARCHAR2,       --多个因子串之间的分隔符
    str_sep_sub VARCHAR2       --因子与因子值之间的分隔符
  ) RETURN VARCHAR2
  AS
  LANGUAGE JAVA NAME
  'Get_62191_attr.getattr3_clob(java.sql.Clob,int,java.lang.String,java.lang.String) return java.lang.String';

  --获取串中的字段值
  --分隔符若为java中的转义字符,需加上 \ 进行转义
  FUNCTION f_62191_getattr(
    str_string VARCHAR2,       --需要解析的串
    col_site NUMBER,           --字段的位置,第几个字段
    str_sep IN VARCHAR2,       --多条记录之间的分隔符
    str_sep_sub VARCHAR2,      --字段间的分隔符
    col_sep VARCHAR2           --输出的某个字段多条记录用什么分隔符分开
  ) RETURN VARCHAR2           --返回以指定分隔的某字段的多个记录
  AS
  LANGUAGE JAVA NAME
  'Get_62191_attr.getattr1(java.lang.String,int,java.lang.String,java.lang.String,java.lang.String) return java.lang.String';

  --获取串中的字段值
  --分隔符若为java中的转义字符,需加上 \ 进行转义
  FUNCTION f_62191_getattr_clob(
    str_string CLOB,       --需要解析的串
    col_site NUMBER,           --字段的位置,第几个字段
    str_sep IN VARCHAR2,       --多条记录之间的分隔符
    str_sep_sub VARCHAR2,      --字段间的分隔符
    col_sep VARCHAR2           --输出的某个字段多条记录用什么分隔符分开
  ) RETURN VARCHAR2           --返回以指定分隔的某字段的多个记录
  AS
  LANGUAGE JAVA NAME
  'Get_62191_attr.getattr1_clob(java.sql.Clob,int,java.lang.String,java.lang.String,java.lang.String) return java.lang.String';

  --获取串中的多有因子
  --分隔符若为java中的转义字符,需加上 \ 进行转义
  FUNCTION f_62191_getattr(
    str_string VARCHAR2,          --需要解析的串
    str_sep VARCHAR2,         --最外层分隔符
    str_sep_sub VARCHAR2,     --因子与因子值之间的分隔符
    col_sep VARCHAR2          --以指定分隔符分隔输出所有因子id
  ) RETURN VARCHAR2
  AS
  LANGUAGE JAVA NAME
  'Get_62191_attr.getattr2(java.lang.String,java.lang.String,java.lang.String,java.lang.String) return java.lang.String';

  --获取串中的多有因子
  --分隔符若为java中的转义字符,需加上 \ 进行转义
  FUNCTION f_62191_getattr_clob(
    str_string CLOB,          --需要解析的串
    str_sep VARCHAR2,         --最外层分隔符
    str_sep_sub VARCHAR2,     --因子与因子值之间的分隔符
    col_sep VARCHAR2          --以指定分隔符分隔输出所有因子id
  ) RETURN VARCHAR2
  AS
  LANGUAGE JAVA NAME
  'Get_62191_attr.getattr2_clob(java.sql.Clob,java.lang.String,java.lang.String,java.lang.String) return java.lang.String';

  --获取字符串中指定分隔符分隔后的字符串个数
  --特殊字符转义
  FUNCTION my_slip(
    str VARCHAR2,        --字符串
    str_sep VARCHAR2     --分隔符
  ) RETURN NUMBER
  AS
  LANGUAGE JAVA NAME
  'Get_62191_attr.my_slip1(java.lang.String,java.lang.String) return int';

  --获取字符串中指定分隔符分隔后的字符串个数
  --特殊字符转义
  FUNCTION my_slip_clob(
    str CLOB,        --字符串
    str_sep VARCHAR2     --分隔符
  ) RETURN NUMBER
  AS
  LANGUAGE JAVA NAME
  'Get_62191_attr.my_slip1_clob(java.sql.Clob,java.lang.String) return int';

  --获取字符串中指定分隔符分隔后第几个字符串
  --特殊字符转义
  FUNCTION my_slip(
    str VARCHAR2,        --字符串
    str_sep VARCHAR2,    --分隔符
    num NUMBER           --返回字符数组中的第几个
  ) RETURN VARCHAR2
  AS
  LANGUAGE JAVA NAME
  'Get_62191_attr.my_slip2(java.lang.String,java.lang.String,int) return java.lang.String';

  --获取字符串中指定分隔符分隔后第几个字符串
  --特殊字符转义
  FUNCTION my_slip_clob(
    str CLOB,        --字符串
    str_sep VARCHAR2,    --分隔符
    num NUMBER           --返回字符数组中的第几个
  ) RETURN VARCHAR2
  AS
  LANGUAGE JAVA NAME
  'Get_62191_attr.my_slip2_clob(java.sql.Clob,java.lang.String,int) return java.lang.String';

END pkg_62191_java;
/

测试

这里只测试 pkg_62191_java.my_slip () 函数;

  1. 返回以 ; 分隔的第1个字符串;
SELECT pkg_62191_java.my_slip('12;34;56;78',';',1) FROM dual;

在这里插入图片描述

  1. 返回以 ; 分隔的第2个字符串;
SELECT pkg_62191_java.my_slip('12;34;56;78',';',2) FROM dual;

在这里插入图片描述

注: 在ORACLE的软件包中,函数和过程是可以重载的!

ORACLE与JAVA数据类型对应关系(很重要)

Java与Oracle 数据类型对应关系

猜你喜欢

转载自blog.csdn.net/qq_33445829/article/details/112471307
今日推荐