我正在编写一段代码,以便将特定于客户的编码应用于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;
我现在面临的问题是我需要函数来执行存储在clobs中的大部分数据。我知道有一个java.sql.Clob类,我可以让它作为输入参数工作,但我似乎无法让它作为输出参数工作,我一直在运行nullpointer异常。
这是我正在使用的代码:
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;
}
我出错的任何想法?
答案 0 :(得分:2)
与您的问题类似,我要求从数据库中运行的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;
答案 1 :(得分:0)
NullpointerException是由行
引起的Clob xmlclob_out = null;
在这种情况下,我真的不知道如何初始化Clob。在a tutorial中使用您的连接,您可以执行类似
的操作Clob myClob = this.con.createClob();
答案 2 :(得分:0)
首先需要掌握JDBC连接。在Java存储过程中,您应该这样做:
Connection conn = DriverManager.getConnection("jdbc:default:connection:");
您可以使用createClob()
的{{1}}方法来实例化一个对象来代表您的CLOB。
答案 3 :(得分:0)
好的,我已经尝试过,但这似乎不是java代码实际存储在Oracle数据库中的方式。我已将代码修改为:
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED MAGMA."XMLNUMERICENCODER" AS
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class XmlNumericEncoder {
public static Clob encode(Clob xmlstring) throws SQLException {
Connection conn = DriverManager.getConnection("jdbc:default:connection:");
String xmlstring_out = "";
Clob xmlclob_out = conn.createClob();
for (int i = 0; i < xmlstring.length(); i++){
char ch = xmlstring.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;
}
}
但是当我尝试编译它时,我收到以下错误:
XMLNUMERICENCODER:12:找不到符号
symbol:方法createClob()
location:interface java.sql.Connection
Clob xmlclob_out = conn.createClob();
我也尝试过这样创建连接:Connection conn = DriverManager.getConnection(“jdbc:oracle:thin:@ // localhost:1521 / dbname”,“username”,“password”)
但这给了我同样的错误。
我似乎有点奇怪,我需要创建一个连接,因为我已经在数据库中了。
答案 4 :(得分:0)
我知道这是一个旧帖子,但是..
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "MyJava"
as
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import oracle.sql.BLOB;
import oracle.sql.CLOB;
public class MyJava{
public static CLOB myClob() {
try {
String outputString = "this is my text to write in the CLOB";
Connection conn = DriverManager.getConnection("jdbc:default:connection:");
CLOB clob = CLOB.createTemporary(conn, false, BLOB.DURATION_SESSION);
clob.setString(1L, outputString);
return clob;
} catch (SQLException ex) {
return null;
}
}
}
/
,然后是PL / SQL的包装器
CREATE OR REPLACE FUNCTION MY_JAVA_CLOB() RETURN clob
AS language java
name 'MyJava.myClob() return oracle.sql.CLOB';
/