oracle如何导出Blob和clob大字段

需要一个ExportBlobJianrong .java和config.xml,文件在下面提供:


package thinkinjava;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Arrays;


import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;


import org.w3c.dom.Document;
import org.w3c.dom.NodeList;


public class ExportBlobJianrong {


private static String CONNSTRING = "jdbc:oracle:thin:@198.167.14.13:1593:kkt";

private static String USERNAME = "user";

private static String PASSWORD = "oracle";

private static String TABLE = "t_new";

private static String WHERE = "1=1 and id in ('nihao')";

private static String ID = "ID";

private static String OUTPUT = "kkt.sql"; 

static {
try {
File file = new File("config.xml");
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder buider = factory.newDocumentBuilder();
Document parse = buider.parse(file);
NodeList root = parse.getElementsByTagName("resource");
if(root != null & root.getLength() >0){
CONNSTRING = parse.getElementsByTagName("connectstr").item(0).getFirstChild().getNodeValue();
USERNAME = parse.getElementsByTagName("username").item(0).getFirstChild().getNodeValue();
PASSWORD = parse.getElementsByTagName("password").item(0).getFirstChild().getNodeValue();
TABLE = parse.getElementsByTagName("table").item(0).getFirstChild().getNodeValue();
WHERE = parse.getElementsByTagName("filtersql").item(0).getFirstChild().getNodeValue();
ID = parse.getElementsByTagName("id").item(0).getFirstChild().getNodeValue();
OUTPUT = parse.getElementsByTagName("output").item(0).getFirstChild().getNodeValue();
}
} catch (Exception e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection(CONNSTRING, USERNAME, PASSWORD);
String sql = "select * from " + TABLE + " t where " + WHERE;
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
StringBuffer dump = new StringBuffer("-- export from sql\r\n-- ").append(sql).append("\r\n");
dump.append("declare\r\n");
dump.append("v_blob blob;\r\n");
dump.append("v_clob clob;\r\n");
dump.append("v_lang varchar(50);\r\n");
dump.append("v_terr varchar(50);\r\n");
dump.append("v_schar varchar(50);\r\n");
dump.append("v_dchar varchar(50);\r\n");
dump.append("begin\r\n");
dump.append("delete from "+TABLE+" t where "+ WHERE+";\r\n");
dump.append("v_schar := 'AMERICAN_AMERICA.AL16UTF16';\r\n");
dump.append("select value into v_lang from nls_database_parameters where Parameter in ('NLS_LANGUAGE');\r\n");
dump.append("select value into v_terr from nls_database_parameters where Parameter in ('NLS_TERRITORY');\r\n");
dump.append("select value into v_dchar from nls_database_parameters where Parameter in ('NLS_NCHAR_CHARACTERSET');\r\n");
dump.append("v_dchar := v_lang || '_' || v_terr || '.' || v_dchar;\r\n");
while(rs.next()) {
String insert = "insert into " + TABLE;
String cols = " (";
String vals = " values (";
ResultSetMetaData md = rs.getMetaData();
String idString[] = ID.split(",");
StringBuffer lobDump = new StringBuffer();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
for(int i = 0; i < md.getColumnCount(); i ++) {
String c = md.getColumnName(i + 1);
Object v = rs.getObject(c);
String v1 = null;
if(v instanceof java.sql.Blob) {
v1 = "empty_blob()";
lobDump.append(createBlobDump(TABLE, WHERE, idString,rs, c, (Blob)v));
}
else if (v instanceof java.sql.Date){
v1 = v == null ? "null" : "to_date('"+sdf.format(v)+"','yyyy-MM-dd hh24:mi:ss')";
}
else if(v instanceof java.sql.Clob) {
v1 = "empty_clob()";
lobDump.append(createClobDump(TABLE, WHERE,  idString,rs, c, (Clob)v));
} else {
v1 = v == null ? "null" : "'" + v.toString() + "'";
}
cols += c + (i + 1 < md.getColumnCount() ? ", " : ")");
vals += v1 + (i + 1 < md.getColumnCount() ? ", " : ")");
}
insert += cols + vals + ";";
dump.append(insert).append("\r\n");
dump.append(lobDump).append("\r\n");
}
dump.append("commit;\r\nend;\r\n/\r\n");
System.out.println(dump);

File out = new File(OUTPUT);
if(!out.exists()){
out.createNewFile();
}
BufferedWriter bw = new BufferedWriter(new FileWriter(out));
bw.write(dump.toString());
bw.close();
} catch (Exception e) {
e.printStackTrace();
}


}




private static String createClobDump(String table, String where,String[] idString,ResultSet rs, String col, Clob v) throws SQLException, IOException {
StringBuffer sb = new StringBuffer();
String tiaojian ="1=1 ";
String kg ;
for(String ik:idString){
kg = rs.getString(ik);
if(kg==null){
tiaojian = tiaojian +" and "+ik+" is null";
}else{
tiaojian =tiaojian +" and "+ ik+"='"+kg+"'";
}
}
String updateSql = "select " + col + " into v_clob from " + table + " where "+tiaojian +" for update;";
sb.append(updateSql).append("\r\n");
Reader r = v.getCharacterStream();
char[] cs = new char[50];
int len = 0;
while((len = r.read(cs)) > 0) {
String str = new String(Arrays.copyOf(cs, len));
sb.append("dbms_lob.append(v_clob, utl_raw.cast_to_nvarchar2(utl_raw.convert('");
for (int i = 0; i < str.length(); i ++) {
String ncs = Integer.toHexString(str.codePointAt(i) & 0xffff);
for(int j = ncs.length(); j < 4; j ++) {
ncs = "0" + ncs;
}
sb.append(ncs);
}
sb.append("', v_dchar, v_schar)));\r\n");
}

return sb.toString();
}

private static String createBlobDump(String table, String where, String[] idString,ResultSet rs, String col, Blob v) throws SQLException, IOException {
StringBuffer sb = new StringBuffer();
String tiaojian ="1=1";
String kg ;
for(String ik:idString){
kg = rs.getString(ik);
if(kg==null){
tiaojian = tiaojian +" and "+ik+" is null";
}else{
tiaojian =tiaojian +" and "+ ik+"='"+kg+"'";
}
}
String vId = rs.getString(ID);
String []vidStrings = vId.split(",");
String updateSql = "select " + col + " into v_blob from " + table + " where "+tiaojian +" for update;";
sb.append(updateSql).append("\r\n");
InputStream r = v.getBinaryStream();
byte[] bs = new byte[50];
int len = 0;
while((len = r.read(bs)) > 0) {
sb.append("dbms_lob.append(v_blob, utl_raw.cast_to_raw(utl_raw.cast_to_varchar2('");
for (int i = 0; i < len; i ++) {
byte b = bs[i];
String hex = Integer.toHexString(b & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;

sb.append(hex);
}
sb.append("')));\r\n");
}

return sb.toString();
}

}


config.xml

<?xml version="1.0" encoding="UTF-8"?>
<resource>
<connectstr>jdbc:oracle:thin:@198.167.14.13:1593:kkt</connectstr>
<username>user</username>
<password>oracle</password>
<table>t_new</table>
<filtersql>1=1 and id in ('kk')</filtersql>
<id>ID,TwoId</id>
<output>a.sql</output>
</resource>


config.xml文件配置说明:

1.connectstr配置数据源

2.username数据库用户名

3.password数据库密码

4.table要导出的表名

5.filtersql过滤的条件

6.id导出表的主键,如果要联合主键的话,要将两个主键都加上去

7.output导出的sql会写在那个文件下面。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Oracle中的BLOBCLOB都是用来存储大型二进制和字符数据的数据类型,但是它们之间有一些区别。 BLOB是二进制大型对象,用于存储二进制数据,例如图像、音频和视频等。BLOB数据可以通过二进制流进行读取和写入。 CLOB是字符大型对象,用于存储字符数据,例如文本和XML等。CLOB数据可以通过字符流进行读取和写入。 另外,BLOBCLOB在存储和检索时的处理方式也有所不同。BLOB数据可以使用OracleBLOB API进行处理,而CLOB数据可以使用OracleCLOB API进行处理。 ### 回答2: 在Oracle数据库中,BLOBCLOB都是用于存储大型二进制对象(LOB)的数据类型。但是,它们之间存在一些区别。 首先,BLOB(Binary Large Object)用于存储二进制数据,例如图像、音频和视频文件等。而CLOB(Character Large Object)用于存储字符数据,例如文本文档和HTML页面等。 其次,BLOB在存储时不会进行字符集转换,而CLOB则需要转换为数据库的字符集。这意味着当您插入或更新BLOB数据时,它将保持原样,而CLOB数据可能会因为字符集转换而发生变化。因此,在处理文本数据时应该使用CLOB,而在处理二进制数据时应该使用BLOB。 另外,BLOB可以存储二进制文件,并且是二进制安全的,这意味着它可以存储任意二进制数据。而CLOB只能存储字符数据,因此无法存储二进制文件。 最后,由于BLOBCLOB存储的数据量可能非常大,因此它们的操作方式也有所不同。通常情况下,您不应该使用SELECT *查询BLOBCLOB列,因为它们会返回非常大的数据块并导致性能问题。相反,您应该使用子选择语句或分段读取(chunking)等技术来处理LOB数据。 总之,在Oracle数据库中,BLOBCLOB是用于存储大型对象的非常有用的数据类型,但是要注意它们之间的差异并适当地使用它们以获得最佳性能和效果。 ### 回答3: Oracle数据库是一种关系型数据库管理系统。它支持许多数据类型以适应不同的场景,其中包括BLOBCLOB类型。BLOBCLOB类型是两种不同的数据类型,它们在使用和存储方面有着一些不同之处。 BLOB是二进制大型对象(Binary Large Object)的缩写,存储的是二进制数据,例如图片、音乐、视频等等。它可以存储最大长度达到4GB的二进制数据。BLOB数据可以直接存储在数据库表中,也可以被存储在文件系统中。当需要操作BLOB数据时,可以使用内置的函数来读取、写入或更新数据。 CLOB是字符大型对象(Character Large Object)的缩写,存储的是文本数据,例如文章、邮件、代码等等。它可以存储最大长度达到4GB的文本数据。CLOB数据也可以直接存储在数据库表中,但由于其大小通常比BLOB更大,因此它们也可以被存储在文件中,而不是存储在表中。当需要处理CLOB数据时,也可以使用内置的函数进行读取、写入或更新。 BLOBCLOB在使用方式上也有所不同。BLOB数据更适合用于媒体数据的存储和处理,例如图片、音乐、视频等。而CLOB数据则更适合用于文本数据的存储和处理,例如文章、邮件、代码等。通常来说,CLOBBLOB更易于处理和查询,因为它们是基于文本的数据类型,可以使用文本搜索和其他文本处理功能。 总之,在Oracle数据库中,BLOBCLOB是两种不同的数据类型,用途和存储方式也不同。BLOB用于存储二进制数据,例如图片、音乐、视频等;而CLOB用于存储文本数据,例如文章、邮件、代码等。了解它们之间的差异可以帮助你选择正确的数据类型,并更好地进行数据库管理和维护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值