Home Database Mysql Tutorial Oracle中JDBC对BLOB和CLOB读取的专用处理和通用处理

Oracle中JDBC对BLOB和CLOB读取的专用处理和通用处理

Jun 07, 2016 pm 03:01 PM
blob clob jdbc oracle dedicated deal with

设有表: createtableblobimg(idintprimarykey,contentsblob); 一、BLOB入库的专用访问: 1)最常见于Oracle的JDBC示例中 一般是先通过select...forupdate锁定blob列,然后写入blob值,然后提交。要用到特定的OracleBLOB类。 Class.forName(oracle.jdbc.drive

Oracle中JDBC对BLOB和CLOB读取的专用处理和通用处理
设有表:
create table blobimg (id int primary key, contents blob);
一、BLOB入库的专用访问:
    1) 最常见于Oracle的JDBC示例中
    一般是先通过select  ... for update锁定blob列,然后写入blob值,然后提交。要用到特定的Oracle BLOB类。
    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();
    //插入一个空对象
    st.executeUpdate("insert into BLOBIMG  values(1,empty_blob())");
    //用for update方式锁定数据行
    ResultSet rs = st.executeQuery(
              "select contents from  BLOBIMG  where  id=1  for update");
    if (rs.next()) {
    //使用oracle.sql.BLOB类,没办法了,变成专用的了
    oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob(1).;
    //到数据库的输出流
    OutputStream outStream = blob.getBinaryOutputStream();
    //这里用一个文件模拟输入流
    File file = new File("d://proxy.txt");
    InputStream fin = new FileInputStream(file);
    //将输入流写到输出流
    byte[] b = new byte[blob.getBufferSize()];
    int len = 0;
    while ( (len = fin.read(b)) != -1) {
              outStream.write(b, 0, len);
    }
    //依次关闭
    fin.close();
    outStream.flush();
    outStream.close();
    }
    con.commit();
    con.close();
    
 2) 再厉害一点的,是通过调用DBMS_LOB包中的一些函数来处理,效率好像也不错.
 不过,要使用到存储过程,用到专用类OracleCallableStatement。
 例:
    import java.sql.*;
    import java.io.*;
    import oracle.jdbc.driver.*;
    import oracle.sql.*;
    class TestBlobWriteByDBMS_LOB {
    
        public static void main (String args []) throws SQLException , 
        FileNotFoundException, IOException
        {
            DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());
            Connection conn = 
                DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ora92","scott","tiger");
            conn.setAutoCommit(false);
            Statement stmt = conn.createStatement();
            stmt.execute( "delete from demo" );
            System.out.println( "deleted from demo" );
            stmt.execute( "insert into demo (id,theBlob) values (s_enr.nextval,empty_blob())" );
            conn.commit();
            System.out.println( "committed" );
            ResultSet rset = stmt.executeQuery ("SELECT theBlob FROM  demo where id = s_enr.currval  FOR UPDATE");
            System.out.println( "Executed Query" );
            if(rset.next())
            {
                System.out.println( "Fetched row " );
                BLOB l_mapBLOB = ((OracleResultSet)rset).getBLOB(1);
                File binaryFile = new File("e://free//jo.jpg");
                FileInputStream instream=new  FileInputStream(binaryFile);
                int chunk = 32000;
                
                System.out.println( "Chunk = "+ chunk );
                
                byte[] l_buffer = new byte[chunk];
                int l_nread = 0;
                
                OracleCallableStatement cstmt =
                    (OracleCallableStatement)conn.prepareCall( "begin dbms_lob.writeappend( :1, :2, :3 ); end;" );
                cstmt.registerOutParameter( 1, OracleTypes.BLOB );
                while ((l_nread= instream.read(l_buffer)) != -1) 
                {
                    cstmt.setBLOB(  1, l_mapBLOB );
                    cstmt.setInt(   2, l_nread );
                    cstmt.setBytes( 3, l_buffer );
                    cstmt.executeUpdate();
                    l_mapBLOB = cstmt.getBLOB(1);
                }
                instream.close();
                conn.commit();
                rset.close();
                stmt.close();
                conn.close();
            }
        }
    }
 

二、BLOB值读取的通用处理:
这个jdbc标准接口可以直接调用,因此比较简单,如下所示:
    Connection con = ConnectionFactory.getConnection();
    con.setAutoCommit(false);
    Statement st = con.createStatement();
    ResultSet rs = st.executeQuery("select contents from  BLOBIMG  where  id=1");
    if (rs.next()) {
        java.sql.Blob blob = rs.getBlob(1);
        InputStream ins = blob.getBinaryStream();
        //输出到文件
        File file = new File("d://output.txt");
        OutputStream fout = new FileOutputStream(file);
        //下面将BLOB数据写入文件
        byte[] b = new byte[1024];
        int len = 0;
        while ( (len = ins.read(b)) != -1) {
          fout.write(b, 0, len);
        }
        //依次关闭
        fout.close();
        ins.close();
    }    
    con.commit();
    con.close();

三、BLOB值写入的通用处理:
 这时要借助于PreparedStatement的动态绑定功能,借用其setObject()方法插入字节流到BLOB字段。
    
