gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:42:05 27 4
gpt4 key购买 nike

我有一个存储 html 代码的 CLOB 列。为了解析它,我编写了一个 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: inconsistent datatypes: expected a value at argument position 1 that is convertible to a Java java.lang.String got an Oracle CLOB 00932. 00000 - "inconsistent datatypes: expected %s got %s"

更新 1

正如我之前提到的,我需要使用 Jsoup 解析 html 数据。 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;
}

调用函数时 -

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

我收到以下错误 -

ORA-00932: inconsistent datatypes: expected a return value that is an instance of a user defined Java class convertible to an Oracle type got an object that could not be converted

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

最佳答案

您在 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,但这个类显然 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 Java 存储函数 - CLOB 的数据类型不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59597220/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com