VARCHAR2
参数有效。这里是一个简单的例子
我有一个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; }
此方法正在执行从
Clob
到String
-]的转换>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
在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'; /
VARCHAR2
参数有效。这里是一个简单的例子