public void insertFile(File f) throws Exception{ 
        FileInputStream fis=new FileInputStream(f,Connection conn); 
        byte[] buffer=new byte[1024]; 
        data=null; 
        int sept=0;int len=0; 
        while((sept=fis.read(buffer))!=-1){ 
            if(data==null){ 
            len=sept; 
            data=buffer; 
            }else{ 
                byte[] temp; 
                int tempLength; 
                tempLength=len+sept; 
                temp=new byte[tempLength]; 
                System.arraycopy(data,0,temp,0,len); 
                System.arraycopy(buffer,0,temp,len,sept); 
                data=temp; 
                len=tempLength; 
            } 
            if(len!=data.length()){ 
            byte temp=new byte[len]; 
            System.arraycopy(data,0,temp,0,len); 
            data=temp; 
            } 
        } 
        String sql="insert into fileData (filename,blobData) value(?,?)"; 
        PreparedStatement ps=conn.prepareStatement(sql); 
        ps.setString(1,f.getName()); 
        ps.setObject(2,data); 
        ps.executeUpdate();
    }

四. CLOB读取的通用处理
    public static String getClobString(ResultSet rs, int col) { 
        try { 
            Clob c=resultSet.getClob(2); 
            Reader reader=c.getCharacterStream(): 
            if (reader == null) { 
                return null; 
            } 
            StringBuffer sb = new StringBuffer(); 
            char[] charbuf = new char[4096]; 
            for (int i = reader.read(charbuf); i > 0; i = reader.read(charbuf)) { 
                sb.append(charbuf, 0, i); 
            } 
            return sb.toString(); 
        } catch (Exception e) { 
            return ""; 
        } 
    }


当然还可以直接编写BLOB存取的存储过程供JDBC调用,那也非常方便。不过可能要用到外部LOB类型。这将在后边陆续进行介绍。
 

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Roblox: Bubble Gum Simulator Infinity - How To Get And Use Royal Keys
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Fusion System, Explained
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Hot Topics

Java Tutorial
1664
14
PHP Tutorial
1269
29
C# Tutorial
1248
24
What to do if the oracle can't be opened What to do if the oracle can't be opened Apr 11, 2025 pm 10:06 PM

Solutions to Oracle cannot be opened include: 1. Start the database service; 2. Start the listener; 3. Check port conflicts; 4. Set environment variables correctly; 5. Make sure the firewall or antivirus software does not block the connection; 6. Check whether the server is closed; 7. Use RMAN to recover corrupt files; 8. Check whether the TNS service name is correct; 9. Check network connection; 10. Reinstall Oracle software.

How to solve the problem of closing oracle cursor How to solve the problem of closing oracle cursor Apr 11, 2025 pm 10:18 PM

The method to solve the Oracle cursor closure problem includes: explicitly closing the cursor using the CLOSE statement. Declare the cursor in the FOR UPDATE clause so that it automatically closes after the scope is ended. Declare the cursor in the USING clause so that it automatically closes when the associated PL/SQL variable is closed. Use exception handling to ensure that the cursor is closed in any exception situation. Use the connection pool to automatically close the cursor. Disable automatic submission and delay cursor closing.

How to create cursors in oracle loop How to create cursors in oracle loop Apr 12, 2025 am 06:18 AM

In Oracle, the FOR LOOP loop can create cursors dynamically. The steps are: 1. Define the cursor type; 2. Create the loop; 3. Create the cursor dynamically; 4. Execute the cursor; 5. Close the cursor. Example: A cursor can be created cycle-by-circuit to display the names and salaries of the top 10 employees.

What steps are required to configure CentOS in HDFS What steps are required to configure CentOS in HDFS Apr 14, 2025 pm 06:42 PM

Building a Hadoop Distributed File System (HDFS) on a CentOS system requires multiple steps. This article provides a brief configuration guide. 1. Prepare to install JDK in the early stage: Install JavaDevelopmentKit (JDK) on all nodes, and the version must be compatible with Hadoop. The installation package can be downloaded from the Oracle official website. Environment variable configuration: Edit /etc/profile file, set Java and Hadoop environment variables, so that the system can find the installation path of JDK and Hadoop. 2. Security configuration: SSH password-free login to generate SSH key: Use the ssh-keygen command on each node

What to do if the oracle log is full What to do if the oracle log is full Apr 12, 2025 am 06:09 AM

When Oracle log files are full, the following solutions can be adopted: 1) Clean old log files; 2) Increase the log file size; 3) Increase the log file group; 4) Set up automatic log management; 5) Reinitialize the database. Before implementing any solution, it is recommended to back up the database to prevent data loss.

Oracle's Role in the Business World Oracle's Role in the Business World Apr 23, 2025 am 12:01 AM

Oracle is not only a database company, but also a leader in cloud computing and ERP systems. 1. Oracle provides comprehensive solutions from database to cloud services and ERP systems. 2. OracleCloud challenges AWS and Azure, providing IaaS, PaaS and SaaS services. 3. Oracle's ERP systems such as E-BusinessSuite and FusionApplications help enterprises optimize operations.

How to export oracle view How to export oracle view Apr 12, 2025 am 06:15 AM

Oracle views can be exported through the EXP utility: Log in to the Oracle database. Start the EXP utility, specifying the view name and export directory. Enter export parameters, including target mode, file format, and tablespace. Start exporting. Verify the export using the impdp utility.

How to stop oracle database How to stop oracle database Apr 12, 2025 am 06:12 AM

To stop an Oracle database, perform the following steps: 1. Connect to the database; 2. Shutdown immediately; 3. Shutdown abort completely.

See all articles