当前位置: 首页 > 知识库问答 >
问题:

Oracle Java存储函数-CLOB数据类型不一致

岳昊空
2023-03-14
CREATE or replace FUNCTION parse_html(value in CLOB) 
  RETURN CLOB  
   AS LANGUAGE JAVA NAME 'MyClass.parse(java.lang.String) return java.lang.String';

并添加了相应的Java类。

当我调用这个函数parse_html(clob_col_name)-

SELECT PARSE_HTML(m.clob_col_name) 
  FROM my_table m
  where length(m.clob_col_name) > 4000;

我得到了以下错误-

public static Clob parse(Clob clob) {
    String value = clobToString(clob);

    if (!isEmpty(value)) {
        return stringToClob(Jsoup.parse(value).text().trim());
    }

    return null;
}
private static String clobToString(Clob clob) {
    StringBuilder sb = new StringBuilder();

    if (clob == null) {
        return null;
    }

    try {
        Reader reader = clob.getCharacterStream();
        BufferedReader br = new BufferedReader(reader);

        String line;

        while (null != (line = br.readLine())) {
            sb.append(line);
        }

        br.close();
    } catch (IOException e) {
        // handle this exception
    } catch (SQLException e) {
        //e.printStackTrace();
    }

    return sb.toString();
}

在返回解析后的值之前,我还需要将string转换回clob

private static Clob stringToClob(String value) {
    if (isEmpty(value)) {
        return null;
    }

    Clob myClob = null;

    try {
        myClob = new SerialClob(value.toCharArray());
    } catch (SQLException e) {
        //e.printStackTrace();
    }

    return myClob;
}

调用函数时-

create or replace FUNCTION parse(value in CLOB) 
   RETURN CLOB  
      AS LANGUAGE JAVA NAME 'HtmlParser.parse(java.sql.Clob) return java.sql.Clob';

我得到了以下错误-

共有1个答案

云长恨
2023-03-14

您在Oracle Java存储过程中使用string声明的Java方法仅适用于varchar2参数。

这里有一个简单的例子

create or replace and compile java source named  "HelloVarchar" as
public class HelloVarchar
{
  public static String world(String txt)
  {
    return "Hello " + txt;
  }
};
/

CREATE or replace FUNCTION parse_varchar(value in VARCHAR2) 
  RETURN VARCHAR2  
   AS LANGUAGE JAVA NAME 'HelloVarchar.world(java.lang.String) return java.lang.String';
/

要使用CLOB,选项是声明oracle.sql.CLOB,但是这个类si显然不推荐使用java.sql.CLOB进行补偿

create or replace and compile java source named  "HelloClob" as
import java.sql.Clob;
import java.sql.SQLException;

public class HelloClob
{
  public static Clob world(Clob txt) throws SQLException 
  {
    return  txt;
  }
};
/

CREATE or replace FUNCTION parse_clob(value in CLOB) 
  RETURN CLOB  
   AS LANGUAGE JAVA NAME 'HelloClob.world(java.sql.Clob) return java.sql.Clob';
/
 类似资料:
  • 我想更新xml中的一个值 更新trb1_sub_errs set error_status='ready_to_recycle',general_data_c=updatexml(xmltype(general_data_c),'//data/cmheadertransaction/transactionrsn/text()','creq'),其中sub_trx_id=4678604091;更新t

  • 我们有一些lob和varchar2类型的数据被错误地编码为AL32UTF8,我们需要将其编码转换为we8mswin1252字符集。我得到了用于字符集转换的convert函数,这个函数在varchar2 datatype中工作得很好,但在CLOB中使用时给出了一些模糊的字符。我当前的编码是AL32UTF8。 数据库:Oracle 12c

  • Oracle XE 11。一个非常简单的连接查询给了我以下错误: 表: 产品描述为CLOB。 SQL SQL 查询: 第1行的错误:ORA-00932:数据类型不一致:预期-得到CLOB 如果我删除t0。从选择名称,它将工作。奇怪的 谢谢。

  • 好吧,我一直在Kotlin试验原始数据存储,我有一个问题。我正在使用以下内容。原型文件: 这是我的序列化程序类: 和我的存储库: 因此,在我的updateValue()方法中,我可以设置“name”字段的名称,但我没有地址消息字段的setter,如street和number。编译器只显示getter。在姓名和年龄字段的另一边,我有setters。如何对这两个地址字段使用setters:街道、编号?