java读写Oracle COLB字段
oracle select clob字段内容-概述说明以及解释
oracle select clob字段内容-概述说明以及解释1.引言1.1 概述CLOB字段(Character Large Object)是一种用于存储大文本数据的Oracle数据库字段类型。
在数据库中,通常将CLOB字段用于存储大于4000个字符的文本数据,例如长篇文章、日志信息、XML文档等。
本文将重点讨论如何在Oracle数据库中查询CLOB字段的内容。
通过有效地查询CLOB字段,我们可以轻松地获取和操作大文本数据,从而更好地满足业务需求。
接下来,我们将详细介绍Oracle中如何查询CLOB字段内容,以及在查询过程中需要注意的事项。
通过学习本文内容,读者将更加了解如何有效地处理CLOB字段数据,提高数据库查询和管理的效率。
1.2文章结构文章结构部分主要介绍了本文的整体结构和内容安排。
首先,我们将引言部分介绍本文的背景和目的,引导读者了解本文的主题和意义。
接着,在正文部分我们将详细介绍什么是CLOB字段以及在Oracle中如何查询CLOB字段内容,同时提供查询过程中需要注意的事项。
最后,在结论部分我们将对本文进行总结,探讨CLOB字段的应用场景,以及展望未来可能的发展方向。
通过本文的结构安排,读者将能够全面了解和掌握如何查询Oracle中的CLOB字段内容。
1.3 目的:本文的目的在于帮助读者了解如何在Oracle数据库中查询CLOB字段的内容。
CLOB字段是一种专门用来存储大文本数据的字段类型,通常用于存储文档、日志、报告等内容较大的数据。
在实际应用中,我们经常需要查询CLOB字段的内容以便分析和处理,因此正确地查询和处理CLOB字段内容具有重要意义。
通过本文的阐述,读者将能够清楚地了解什么是CLOB字段、如何准确地查询CLOB字段内容以及在查询过程中需要注意的事项。
希望读者在阅读完本文后能够掌握查询CLOB字段内容的技巧,提高数据处理的效率和准确性。
2.正文2.1 什么是CLOB字段CLOB是Oracle数据库中一种用来存储大容量字符数据的数据类型,其全称为Character Large Object。
读取并显示oracle中的blob字段
读取并显示oracle中的blob字段1. java连接Oracle具体代码如下:import java.sql.*;import java.io.*;import javax.imageio.ImageIO;import java.awt.image.BufferedImage;import java.awt.image.AffineTransformOp;import java.awt.geom.AffineTransform;publicclass OracleQueryBean {privatefinal String oracleDriverName = "oracle.jdbc.driver.OracleDriver";private Connection myConnection = null;/*图片表名*/private String strTabName;/*图片ID字段名*/private String strIDName;/*图片字段名*/private String strImgName;/***加载java连接Oracle的jdbc驱动*/public OracleQueryBean(){try{Class.forName(oracleDriverName);}catch(ClassNotFoundException ex){System.out.println("加载jdbc驱动失败,原因:" + ex.getMessage()); }}/***获取Oracle连接对象*@return Connection*/public Connection getConnection(){try{//用户名+密码; 以下使用的Test就是Oracle里的表空间//从配置文件中读取数据库信息GetPara oGetPara = new GetPara();String strIP = oGetPara.getPara("serverip");String strPort = oGetPara.getPara("port");String strDBName = oGetPara.getPara("dbname");String strUser = oGetPara.getPara("user");String strPassword = oGetPara.getPara("password");this.strTabName = oGetPara.getPara("tablename");this.strIDName = oGetPara.getPara("imgidname");this.strImgName = oGetPara.getPara("imgname");String oracleUrlToConnect="jdbc:oracle:thin:@"+strIP+":"+strPort+":"+strDBName;this.myConnection= DriverManager.getConnection(oracleUrlToConnect, strUser, strPassword);}catch(Exception ex){System.out.println("Can not get connection:" + ex.getMessage());System.out.println("请检测配置文件中的数据库信息是否正确." );}returnthis.myConnection;}}2. 读取blob字段在OracleQueryBean类中增加一个函数,来进行读取,具体代码如下:/***根据图片在数据库中的ID进行读取*@param strID图片字段ID*@param w需要缩到的宽度*@param h需要缩到高度*@return*/publicbyte[] GetImgByteById(String strID, int w, int h){//System.out.println("Get img data which id is " + nID);if(myConnection == null)this.getConnection();byte[] data = null;try {Statement stmt = myConnection.createStatement();ResultSet myResultSet = stmt.executeQuery("select "+ this.strIDName + " from " + this.strTabName + " where " + this.strIDName + "=" + strID);StringBuffer myStringBuffer = new StringBuffer();if (myResultSet.next()) {java.sql.Blob blob = myResultSet.getBlob(this.strImgName);InputStream inStream = blob.getBinaryStream();try {long nLen = blob.length();int nSize = (int) nLen;//System.out.println("img data size is :" + nSize);data = newbyte[nSize];inStream.read(data);inStream.close();} catch (IOException e) {System.out.println("获取图片数据失败,原因:" +e.getMessage());}data = ChangeImgSize(data, w, h);}System.out.println(myStringBuffer.toString());mit();myConnection.close();} catch (SQLException ex) {System.out.println(ex.getMessage());}return data;}3. 缩放图片因为图片的大小可能不一致,但是在页面中输出的大小需要统一,所以需要在OracleQueryBean类中增加一个函数,来进行缩放,具体代码如下:/***缩小或放大图片*@param data 图片的byte数据*@param w需要缩到的宽度*@param h需要缩到高度*@return 缩放后的图片的byte数据*/privatebyte[] ChangeImgSize(byte[] data, int nw, int nh){byte[] newdata = null;try{BufferedImage bis = ImageIO.read(new ByteArrayInputStream(data));int w = bis.getWidth();int h = bis.getHeight();double sx = (double) nw / w;double sy = (double) nh / h;AffineTransform transform = new AffineTransform();transform.setToScale(sx, sy);AffineTransformOp ato = new AffineTransformOp(transform, null);//原始颜色BufferedImage bid = new BufferedImage(nw, nh,BufferedImage.TYPE_3BYTE_BGR);ato.filter(bis, bid);//转换成byte字节ByteArrayOutputStream baos = new ByteArrayOutputStream();ImageIO.write(bid, "jpeg", baos);newdata = baos.toByteArray();}catch(IOException e){e.printStackTrace();}return newdata;}4. 展示在页面页面使用OracleQueryBean来根据用户提供的图片id进行查询,在读取并进行缩放后,通过jsp页面进行展示,具体代码如下:<%@ page language="java" contentType="text/html;;charset=gbk" %><jsp:useBean id="OrcleQuery" scope="page" class="HLFtiDemo.OracleQueryBean" /> <%response.setContentType("image/jpeg");//图片在数据库中的 IDString strID = request.getParameter("id");//要缩略或放大图片的宽度String strWidth = request.getParameter("w");//要缩略或放大图片的高度String strHeight = request.getParameter("h");byte[] data = null;if(strID != null){int nWith = Integer.parseInt(strWidth);int nHeight = Integer.parseInt(strHeight);//获取图片的byte数据data = OrcleQuery.GetImgByteById(strID, nWith, nHeight);ServletOutputStream op = response.getOutputStream();op.write(data, 0, data.length);op.close();op = null;response.flushBuffer();//清除输出流,防止释放时被捕获异常out.clear();out = pageContext.pushBody();}%>5. OracleQueryBean查询类的整体代码OracleQueryBean.java文件代码如下所示:import java.sql.*;import java.io.*;import javax.imageio.ImageIO;import java.awt.image.BufferedImage;import java.awt.image.AffineTransformOp;import java.awt.geom.AffineTransform;publicclass OracleQueryBean {privatefinal String oracleDriverName = "oracle.jdbc.driver.OracleDriver";private Connection myConnection = null;/*图片表名*/private String strTabName;/*图片ID字段名*/private String strIDName;/*图片字段名*/private String strImgName;/***加载java连接Oracle的jdbc驱动*/public OracleQueryBean(){try{Class.forName(oracleDriverName);}catch(ClassNotFoundException ex){System.out.println("加载jdbc驱动失败,原因:" + ex.getMessage());}}/***获取Oracle连接对象*@return Connection*/public Connection getConnection(){try{//用户名+密码; 以下使用的Test就是Oracle里的表空间//从配置文件中读取数据库信息GetPara oGetPara = new GetPara();String strIP = oGetPara.getPara("serverip");String strPort = oGetPara.getPara("port");String strDBName = oGetPara.getPara("dbname");String strUser = oGetPara.getPara("user");String strPassword = oGetPara.getPara("password");this.strTabName = oGetPara.getPara("tablename");this.strIDName = oGetPara.getPara("imgidname");this.strImgName = oGetPara.getPara("imgname");String oracleUrlToConnect="jdbc:oracle:thin:@"+strIP+":"+strPort+":"+strDBName;this.myConnection= DriverManager.getConnection(oracleUrlToConnect, strUser, strPassword);}catch(Exception ex){System.out.println("Can not get connection:" + ex.getMessage());System.out.println("请检测配置文件中的数据库信息是否正确." );}returnthis.myConnection;}/***根据图片在数据库中的ID进行读取*@param strID图片字段ID*@param w需要缩到的宽度*@param h需要缩到高度*@return缩放后的图片的byte数据*/publicbyte[] GetImgByteById(String strID, int w, int h){//System.out.println("Get img data which id is " + nID);if(myConnection == null)this.getConnection();byte[] data = null;try {Statement stmt = myConnection.createStatement();ResultSet myResultSet = stmt.executeQuery("select "+ this.strIDName + " from " + this.strTabName + " where " + this.strIDName + "=" + strID);StringBuffer myStringBuffer = new StringBuffer();if (myResultSet.next()) {java.sql.Blob blob = myResultSet.getBlob(this.strImgName);InputStream inStream = blob.getBinaryStream();try {long nLen = blob.length();int nSize = (int) nLen;//System.out.println("img data size is :" + nSize); data = newbyte[nSize];inStream.read(data);inStream.close();} catch (IOException e) {System.out.println("获取图片数据失败,原因:" +e.getMessage());}data = ChangeImgSize(data, w, h);}System.out.println(myStringBuffer.toString());mit();myConnection.close();} catch (SQLException ex) {System.out.println(ex.getMessage());}return data;}/***根据图片在数据库中的ID进行读取,显示原始大小的图片*@param strID图片字段ID*@return 读取后的图片byte数据*/publicbyte[] GetImgByteById(String strID){//System.out.println("Get img data which id is " + nID);if(myConnection == null)this.getConnection();byte[] data = null;try {Statement stmt = myConnection.createStatement();ResultSet myResultSet = stmt.executeQuery("select "+ this.strIDName + " from " + this.strTabName + " where " + this.strIDName + "=" + strID);StringBuffer myStringBuffer = new StringBuffer();if (myResultSet.next()) {java.sql.Blob blob = myResultSet.getBlob(this.strImgName);InputStream inStream = blob.getBinaryStream();try {long nLen = blob.length();int nSize = (int) nLen;data = newbyte[nSize];inStream.read(data);inStream.close();} catch (IOException e) {System.out.println("获取图片数据失败,原因:" + e.getMessage());}}System.out.println(myStringBuffer.toString());mit();myConnection.close();} catch (SQLException ex) {System.out.println(ex.getMessage());}return data;}/***缩小或放大图片*@param data图片的byte数据*@param w需要缩到的宽度*@param h需要缩到高度*@return*/privatebyte[] ChangeImgSize(byte[] data, int nw, int nh){byte[] newdata = null;try{BufferedImage bis = ImageIO.read(new ByteArrayInputStream(data));int w = bis.getWidth();int h = bis.getHeight();double sx = (double) nw / w;double sy = (double) nh / h;AffineTransform transform = new AffineTransform();transform.setToScale(sx, sy);AffineTransformOp ato = new AffineTransformOp(transform, null);//原始颜色BufferedImage bid = new BufferedImage(nw, nh,BufferedImage.TYPE_3BYTE_BGR);ato.filter(bis, bid);//转换成byte字节ByteArrayOutputStream baos = new ByteArrayOutputStream();ImageIO.write(bid, "jpeg", baos);newdata = baos.toByteArray();}catch(IOException e){e.printStackTrace();}return newdata;}}。
oracle的clob类型
oracle的clob类型一、CLOB类型的概述CLOB是Oracle数据库中的一种数据类型,全称为Character Large Object,即字符大对象。
它可以存储大量的文本数据,最大容量可以达到4GB。
CLOB类型的数据在存储和检索时与普通字符串不同,需要特殊的处理方式。
二、CLOB类型的创建在Oracle数据库中创建一个CLOB类型的字段需要使用CREATE TABLE语句,并指定字段名、数据类型和大小等信息。
例如:CREATE TABLE my_table (id NUMBER,clob_field CLOB);这样就创建了一个名为my_table的表,其中包含一个id字段和一个clob_field字段,clob_field字段的数据类型为CLOB。
三、CLOB类型的插入向CLOB类型字段中插入数据需要使用PL/SQL或Java等编程语言进行操作。
以下是PL/SQL插入示例:DECLAREmy_clob CLOB;BEGINSELECT clob_field INTO my_clob FROM my_table WHERE id = 1 FOR UPDATE;DBMS_LOB.WRITEAPPEND(my_clob, LENGTH('Hello world'),'Hello world');COMMIT;END;这段代码首先从my_table表中查询id为1的记录,并将其对应的clob_field字段赋值给变量my_clob。
然后使用DBMS_LOB.WRITEAPPEND函数将字符串“Hello world”写入到my_clob变量中,并提交事务。
四、CLOB类型的读取从CLOB类型字段中读取数据也需要使用PL/SQL或Java等编程语言进行操作。
以下是PL/SQL读取示例:DECLAREmy_clob CLOB;my_string VARCHAR2(32767);BEGINSELECT clob_field INTO my_clob FROM my_table WHERE id = 1; DBMS_LOB.READ(my_clob, LENGTH(my_clob), 1, my_string);DBMS_OUTPUT.PUT_LINE(my_string);END;这段代码首先从my_table表中查询id为1的记录,并将其对应的clob_field字段赋值给变量my_clob。
Java读写Blob和Clob字段源码
Clob c=resultSet.getClob(2);
Reader reader=c.getCharacterStream():
if (reader == null) {
return null;
ResultSet rs = st.executeQuery(
"select contents from BLOBIMG where id=1 for update");
if (rs.next()) {
//使用oracle.sql.BLOB类,没办法了,变成专用的了
Connection con = ConnectionFactory.getConnection();
con.setAutoCommit(false);
Statement st = con.createStatement();
ResultSet rs = st.executeQuery("select contents from BLOBIMG where id=1");
//处理事务
con.setAutoCommit(false);
Statement st = con.createStatement();
//插入一个空对象
st.executeUpdate("insert into BLOBIMG values(1,empty_blob())");
//用for update方式锁定数据行
temp=new byte[tempLength];
System.arraycopy(data,0,temp,0,len);
System.arraycopy(buffer,0,temp,len,sept);
使用JAVA读取ORACLEBLOB字段
使用JAVA读取ORACLEBLOB字段要使用Java读取Oracle的BLOB字段,你可以使用以下步骤:1.导入必要的类库:```javaimport java.io.FileOutputStream;import java.io.InputStream;import java.sql.Blob;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;```2.建立数据库连接:```javaString username = "your_username";String password = "your_password";Connection conn = DriverManager.getConnection(jdbcUrl, username, password);```3.准备SQL查询语句并执行:```javaString sql = "SELECT your_blob_column FROM your_table WHERE your_condition";PreparedStatement stmt = conn.prepareStatement(sql);ResultSet rs = stmt.executeQuery(;```4.从结果集中获取BLOB对象:```javaif (rs.next()Blob blob = rs.getBlob("your_blob_column");```5.通过BLOB对象获取输入流,并读取BLOB数据写入文件:```javaInputStream inputStream = blob.getBinaryStream(;FileOutputStream outputStream = newFileOutputStream("path_to_output_file");byte[] buffer = new byte[4096];int bytesRead = -1;while ((bytesRead = inputStream.read(buffer)) != -1)outputStream.write(buffer, 0, bytesRead);inputStream.close(;outputStream.close(;```6.关闭相关资源:```javars.close(;stmt.close(;conn.close(;```请根据你的实际情况替换相应的数据库连接信息、SQL查询语句、BLOB字段名称和输出文件路径。
Java 存储和读取 oracle CLOB 类型字段
Java 存储和读取oracle CLOB 类型字段(2008-08-22 15:08:38)转载▼标签:杂谈package oracle.clob;import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.IOException;import java.io.Reader;import java.io.StringReader;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import oracle.jdbc.driver.OracleDriver;import oracle.sql.CLOB;public class ClobTest {String url = "jdbc:oracle:thin:@192.168.2.157:1521:orcl";String user = "xj";String pwd = "xj";String text = "这是要插入到CLOB里面的数据";private void clobImport() throws ClassNotFoundException, SQLException {// TODO Auto-generated method stubDriverManager.registerDriver(new OracleDriver());Connection conn = DriverManager.getConnection(url, user, pwd);// 得到连接对象String sql = "insert into clob_test(id,str) values ('1',?)";// 要执行的SQL语句PreparedStatement stmt = conn.prepareStatement(sql);// 加载SQL语句// PreparedStatement支持SQL带有问号?,可以动态替换?的内容。
java存取oracle中的COLB类型数据
一、如何去处理Clob、BLOB的大类型CLOB可用于存放大文本数据,最多可存储4GB数据,在应用开发中比较常见.java提供的sql.Clob类与之对应.它提供两个方法来读取Clob的数据:getCharacterStream() 方法返回按unicode编码的输入流(java.io.Reader对象) getAsciiStream() 方法返回按ASCII编码的输入流(java.io.InputStream对象) 所以如果你的数据库中有可能存储中文字符的话,就要使用前一个方法.现在举一个实际的例子,让我一步步学习如何使用CLOB.首先,创建一个含CLOB字段的表:create table test (id INTEGER, content clob);接下来, 我们通过JSP往这张表里插入一条记录,然后再获取显示它.插入操作:以上需要注意的几点是:1)clob类型的数据不能直接insert,要先通过empty_clob()方法给它分配一个locator(同理,blob的用empty_blob()函数分配locator).然后把它select出来(此时它当然没有数据,但结果集不是空的),得到一个Clob的对象,修改该对象的内容让它满足我们的需要,再通过update方法更新该行记录.2) 通过select修改含lob类型的记录时一定要锁定该行(通过for update关键字实现),否则oracle会报错.3) 刚插入的记录就select for update, 会出现"违反读取顺序"错误,解决办法是将自动提交功能置为false,即不允许自动提交,然后commit它,再select,就可以了. 这就是上面那段代码里//*两行的作用.下面,我们将刚插入的记录从数据库中读取出来并显示之:二、编码问题因为JAVA的开发者是老外,所以他们对中文的支持并不是太好,这一点让不少的我们感到很是头痛,也就是我们通过说的汉字编码问题吧,关于一些汉字编码的规范我就不多说了,我主要是谈谈在和oracle数据库连接时的一些小问题,不过这些小问题很是让人头痛的。
Hibernate集成spring读写oracle clob
Hibernate集成spring读写oracle clob完全版前言Hibernate操作oracle clob字段是个大难题,网上的很多范例不详。
Hibernate与spring集成后操作又有区别,学习者不知从何下手。
本文讲解了读写oracle clob大对象的实现,并且带有完整的可运行范例下载。
希望对学习者有所帮助。
本文的内容如下1.数据库的脚本2.spring与hibernate的集成配置3.实体类的配置4.DAO层和BO层的实现5.测试代码6.错误代码以及原因一、数据库脚本表建在scott模式下,密码tiger测试在过程中的content字段是否写入spring与hibernate的集成配置3个提示:1.批处理的设置必须为0<prop key="hibernate.jdbc.batch_size">0</prop>2.必须使用事务,保证BO层的操作在一个事务中3.如果你对spring的注入依赖有疑问,我也没有办法DemoTO.hbm.xml文件1.数据库的表只有2个字段,clob要映射为java.sql.Clob类型。
当然有些人映射为String类型,如果那样做当字符串长度到一定长度时会出现错误。
2.额外加字段contentStr的目的只是为了插入数据的方便。
三、DAO层和BO层的实现DemoDAO.java1.只取必须的dao方法,别的省略。
2.save()方法绝对不行,必须使用save1()3.只是个demo,我不抽接口了DemoBO.java四、测试代码1.我在clob字段插入的内容,超过1万个字符,毕竟是字符大对象2.另外的范例测试读取大字段只读前100个字符没有正确配置事务管理save1()的方法中,save1方法只有配置bo层的事务管理才能处于同一个会话中。
很多书上说以下的语法是对的,也许在以前的某个版本对。
oracle.sql.CLOB clob=(oracle.sql.CLOB) demo.getContent();我使用的是spring2.0和hibernate3.1,请注意我在save1()方法如何转换的。
Oracle的CLOB大数据字段类型操作方法
Oracle的CLOB⼤数据字段类型操作⽅法⼀、Oracle中的varchar2类型我们在Oracle数据库存储的字符数据⼀般是⽤VARCHAR2。
VARCHAR2既分PL/SQL Data Types中的变量类型,也分Oracle Database中的字段类型,不同场景的最⼤长度不同。
在Oracle Database中,VARCHAR2 字段类型,最⼤值为4000;PL/SQL中 VARCHAR2 变量类型,最⼤字节长度为32767。
当 VARCHAR2 容纳不下我们需要存储的信息时,就出来的Oracle的⼤数据类型LOB( Large Object,⼤型对象)。
⼆、Oarcle中的LOB类型在Oracle中,LOB(Large Object,⼤型对象)类型的字段现在⽤得越来越多了。
因为这种类型的字段,容量⼤(最多能容纳4GB的数据),且⼀个表中可以有多个这种类型的字段,很灵活,适⽤于数据量⾮常⼤的业务领域(如图象、档案等)。
LOB类型分为BLOB和CLOB两种:BLOB即⼆进制⼤型对象(Binary Large Object),适⽤于存贮⾮⽂本的字节流数据(如程序、图象、影⾳等)。
⽽CLOB,即字符型⼤型对象(Character Large Object),则与字符集相关,适于存贮⽂本型的数据(如历史档案、⼤部头著作等)。
三、DB中使⽤CLOB类型字段(⼀)、创建表(使⽤sql或者直接在PL/SQL客户端创建),字段类型CLOB-- Create tablecreate table TEMP(name VARCHAR2(200),age NUMBER,temp_clob CLOB)tablespace INSIGHTDATA3_TSpctfree 10initrans 1maxtrans 255storage(initial 160Knext 1Mminextents 1maxextents unlimited);(⼆)、增删改查先看⼀下使⽤普通⽅式操作CLOB类型:SELECT , t.temp_clob FROM temp t; --普通查询 INSERT INTO temp t VALUES ('Grand.Jon', 22, '加⼊博客园的第⼀天'); 查询因为不是varchar2类型,所以普通查询看不到CLOB类型的字段内容,结果如下⽽普通插⼊操作也会因为Oracle的隐式转换,默认把字符串转换成varchar2类型,⼀旦字符串内容超过varchar2的最⼤限度就会报会报ora-01704(字符串太长)错误。
java中(注解符)处理Clob(blob)类型
java中处理Clob类型:1、注解符处理:@Lob@Basic(fetch = FetchType.EAGER)@Column(name="SUBSTANCE", columnDefinition="CLOB", nullable=true)这种配置完全错误导致信息过长保存失败;1>正确配置方法如下:2>在spring配置文件需要配置:java中处理Clob类型:1、注解符处理:@Lob@Basic(fetch = FetchType.EAGER)@Column(name="SUBSTANCE", columnDefinition="CLOB", nullable=true)这种配置完全错误导致信息过长保存失败;1>正确配置方法如下:2>在spring配置文件需要配置:Blob类型处理:1》实体:@Column(name = "te1", columnDefinition = "BLOB",nullable=true)@Type(type="org.springframework.orm.hibernate3.support.Bl obByteArrayType")public byte[] getTe1() {return te1;}2》action:File file_image = newFile("d:\\1284874887862.jpg");byte[] photo=new byte[102400];BufferedInputStream br = new BufferedInputStream(new FileInputStream(file_image));br.read(photo);return photo;软件包 org.springframework.orm.hibernate3.support :/doc/spring2.5_doc_cn/org/springframework/orm/hib ernate3/support/package-summary.html处理clob、blob类型:/blog/232522。
java调用oracle含有clob参数的存储过程
java调用oracle含有clob参数的存储过程Posted on 2011/03/30 by koalashanpackage com.db;import java.io.Writer;import java.sql.*;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.*;import java.util.Date;import oracle.sql.ARRAY;import oracle.sql.ArrayDescriptor;import oracle.sql.CLOB;public class DBTest {/*** @param args*/public static void main(String[] args) {try {call();} catch (Exception e) {e.printStackTrace();}}public static Connection getConnection() {Connection conn = null;String DBDRIVER = "oracle.jdbc.driver.OracleDriver";String DBURL = "jdbc:oracle:thin:@127.0.0.1:1521:dbtest";String DBUSER = "sr";String DBPASSWORD = "sr";try {Class.forName(DBDRIVER);conn = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}return conn;}public static void call() throws Exception {Connection conn = null;CallableStatement proc = null;StringBuffer xml= new StringBuffer();xml.append("").append("").append("20").append("A0000020850E1F").append("").append("").append("1").append("900001598").append("").append("").append("").append("3").append("900001598").append("").append("").append("").append("4").append("920000009").append("").append("").append("").append("");try {conn = getConnection();String call = "{call srforcrm.feesubsidyvalidate(?,?)}"; // 调用语句proc = conn.prepareCall(call); // 调用存储过程oracle.sql.CLOB _oClob = (CLOB) getCLOB(conn,xml.toString());proc.setObject(1,_oClob);proc.registerOutParameter(2, Types.VARCHAR); // 声明输出参数是什么类型的proc.execute(); // 执行String out = proc.getString(2); // 获得输出参数System.out.println("out is "+out);} catch (SQLException e) {System.err.println(e.getMessage());} finally {try {proc.close();conn.close();} catch (SQLException e) {.println(e.getMessage());}}}public static Clob getCLOB(Connection conn, String clobData)throws Exception {CLOB tempClob = null;// try// {// create a new temporary CLOBtempClob = CLOB.createTemporary(conn, true, CLOB.DURATION_SESSION);// Open the temporary CLOB in readwrite mode to enable writingtempClob.open(CLOB.MODE_READWRITE);// Get the output stream to writeWriter tempClobWriter = tempClob.getCharacterOutputStream();// Write the data into the temporary CLOBtempClobWriter.write(clobData);// Flush and close the streamtempClobWriter.flush();tempClobWriter.close();// Close the temporary CLOBtempClob.close();return tempClob;}}。
Java读取Oracle大字段数据(CLOB)的2种方法
Java读取 Oracle大字段数据( CLOB)的 2种方法
Oracle数据库中有一个字段是CLOB类型,使用java 解析.
1.使用java解析clob类型内容
}
if(pageObject.getResultList() != null && pageObject.getResultList().size() > 0){ for(int i=0,j=pageObject.getResultList().size(); i < j;i++){ Map<String,Object> maps = (Map<String, Object>) pageObject.getResultList().get(i); maps.put("DISPATCHINGRULESNAME",this.clobToString((Clob) maps.get("DISPATCHINGRULESNAME"))); //这里将Clob类型转化成字符串,调用clobToString((Clob)方法 }
java读取clob字段的几种方法
第一种方法代码量少,且能避免中文乱码问题;第二种方法与第一种方法效率差不多,也是常使用的一种方法;第三种方法效率极低,如 果数据比较大的话建议不要使用。
本人把100页的一个word文档的内容通过FCK录入到数据库的一个clob字段中,然后分别通过上面三种方法读取,前两种方法用的时间差 不多都是4秒,第三种方法用了三分多钟。不过前两种方法没有考虑数据非常大的情况,一般情况下是够用了(一部小说没问题)。
网络错误503请刷新页面重试持续报错请尝试更换浏览器或网络环境
java读取 clob字段的几种方法
最近频繁处理clob字段,故集中了几种读取clob字段的方法,供大家参考。
第一种:
Clob clob = rs.getClob("remark");//java.sql.Clob String detailinfo = ""; if(clob != null){ detailinfo = clob.getSubString((long)1,(int)clob.length()); }
第二种:
Clob clob = rs.getClob("remark");//java.sql.Clob int i = 0; if(clob != null){ InputStream input = clob.getAsciiStream(); int len = (int)clob.length(); byte by[] = new byte[len]; while(-1 != (i = input.read(by, 0, by.length))){ input.read(by, 0, i); } detailinfo = new String(by, "utf-8"); }
巧妙解决OracleNClob读写问题(经验分享)
巧妙解决OracleNClob读写问题(经验分享)最近⼀个新项⽬中,尝试在 Oracle 数据库中使⽤ NCLOB 来保存⼤的 xml 字符串。
在代码⾃动⽣成⼯具(通过 JDBC 驱动程序,读数据库表结构,⾃动⽣成对应的 java 代码,包含增加、删除、修改、分页查询、根据主键查找等前台 html/js、后台代码 java),将 NCLOB 字段映射到 String 类型。
运⾏代码,⽆报错。
使⽤ SQuirreL SQL 客户端查看数据,觉察数据未保存成功。
⽹上搜⼀通,有提到⽤ SetBigStringTryClob 的数据库连接额外属性的。
总觉得好傻。
也有提到⽤ setStringForClob ⽅法的,也⽐较笨。
最后在 Oracle 官⽹上,找到⼀个更好的办法:升级 Oracle JDBC 驱动程序,直接⽤ java JDBC 标准的 setString 函数,保存成功!对应⽹址:⾥⾯提到:In Oracle Database 11g release 2 (11.2), the setBytes, setBinaryStream, setString, setCharacterStream, and setAsciiStream methods of PreparedStatement are extended to enhance the ability to work with BLOB, CLOB, and NCLOB target columns. ...The SetBigStringTryClob connection property of Oracle Database 10g Release 1 (10.1) is no longer used or needed. ...----------------------------以上这篇巧妙解决Oracle NClob读写问题(经验分享)就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
java将长度很长的字符串(巨大字符串超过4000字节)插入oracle的clob字段时会。。。
String sql = "insert into table(request_id,table_name,total_number,search_result,create_time,flag) values (?,?,?,?,to_date(?,'yyyy-MM-dd HH24:mi:ss'),?)"; Connection dbcon = DB.getInstance().getConnection(); dbcon = dbutils.db.getConnection(); // dbcon.setAutoCommit(false); CLOB clob = new CLOB((OracleConnection)dbcon); clob = oracle.sql.CLOB.createTemporary((OracleConnection)dbcon,true,1); clob.setString(1,search_result); OracleConnection OCon = (OracleConnection)dbcon; OraclePreparedStatement ps = (OraclePreparedStatement)OCon.prepareCall(sql);
ps.executeUpdate(); ps.close(); ps = null;
Java操作Clob,很实用
JAVA完全控制Oracle中BLOB、CLOB说明网络上很多关于JAVA对Oracle中BLOB、CLOB类型字段的操作说明,有的不够全面,有的不够准确,甚至有的简直就是胡说八道。
最近的项目正巧用到了这方面的知识,在这里做个总结。
环境:Database: Oracle 9iApp Server: BEA Weblogic 8.14表结构:CREATE TABLE TESTBLOB (ID Int, NAME Varchar2(20), BLOBATTR Blob)CREATE TABLE TESTBLOB (ID Int, NAME Varchar2(20), CLOBATTR Clob)JAVA可以通过JDBC,也可以通过JNDI访问并操作数据库,这两种方式的具体操作存在着一些差异,由于通过App Server的数据库连接池JNDI获得的数据库连接提供的java.sql.Blob和java.sql.Clob实现类与JDBC方式提供的不同,因此在入库操作的时候需要分别对待;出库操作没有这种差异,因此不用单独对待。
一、BLOB操作1、入库(1)JDBC方式//通过JDBC获得数据库连接Class.forName("oracle.jdbc.driver.OracleDriver");Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:testdb", "test", "test");con.setAutoCommit(false);Statement st = con.createStatement();//插入一个空对象empty_blob()st.executeUpdate("insert into TESTBLOB (ID, NAME, BLOBATTR) values (1, "thename", empty_blob())");//锁定数据行进行更新,注意“for update”语句ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1 for update");if (rs.next()){//得到java.sql.Blob对象后强制转换为oracle.sql.BLOBoracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob("BLOBATTR");OutputStream outStream = blob.getBinaryOutputStream();//data是传入的byte数组,定义:byte[] dataoutStream.write(data, 0, data.length);}outStream.flush();outStream.close();mit();(2)JNDI方式//通过JNDI获得数据库连接Context context = new InitialContext();ds = (DataSource) context.lookup("ORA_JNDI");Connection con = ds.getConnection();con.setAutoCommit(false);Statement st = con.createStatement();//插入一个空对象empty_blob()st.executeUpdate("insert into TESTBLOB (ID, NAME, BLOBATTR) values (1, "thename", empty_blob())");//锁定数据行进行更新,注意“for update”语句ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1 for update");if (rs.next()){//得到java.sql.Blob对象后强制转换为weblogic.jdbc.vendor.oracle.OracleThinBlob(不同的App Server对应的可能会不同)weblogic.jdbc.vendor.oracle.OracleThinBlob blob = (weblogic.jdbc.vendor.oracle.OracleThinBlob) rs.getBlob("BLOBATTR");OutputStream outStream = blob.getBinaryOutputStream();//data是传入的byte数组,定义:byte[] dataoutStream.write(data, 0, data.length);}outStream.flush();outStream.close();mit();con.close();2、出库//获得数据库连接Connection con = ConnectionFactory.getConnection();con.setAutoCommit(false);Statement st = con.createStatement();//不需要“for update”ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1");if (rs.next()){java.sql.Blob blob = rs.getBlob("BLOBATTR");InputStream inStream = blob.getBinaryStream();//data是读出并需要返回的数据,类型是byte[]data = new byte[input.available()];inStream.read(data);inStream.close();}inStream.close();con.close();二、CLOB操作1、入库(1)JDBC方式//通过JDBC获得数据库连接Class.forName("oracle.jdbc.driver.OracleDriver");Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:testdb", "test", "test");con.setAutoCommit(false);Statement st = con.createStatement();//插入一个空对象empty_clob()st.executeUpdate("insert into TESTCLOB (ID, NAME, CLOBATTR) values (1, "thename", empty_clob())");//锁定数据行进行更新,注意“for update”语句ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1 for update");if (rs.next()){//得到java.sql.Clob对象后强制转换为oracle.sql.CLOBoracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob("CLOBATTR");Writer outStream = clob.getCharacterOutputStream();//data是传入的字符串,定义:String datachar[] c = data.toCharArray();outStream.write(c, 0, c.length);}outStream.flush();outStream.close();mit();con.close();(2)JNDI方式//通过JNDI获得数据库连接Context context = new InitialContext();ds = (DataSource) context.lookup("ORA_JNDI");Connection con = ds.getConnection();con.setAutoCommit(false);Statement st = con.createStatement();//插入一个空对象empty_clob()st.executeUpdate("insert into TESTCLOB (ID, NAME, CLOBATTR) values (1, "thename", empty_clob())");//锁定数据行进行更新,注意“for update”语句ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1 for update");if (rs.next()){//得到java.sql.Clob对象后强制转换为weblogic.jdbc.vendor.oracle.OracleThinClob(不同的App Server对应的可能会不同)weblogic.jdbc.vendor.oracle.OracleThinClob clob = (weblogic.jdbc.vendor.oracle.OracleThinClob) rs.getClob("CLOBATTR");Writer outStream = clob.getCharacterOutputStream();//data是传入的字符串,定义:String datachar[] c = data.toCharArray();outStream.write(c, 0, c.length);}outStream.flush();outStream.close();mit();con.close();2、出库//获得数据库连接Connection con = ConnectionFactory.getConnection();con.setAutoCommit(false);Statement st = con.createStatement();//不需要“for update”ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1");if (rs.next()){java.sql.Clob clob = rs.getClob("CLOBATTR");Reader inStream = clob.getCharacterStream();char[] c = new char[(int) clob.length()];inStream.read(c);//data是读出并需要返回的数据,类型是Stringdata = new String(c);inStream.close();}inStream.close();mit();con.close();需要注意的地方:1、java.sql.Blob、oracle.sql.BLOB、weblogic.jdbc.vendor.oracle.OracleThinBlob几种类型的区别2、java.sql.Clob、oracle.sql.CLOB、weblogic.jdbc.vendor.oracle.OracleThinClob几种类型的区别公司项目中的用法(博客):入库:先插一个oracle.sql.CLOB.empty_lob()进去,然后String updateBaseSourceSql = "select content from mb_baseSource where id = ? for update";conn.setAutoCommit(false);ps = conn.prepareStatement(updateBaseSourceSql);ps.setLong(1, result);ResultSet rs = ps.executeQuery();oracle.sql.CLOB clob = null;if (rs.next()) {clob = (oracle.sql.CLOB) rs.getClob(1);}Writer wr = clob.getCharacterOutputStream();wr.write(baseSource[4]);wr.flush();wr.close();rs.close();ps.close();mit();出库:findBaseSourceSql = "select content from mb_baseSource where id = ?";ps = conn.prepareStatement(findBaseSourceSql);ps.setLong(1, sourceID);rs = ps.executeQuery();if (rs.next()) {CLOB clob = (oracle.sql.CLOB) rs.getClob(1);if (clob != null) {Reader is = clob.getCharacterStream();BufferedReader br = new BufferedReader(is);String s = br.readLine();while (s != null) {result[6] += s;s = br.readLine();}}}rs.close();ps.close();conn.close();。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
package oracle.clob;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import oracle.jdbc.driver.OracleDriver;
import oracle.sql.CLOB;
public class ClobTest {
String url = "jdbc:oracle:thin:@192.168.2.157:1521:orcl";
String user = "xj";
String pwd = "xj";
String text = "这是要插入到CLOB里面的数据";
/**
* @throws ClassNotFoundException
* @throws SQLException
* 数据库里已经建好表CLOB_TEST(ID NUMBER,STR CLOB);
*/
private void clobImport() throws ClassNotFoundException, SQLException {
// TODO Auto-generated method stub
DriverManager.registerDriver(new OracleDriver());
Connection conn = DriverManager.getConnection(url, user, pwd);// 得到连接对象 String sql = "insert into clob_test(id,str) values ('1',?)";// 要执行的SQL语句
PreparedStatement stmt = conn.prepareStatement(sql);// 加载SQL语句
// PreparedStatement支持SQL带有问号?,可以动态替换?的内容。
Reader clobReader = new StringReader(text); // 将 text转成流形式
stmt.setCharacterStream(1, clobReader, text.length());// 替换sql语句中的?
int num = stmt.executeUpdate();// 执行SQL
if (num > 0) {
System.out.println("ok");
} else {
System.out.println("NO");
}
stmt.close();
conn.close();
}
private void clobExport() throws ClassNotFoundException, SQLException,
IOException {
// TODO Auto-generated method stub
CLOB clob = null;
String sql = "select * from clob_test where id=1";
DriverManager.registerDriver(new OracleDriver());
Connection conn = DriverManager.getConnection(url, user, pwd);// 得到连接对象
PreparedStatement stmt = conn.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
String id = "";
String content = "";
if (rs.next()) {
id = rs.getString("id");// 获得ID
clob = (oracle.sql.CLOB) rs.getClob("str"); // 获得CLOB字段str
// 注释:用 rs.getString("str")无法得到数据,返回的是 NULL;
content = ClobToString(clob);
}
stmt.close();
conn.close();
// 输出结果
System.out.println(id);
System.out.println(content);
}
// 将字CLOB转成STRING类型
public String ClobToString(CLOB clob) throws SQLException, IOException {
String reString = "";
Reader is = clob.getCharacterStream();// 得到流
BufferedReader br = new BufferedReader(is);
String s = br.readLine();
StringBuffer sb = new StringBuffer();
while (s != null) {// 执行循环将字符串全部取出付值给StringBuffer由StringBuffer转成STRING
sb.append(s);
s = br.readLine();
}
reString = sb.toString();
return reString;
}
/**
* @param args
* @throws IOException
* @throws SQLException
* @throws ClassNotFoundException
*/
// TODO Auto-generated method stub
public static void main(String[] args) throws IOException,
ClassNotFoundException, SQLException {
// TODO Auto-generated method stub
ClobTest clobtest = new ClobTest();
// read file
FileReader _frd = new FileReader(new File("D:\\DOS.txt")); BufferedReader _brd = new BufferedReader(_frd);
String _rs = _brd.readLine();
StringBuffer _input = new StringBuffer();
while (_rs != null) {
_input.append(_rs);
_rs = _brd.readLine();
}
// System.out.println(_input.toString());
// 输入测试
clobtest.text = _input.toString();
clobtest.clobImport();
// 输出测试
// clobtest.clobExport();
}
}。