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

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: How To Unlock Everything In MyRise
1 months 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)

How to check tablespace size of oracle How to check tablespace size of oracle Apr 11, 2025 pm 08:15 PM

To query the Oracle tablespace size, follow the following steps: Determine the tablespace name by running the query: SELECT tablespace_name FROM dba_tablespaces; Query the tablespace size by running the query: SELECT sum(bytes) AS total_size, sum(bytes_free) AS available_space, sum(bytes) - sum(bytes_free) AS used_space FROM dba_data_files WHERE tablespace_

How to encrypt oracle view How to encrypt oracle view Apr 11, 2025 pm 08:30 PM

Oracle View Encryption allows you to encrypt data in the view, thereby enhancing the security of sensitive information. The steps include: 1) creating the master encryption key (MEk); 2) creating an encrypted view, specifying the view and MEk to be encrypted; 3) authorizing users to access the encrypted view. How encrypted views work: When a user querys for an encrypted view, Oracle uses MEk to decrypt data, ensuring that only authorized users can access readable data.

How to create a table in oracle How to create a table in oracle Apr 11, 2025 pm 08:00 PM

Creating an Oracle table involves the following steps: Use the CREATE TABLE syntax to specify table names, column names, data types, constraints, and default values. The table name should be concise and descriptive, and should not exceed 30 characters. The column name should be descriptive, and the data type specifies the data type stored in the column. The NOT NULL constraint ensures that null values ​​are not allowed in the column, and the DEFAULT clause specifies the default values ​​for the column. PRIMARY KEY Constraints to identify the unique record of the table. FOREIGN KEY constraint specifies that the column in the table refers to the primary key in another table. See the creation of the sample table students, which contains primary keys, unique constraints, and default values.

How to import oracle database How to import oracle database Apr 11, 2025 pm 08:06 PM

Data import method: 1. Use the SQLLoader utility: prepare data files, create control files, and run SQLLoader; 2. Use the IMP/EXP tool: export data, import data. Tip: 1. Recommended SQL*Loader for big data sets; 2. The target table should exist and the column definition matches; 3. After importing, data integrity needs to be verified.

How to view instance name of oracle How to view instance name of oracle Apr 11, 2025 pm 08:18 PM

There are three ways to view instance names in Oracle: use the "sqlplus" and "select instance_name from v$instance;" commands on the command line. Use the "show instance_name;" command in SQL*Plus. Check environment variables (ORACLE_SID on Linux) through the operating system's Task Manager, Oracle Enterprise Manager, or through the operating system.

How to uninstall Oracle installation failed How to uninstall Oracle installation failed Apr 11, 2025 pm 08:24 PM

Uninstall method for Oracle installation failure: Close Oracle service, delete Oracle program files and registry keys, uninstall Oracle environment variables, and restart the computer. If the uninstall fails, you can uninstall manually using the Oracle Universal Uninstall Tool.

How to get time in oracle How to get time in oracle Apr 11, 2025 pm 08:09 PM

There are the following methods to get time in Oracle: CURRENT_TIMESTAMP: Returns the current system time, accurate to seconds. SYSTIMESTAMP: More accurate than CURRENT_TIMESTAMP, to nanoseconds. SYSDATE: Returns the current system date, excluding the time part. TO_CHAR(SYSDATE, 'YYY-MM-DD HH24:MI:SS'): Converts the current system date and time to a specific format. EXTRACT: Extracts a specific part from a time value, such as a year, month, or hour.

How to read the oracle awr report How to read the oracle awr report Apr 11, 2025 pm 09:45 PM

An AWR report is a report that displays database performance and activity snapshots. The interpretation steps include: identifying the date and time of the activity snapshot. View an overview of activities and resource consumption. Analyze session activities to find session types, resource consumption, and waiting events. Find potential performance bottlenecks such as slow SQL statements, resource contention, and I/O issues. View waiting events, identify and resolve them for performance. Analyze latch and memory usage patterns to identify memory issues that are causing performance issues.

See all articles