问题描述
ORACLE数据库中没有字符分割函数,虽然可以利用数据库编程自己去实现,但是代码复杂并且效率堪忧。
ORACLE11G兼容了JAVA,并且内置了JDK1.5,很多时候在数据库中很难实现的操作,但是在JAVA中却直接有函数供你使用,那么,我们是否能将JAVA的.class文件映射成ORACLE的存储过程呢?答案是肯定可以的!
存储过程实现
- 创建并编译 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;
}
}
- 创建存储过程指向对应的JAVA类(这里采用软件包的形式);
- 创建包头;
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;
/
- 创建包体;
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个字符串;
SELECT pkg_62191_java.my_slip('12;34;56;78',';',1) FROM dual;
- 返回以 ; 分隔的第2个字符串;
SELECT pkg_62191_java.my_slip('12;34;56;78',';',2) FROM dual;
注: 在ORACLE的软件包中,函数和过程是可以重载的!