收藏的一段oracle数据库中blob类型按指定编码转换为blob、clob、字符串类型的代码

blob和clob是oracle数据库中的两种大对象类型,这篇文章的代码主要是实现blob编码转换的问题,比如将ZHS16GBK类型的blob转为UTF8类型的blob,将ZHS16GBK类型的blob转为clob,将ZHS16GBK类型的blob转为字符串,等等。下面的功能实现核心代码是通过Java来写的,然后导入到了oracle数据库中,怎么在oracle数据库中调用Java source,可以参考博客中《oracle数据库中调用Java类开发存储过程、函数的方法》这篇文章。

1、编写Java代码,并导入到oracle数据库中

create or replace and compile java source named convertlobcs as
import java.lang.* ;
import java.io.*;
import java.sql.* ;
import oracle.jdbc.* ;
import oracle.sql.* ;
public class ConvertLOBCS {
    public static BLOB convertBlob
        ( BLOB inBlob, String sourcecs, String destcs ) 
        throws SQLException, IOException {
        Reader in = new InputStreamReader( 
           inBlob.getBinaryStream() , sourcecs ); 
        Connection conn = DriverManager.getConnection(
           "jdbc:default:connection:") ;
        BLOB outBlob = BLOB.createTemporary( conn, true , BLOB.DURATION_CALL) ;
        Writer out = new OutputStreamWriter( 
           outBlob.getBinaryOutputStream() , destcs ); 
        int c;
        while ((c = in.read()) != -1)
           out.write(c);
        out.close();
        in.close();
        return outBlob ;
    }
    public static CLOB convertClob
        ( BLOB inBlob, String sourcecs ) 
        throws SQLException, IOException {
        Reader in = new InputStreamReader( 
           inBlob.getBinaryStream() , sourcecs ); 
        Connection conn = DriverManager.getConnection(
           "jdbc:default:connection:") ;
        CLOB outClob = CLOB.createTemporary( conn, true , CLOB.DURATION_CALL) ;
        Writer out = outClob.getCharacterOutputStream() ;
        // Writer out = outClob.getAsciiOutputStream() ;
        int c;
        while ((c = in.read()) != -1)
           out.write(c);
        out.close();
        in.close();
        return outClob ;
    }
    public static String convertStr
        ( BLOB inBlob, String sourcecs ) 
        throws SQLException, IOException {
        Reader in = new InputStreamReader( 
           inBlob.getBinaryStream() , sourcecs ); 
        StringBuffer outStr = new StringBuffer() ;
        int i, c ;
        i = 0 ;
        while ( ( (c = in.read()) != -1 ) & i < 1000 ) {
           outStr.append((char)c);
           i++ ;
        }
        in.close();
        return outStr.toString() ;
    }
}

直接用PL/SQL Developer编译运行上面的这段代码即可。

2、用function封装Java代码

CREATE OR REPLACE FUNCTION convertblob(inblob   IN BLOB,
                                       sourcecs IN VARCHAR2,
                                       destcs   IN VARCHAR2) RETURN BLOB AS
  LANGUAGE JAVA NAME 'ConvertLOBCS.convertBlob( oracle.sql.BLOB, java.lang.String, java.lang.String) return oracle.sql.BLOB';
CREATE OR REPLACE FUNCTION convertclob(inblob IN BLOB, sourcecs IN VARCHAR2) RETURN VARCHAR2 AS
  LANGUAGE JAVA NAME 'ConvertLOBCS.convertClob( oracle.sql.BLOB, java.lang.String ) return oracle.sql.CLOB';
CREATE OR REPLACE FUNCTION convertstr(inblob IN BLOB, sourcecs IN VARCHAR2) RETURN VARCHAR2 AS
  LANGUAGE JAVA NAME 'ConvertLOBCS.convertStr( oracle.sql.BLOB, java.lang.String ) return java.lang.String';

这里就没有写在包中了,在实际应用的时候可以写在包中。

3、调用封装好的oracle function实现功能

下面是一个简易的示例代码:

DECLARE
  cv_dest_cs VARCHAR2(30) := 'ZHS16GBK';
  l_data     BLOB;
  p_src_cs   VARCHAR2(30) := 'UTF8';
BEGIN
  SELECT t.blobdata
    INTO l_data
    FROM t_test t
   WHERE t.id = 1
     FOR UPDATE;
  IF p_src_cs != cv_dest_cs THEN
    l_data := convertblob(l_data,
                          p_src_cs,
                          cv_dest_cs);
  END IF;
END;

上面代码实现了,当t.blobdata的编码不是ZHS16GBK的时候,假设原来编码是UTF8,那么就调用convertblob方法来实现编码转换。

本文标题:收藏的一段oracle数据库中blob类型按指定编码转换为blob、clob、字符串类型的代码

本文链接:http://yedward.net/?id=162

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

相关文章