У меня есть столбец 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 CLOB 00932. 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;
}
При вызове функции -
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: несогласованные типы данных: ожидалось, что возвращаемое значение, которое является экземпляром определенного пользователем класса Java, конвертируемого в тип Oracle, получило объект, который не может быть преобразован
Поскольку я использовал javax.sql.rowset.serial.SerialClob
для инициализации Clob
. Я не хочу использовать Connection
в этом случае. Есть ли способ обойтись?