gpt4 book ai didi

java - 在 Java 之间传递 Oracle clob

转载 作者:行者123 更新时间:2023-12-02 06:41:27 26 4
gpt4 key购买 nike

我正在编写一段代码,将客户特定的编码应用于 XML 数据。起初,我尝试仅使用 PL-SQL 来完成此操作,但性能非常差(160 条记录需要 1 小时)。之后我只使用 java 进行了尝试,性能非常好(1 分钟内 400.000 条记录)

现在我想看看当我用 Java 构建代码并将其加载到数据库中时的性能如何。

为此,我有以下代码:

create or replace and compile java source named XmlNumericEncoder as
public class XmlNumericEncoder {
public static String encode(String xmlstring) {
String xmlstring_out = "";
for (int i = 0; i < xmlstring.length(); i++){
char ch = xmlstring.charAt(i);

if ((int)ch >= 192 && (int)ch <= 255){
xmlstring_out += "&#" + (int)ch + ";";
} else {
xmlstring_out += ch;
}
}
return xmlstring_out;
}
}



CREATE OR REPLACE FUNCTION XmlNumericEncoder(xmlstring varchar2)
RETURN String
AS LANGUAGE JAVA
NAME 'XmlNumericEncoder.encode(java.lang.String) return java.lang.String';

此代码可以通过以下方式执行:

select XmlNumericEncoder('Böhmer') from dual;

我现在面临的问题是我需要该函数对存储在 clob 中的较大部分数据执行。我知道有一个 java.sql.Clob 类,我可以让它作为输入参数工作,但我似乎无法让它作为输出参数工作,我一直遇到空指针异常。

这是我正在使用的代码:

import java.sql.Clob;
import java.sql.SQLException;

public class XmlNumericEncoder {
public static Clob encode(Clob xmlclob) throws SQLException {
String xmlstring_out = "";
Clob xmlclob_out = null;
for (int i = 0; i < xmlclob.length(); i++){
char ch = xmlclob.getSubString(i,1).charAt(1);

if ((int)ch >= 192 && (int)ch <= 255){
xmlstring_out += "&#" + (int)ch + ";";
} else {
xmlstring_out += ch;
}
}
int setString = xmlclob_out.setString(0, xmlstring_out);

return xmlclob_out;
}

有什么想法我哪里出错了吗?

最佳答案

与您的问题类似,我需要从数据库中运行的 Java 程序将 clob 插入到 Oracle 数据库中。这里的答案都不适合我。

我最终找到了解决方案,技巧是使用 oracle.sql.CLOB

这是我发现的方法:

create table test_clob (
c clob
);

create or replace and compile java source named java_clob_insert as

import java.sql.Connection;
import java.sql.PreparedStatement;
import oracle.sql.CLOB;
import java.io.Writer;

public class JavaClobInsert {

public static void doInsert () {

try {

//create the connection and statement
Connection oracleConn =
(new oracle.jdbc.OracleDriver()).defaultConnection();

String stmt = "INSERT INTO test_clob values (?)";

PreparedStatement oraclePstmt = oracleConn.prepareStatement(stmt);

//Imagine we have a mysql longtext or some very long string
String s = "";
for (int i = 0; i < 32768; i++) {
s += i % 10;
}

//Initialise the Oracle CLOB
CLOB clob;
clob = CLOB.createTemporary(oracleConn, true, CLOB.DURATION_CALL);

//Good idea to check the string is not null before writing to clob
if (s != null) {
Writer w = clob.setCharacterStream( 1L );
w.write(s);
w.close();
oraclePstmt.setClob(1, clob);
} else {
oraclePstmt.setString(1, "");
}

//clean up
oraclePstmt.executeUpdate();
oracleConn.commit();
oraclePstmt.close();
oracleConn.close();

} catch (Exception e) {
e.printStackTrace();
}
}
}
/

create or replace procedure clob_insert as language java name
'JavaClobInsert.doInsert()';
/

begin
clob_insert;
end;
/

select *
from test_clob;

关于java - 在 Java 之间传递 Oracle clob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19096673/

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