Oracle BLOB & Java
От: Аноним  
Дата: 23.06.04 07:48
Оценка:
Ктонибудь пробовал запихивать блобы(файлы) в oracle из java и выуживать их потом оттудава?
Был бы очень признателен, если бы кинули пример кода.
Re: Oracle BLOB & Java
От: _joker Россия  
Дата: 23.06.04 08:11
Оценка: 1 (1)
А>Ктонибудь пробовал запихивать блобы(файлы) в oracle из java и выуживать их потом оттудава?
А>Был бы очень признателен, если бы кинули пример кода.

выдрал из своего класса...
думаю разбрешься, там xml-ник запихивается и читается из ClOB'a

    /*
     * Read template xml from database and write it in stream <code>out</code>
     */
    public boolean     readTemplateXML(int aProjectID, int aUserID, OutputStream out) throws UserProjectsDAOException{

        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            conn = DB.getConnection();
            conn.setAutoCommit(false);

            // "SELECT TEMPLATEXML FROM Projects WHERE ProjectID=? AND UserID=?"
            ps = conn.prepareStatement(DBQuery[7]);
            ps.setInt(1, aProjectID);
            ps.setInt(2, aUserID);

            rs = ps.executeQuery();
            System.out.println("Select CLOB........................................[OK]");

            CLOB clob = null;
            InputStream inputstream = null;

            if (rs.next()) {

                clob = ((oracle.jdbc.driver.OracleResultSet) rs).getCLOB(1);
                System.out.println("Get CLOB......................................[OK]");

                // outstream = clob.getBinaryOutputStream();
                //outstream = clob.getAsciiOutputStream();
                inputstream = clob.getAsciiStream();

                int size = clob.getBufferSize();
                byte[] buffer = new byte[size];
                int length = -1;

                while ((length = inputstream.read(buffer)) != -1)
                    out.write(buffer, 0, length);
                //out.close();
                conn.commit();
            }
            conn.setAutoCommit(true);

        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (rs != null) rs.close();
                if (ps != null) ps.close();
                if (conn != null) conn.close();

            } catch (SQLException e) {
                e.printStackTrace();
            }
        }


        return true;
    }


    /**
     *  Insert text data from page to CLOB
     */
    public int         addTemplateXMLText(int aProjectID, int aUserID, String aXMLPageid, InputStream in) throws UserProjectsDAOException{

        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        int id=0;
        try {
            conn = DB.getConnection();
            conn.setAutoCommit(false);

            // get TextID from  ProjectText_SQ.NEXTVAL
            //"SELECT ProjectText_SQ.NEXTVAL FROM DUAL"
            ps = conn.prepareStatement(DBQuery[0]);
            rs = ps.executeQuery();
            if(!rs.next()) throw new UserProjectsDAOException("Can't get " + DBQuery[0] + "value");
            id = rs.getInt(1);
            rs.close();
            ps.close();
            System.out.println("NEXTVAL=" + id);
            conn.commit();

            // "INSERT INTO ProjectText(TextID,ProjectID,UserID,PAGETEXT,PageID) VALUES(?,?,?,EMPTY_BLOB(),?)"
            ps = conn.prepareStatement(DBQuery[1]);
            ps.setInt(1, id);
            ps.setInt(2, aProjectID);
            ps.setInt(3, aUserID);
            ps.setString(4, aXMLPageid);

            ps.executeUpdate();
            ps.close();
            System.out.println("Inserted empty CLOB...................................[OK]");

            // "SELECT PAGETEXT FROM ProjectText WHERE TextID=? for update"
            ps = conn.prepareStatement(DBQuery[2]);
            ps.setInt(1,id);
            rs = ps.executeQuery();
            System.out.println("Select CLOB........................................[OK]");
            System.out.println("aProjectID=" + aProjectID);
            System.out.println("aUserID=" + aUserID);


            CLOB clob = null;
            OutputStream outstream = null;

            if (rs.next()) {

                clob = ((oracle.jdbc.driver.OracleResultSet) rs).getCLOB(1);
                System.out.println("Get CLOB......................................[OK]");

                // outstream = clob.getBinaryOutputStream();
                outstream = clob.getAsciiOutputStream();

                int size = clob.getBufferSize();
                byte[] buffer = new byte[size];
                int length = -1;

                while ((length = in.read(buffer)) != -1)
                    outstream.write(buffer, 0, length);
                outstream.close();
                conn.commit();
            }
            conn.setAutoCommit(true);

        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (rs != null) rs.close();
                if (ps != null) ps.close();
                if (conn != null) conn.close();

            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        return id;
    }
Re: Oracle BLOB & Java
От: dshe  
Дата: 23.06.04 08:20
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Ктонибудь пробовал запихивать блобы(файлы) в oracle из java и выуживать их потом оттудава?

А>Был бы очень признателен, если бы кинули пример кода.

Вычитывать как обычно, а записывать нужно в 2 этапа:
1. вставить empty_blob()
2. вычитать этот blob select'ом "for update" и потом в него записывать.

вот несколько примеров того, как это можно сделать


http://otn.oracle.com/sample_code/tech/java/sqlj_jdbc/files/advanced/LOBSample/Readme.html


http://wamoz.com/JDBC_and_Oracle_LOB.asp


http://forum.java.sun.com/thread.jsp?thread=525923&amp;forum=31&amp;message=2522468
public static void setBlob(Connection connection, InputStream inputStream, String tableName, 
String columnName, String recordID) throws SQLException, IOException {
   Statement statement = connection.createStatement();
   ResultSet resultSet = statement.executeQuery("SELECT ID, "+columnName+" FROM "+tableName+" WHERE ID='"+recordID+"' FOR UPDATE");
   resultSet.next();
   oracle.sql.BLOB blobDest = (oracle.sql.BLOB) ((OracleResultSet) resultSet).getBlob(2); 
   byte[] buffer = new byte[ blobDest.getBufferSize() ];
   OutputStream outputStream = blobDest.getBinaryOutputStream();
   int length = -1;
   while ((length = inputStream.read(buffer)) != -1) {
      outputStream.write(buffer,0,length);
      outputStream.flush();
   }
   statement.close();
   outputStream.close();
   inputStream.close();
   resultSet.close(); 
}



http://www.idevelopment.info/data/Oracle/DBA_tips/Java/JAVA_20.shtml

--
Дмитро
Re[2]: Oracle BLOB & Java
От: Аноним  
Дата: 23.06.04 09:48
Оценка:
Здравствуйте, _joker, Вы писали:


А>>Ктонибудь пробовал запихивать блобы(файлы) в oracle из java и выуживать их потом оттудава?

А>>Был бы очень признателен, если бы кинули пример кода.

_>выдрал из своего класса...

_>думаю разбрешься, там xml-ник запихивается и читается из ClOB'a


Спасибо большое, с CLOB я уже разобрался — вроде работает, но вот у меня проблемка именно с BLOBом.
Re[2]: Oracle BLOB & Java
От: Аноним  
Дата: 23.06.04 10:17
Оценка:
Здравствуйте, dshe, Вы писали:

D>Здравствуйте, Аноним, Вы писали:


А>>Ктонибудь пробовал запихивать блобы(файлы) в oracle из java и выуживать их потом оттудава?

А>>Был бы очень признателен, если бы кинули пример кода.

D>Вычитывать как обычно, а записывать нужно в 2 этапа:

D>1. вставить empty_blob()
D>2. вычитать этот blob select'ом "for update" и потом в него записывать.

D>public static void setBlob(Connection connection, InputStream inputStream, String tableName,

D>String columnName, String recordID) throws SQLException, IOException {
D> Statement statement = connection.createStatement();
D> ResultSet resultSet = statement.executeQuery("SELECT ID, "+columnName+" FROM "+tableName+" WHERE ID='"+recordID+"' FOR UPDATE");
D> resultSet.next();
D> oracle.sql.BLOB blobDest = (oracle.sql.BLOB) ((OracleResultSet) resultSet).getBlob(2);
D> byte[] buffer = new byte[ blobDest.getBufferSize() ];
D> OutputStream outputStream = blobDest.getBinaryOutputStream();
D> int length = -1;
D> while ((length = inputStream.read(buffer)) != -1) {
D> outputStream.write(buffer,0,length);
D> outputStream.flush();
D> }
D> statement.close();
D> outputStream.close();
D> inputStream.close();
D> resultSet.close();

Спасибо, что обратил на меня внимание.

То что в 2 этапа — это я допер. Мне бы нада файл с винта (например, картинку) запихать в этот самый BLOB. Для этого мне нада этот файл считать, привести его в массив байтов, подсунуть переменной типа BLOB этот массив и с помощью update запихать эту переменную в поле БД типа BLOB? Или я чота совсем глюкаю?
Re[2]: Oracle BLOB & Java
От: Аноним  
Дата: 23.06.04 11:36
Оценка:
Здравствуйте, dshe, Вы писали:

D>Здравствуйте, Аноним, Вы писали:


А>>Ктонибудь пробовал запихивать блобы(файлы) в oracle из java и выуживать их потом оттудава?

А>>Был бы очень признателен, если бы кинули пример кода.

Все, спасибо, разобрался — заработало Твои ссылки очень помогли.
Re[2]: Oracle BLOB & Java
От: star0ff  
Дата: 17.09.04 07:57
Оценка:
Здравствуйте, dshe, Вы писали:

D>Здравствуйте, Аноним, Вы писали:


А>>Ктонибудь пробовал запихивать блобы(файлы) в oracle из java и выуживать их потом оттудава?

А>>Был бы очень признателен, если бы кинули пример кода.

D>Вычитывать как обычно, а записывать нужно в 2 этапа:

D>1. вставить empty_blob()
D>2. вычитать этот blob select'ом "for update" и потом в него записывать.

D>вот несколько примеров того, как это можно сделать

D>

D>http://otn.oracle.com/sample_code/tech/java/sqlj_jdbc/files/advanced/LOBSample/Readme.html
D>

D>http://wamoz.com/JDBC_and_Oracle_LOB.asp
D>

D>http://forum.java.sun.com/thread.jsp?thread=525923&amp;forum=31&amp;message=2522468
D>
D>public static void setBlob(Connection connection, InputStream inputStream, String tableName, 
D>String columnName, String recordID) throws SQLException, IOException {
D>   Statement statement = connection.createStatement();
D>   ResultSet resultSet = statement.executeQuery("SELECT ID, "+columnName+" FROM "+tableName+" WHERE ID='"+recordID+"' FOR UPDATE");
D>   resultSet.next();
D>   oracle.sql.BLOB blobDest = (oracle.sql.BLOB) ((OracleResultSet) resultSet).getBlob(2); 
D>   byte[] buffer = new byte[ blobDest.getBufferSize() ];
D>   OutputStream outputStream = blobDest.getBinaryOutputStream();
D>   int length = -1;
D>   while ((length = inputStream.read(buffer)) != -1) {
D>      outputStream.write(buffer,0,length);
D>      outputStream.flush();
D>   }
D>   statement.close();
D>   outputStream.close();
D>   inputStream.close();
D>   resultSet.close(); 
D>}
D>

D>

D>http://www.idevelopment.info/data/Oracle/DBA_tips/Java/JAVA_20.shtml
D>

А для случая когда у нас есть plsql процедура и нужно воспользоваться ей?
Например есть процедура putBlob(blob_id IN number, blob_data IN number), как с помощью java метода можно передать в нее blob?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.