Clob字段的处理

本文介绍了Clob字段的三种转换方法,包括使用Clob对象的getSubString方法、字节流读取及字符流读取。此外还提供了将字符串转换为Clob对象的示例代码,并详细解释了如何在数据库中插入Clob类型的字段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Clob字段的处理

Clob转换为String

Clob转换为String的三种方法:

  1. 使用Clob对象的getSubString(long , int)方法
  2. 使用字节流读取
  3. 使用字符流读取

代码如下:

            Clob clob = resultSet.getClob(1);

            //第一种转换方法 使用Clob的getSubString(long , int)方法
            if(clob!= null){
                String clobString = clob.getSubString(1L,(int)clob.length());
                System.out.println(clobString);
            }

            //第二种转换方法,使用字节流读取
            if(clob!= null){
                InputStream input = clob.getAsciiStream();
                int length = (int)clob.length();
                String str = "";
                byte [] bb = new byte[length];
                try {
                    int result = input.read(bb);
                    if(result!= -1)
                        str = new String(bb);
                    System.out.println(str);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            //第三种方法,使用字符流读取
            if(clob != null){
                Reader reader = clob.getCharacterStream();
                BufferedReader bufferedReader = new BufferedReader(reader);
                String result = "";
                String str = "";
                try {
                    while((str = bufferedReader.readLine()) != null){
                        result += (str + "\n");
                    }
                    System.out.println(result);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

把字符串转为java.sql.Clob对象

Clob clob2  = new javax.sql.rowset.serial.SerialClob(result.toCharArray());

把字符串转为oracle.sql.Clob对象

String str = "I am a clob value";
oracle.sql.CLOB clob = oracle.sql.CLOB.createTemporary(conn, false,oracle.sql.CLOB.DURATION_SESSION);
clob.open(oracle.sql.CLOB.MODE_READWRITE);
writer = clob.getCharacterOutputStream();
writer.write(str);
writer.flush();
writer.close();

备注:需要ojdbc4.jar,如果针对于jdk1.6的话则最好是用ojdbc6.jar

插入一个clob类型的字段

clob字段不能直接插入
插入clob类型的字段需要如下几个步骤

  1. 取消连接的自动提交
  2. 针对clob字段,插入一个占位符,即插入empty_clob
  3. 查询要记录,一定要是for update的
  4. 获取clob字段 ,把获取的java.sql.Clob强制转换为oracle.sql.Clob
  5. 获取oralce.sql.Clob对象的流
  6. 通过该流,把字符串写到数据库中取

代码如下(用的是dbutils):

插入的方法如下:

    /**
    * 数据库中插入Clob类型字段
    */
public void insertClob(){
    String sql = "insert into esb.esb_exception_manage_ (id_  , app_name , flow_name , root_  , detail_ , status_code_) values('218949957478440256' , 'app_name' , 'flow_name' , 'root' , empty_clob() ,1)";
    QueryRunner qr = new QueryRunner();
    getConnection();

    try {
        conn.setAutoCommit(false);
        int result = qr.update(conn , sql);          
        String sql_clob = "select * from esb.esb_exception_manage_ where id_ = ? for update ";
        ResultSetClobHandle resultSetClobHandle = new ResultSetClobHandle();
        int result2 = qr.query(conn , sql_clob , resultSetClobHandle , "258949957478240256");
        conn.commit();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

ResultSetHandle的实现类如下:

    private class ResultSetClobHandle implements  ResultSetHandler<Integer>{
    @Override
    public Integer handle(ResultSet resultSet) throws SQLException {
        if(resultSet.next()){
            oracle.sql.CLOB clob = (oracle.sql.CLOB)resultSet.getClob("detail_");
            Writer writer = clob.getCharacterOutputStream();  // 获取Clob对象的流
            String str = "it is a  big string!";
            try {
                writer.write(str);   //把字符串写入到数据库的clob对象中
                writer.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return 1;
    }
}

转载于:https://www.cnblogs.com/jinxiuze/p/8039168.html

### Hive中CLOB字段的支持与处理方法 Hive本身并不直接支持CLOB(Character Large Object)或BLOB(Binary Large Object)字段类型。当需要将包含CLOB字段的数据从Oracle等关系型数据库导入到Hive时,通常需要进行一些特殊处理以确保数据的完整性和正确性。 #### 1. 使用OraOop配置忽略CLOB字段 在使用OraOop(Oracle optimized connector for Hadoop)时,可以通过设置特定属性来忽略CLOB字段。这适用于不需要保留CLOB字段内容的场景。例如,通过以下配置可以跳过CLOB、BLOB、NCLOB和LONG类型的列[^2]: ```xml <property> <name>oraoop.import.omit.lobs.and.long</name> <value>true</value> <description>If true, OraOop will omit BLOB, CLOB, NCLOB and LONG columns during an Import.</description> </property> ``` #### 2. 将CLOB字段映射为字符串类型 如果需要保留CLOB字段的内容,可以通过Sqoop参数将其映射为字符串类型。这种方式适用于CLOB字段内容较少且可以存储为普通字符串的情况。具体操作如下: - 在Sqoop命令中添加`--map-column-java`参数,并指定CLOB列为String类型。例如: ```bash sqoop import \ --connect jdbc:oracle:thin:@localhost:1521/orcl \ --username wuke \ --password Abcd1234 \ --table BDC_TEST.T_LOB \ --columns "A,B,C" \ --target-dir /tmp/t_lob \ --map-column-java CLOB_COLUMN=String \ -m 1 ``` 上述命令中的`--map-column-java CLOB_COLUMN=String`将CLOB字段映射为String类型[^1]。 #### 3. 处理换行符问题 CLOB字段中可能包含换行符或其他特殊字符,这会导致数据导入Hive后出现错行问题。为了解决这一问题,可以在Sqoop导入时使用`--hive-drop-import-delims`参数去除换行符和其他分隔符。例如: ```bash sqoop import \ --connect jdbc:oracle:thin:@localhost:1521/orcl \ --username wuke \ --password Abcd1234 \ --table BDC_TEST.T_LOB \ --columns "A,B,C" \ --target-dir /tmp/t_lob \ --hive-drop-import-delims \ --map-column-java CLOB_COLUMN=String \ -m 1 ``` 尽管如此,有时`--hive-drop-import-delims`参数可能无法完全解决问题,特别是在使用HCatalog时[^3]。此时,可以考虑在数据导入后对Hive表进行清理,或者在ETL流程中预先处理CLOB字段内容。 #### 4. 使用自定义UDF处理CLOB字段 对于复杂的CLOB字段处理需求,可以编写Hive UDF(用户自定义函数)来解析或转换CLOB字段内容。例如,可以创建一个UDF用于去除换行符或截断过长的文本。以下是一个简单的UDF示例,用于去除字符串中的换行符: ```java package com.example.hive.udf; import org.apache.hadoop.hive.ql.exec.UDF; import org.apache.hadoop.io.Text; public class RemoveNewlines extends UDF { public Text evaluate(Text input) { if (input == null) { return null; } return new Text(input.toString().replaceAll("[\\r\\n]+", " ")); } } ``` 将该UDF编译并注册到Hive后,可以在查询中调用它来处理CLOB字段内容。 ### 总结 Hive不直接支持CLOB字段,但可以通过以下方法实现其处理: 1. 使用OraOop配置忽略CLOB字段。 2. 将CLOB字段映射为字符串类型。 3. 在Sqoop导入时去除换行符等特殊字符。 4. 编写自定义UDF对CLOB字段内容进行进一步处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值