Oracle Java存储的功能-CLOB的数据类型不一致

问题描述 投票:1回答:1

我有一个CLOB列,存储html代码。为了解析它,我编写了一个Java存储函数-

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;

我遇到以下错误-

ORA-00932:数据类型不一致:期望在参数位置1处的值可以转换为Java java.lang.String,得到一个Oracle CLOB00932. 00000-“数据类型不一致:预期的%s得到了%s”]

更新1

如前所述,我需要使用html解析Jsoup数据。 jsoup.parse期望String作为参数。因此,我需要将Clob转换为String。这是解析方法-

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

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

    return null;
}

此方法正在执行从ClobString-]的转换>

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;
}

这里出现错误-

ORA-00932:数据类型不一致:预期的返回值是用户定义的Java类的实例,该实例可以转换为Oracle类型,但返回的对象无法转换

因为我使用javax.sql.rowset.serial.SerialClob来初始化Clob。在这种情况下,我不想使用Connection。有什么办法吗?

我有一个存储HTML代码的CLOB列。为了解析它,我编写了一个Java存储函数-CREATE或替换FUNCTION parse_html(CLOB中的值)以Java语言名称'MyClass ....返回CLOB。...>>>

<<<< [
使用String
Oracle Java存储过程]中对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,但此类显然是用deprecated补偿了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'; /

java oracle clob java-stored-procedures
1个回答
2
投票
Oracle Java存储过程]中对Java方法的声明仅对VARCHAR2参数有效。

这里是一个简单的例子

© www.soinside.com 2019 - 2024. All rights reserved.