Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 BLOB to Long RAW  [new]
Sergey Sokolov
Member

Откуда:
Сообщений: 76
Возможно это уже и обсуждалось, но целостного решения я не нашел.
Помогите, как имея таблицу с BLOB данные перенести в таблицу с полем Long RAW
Скорее всего на Java, как я понимаю, но как ни крутил, не выходит. От Long RAW отказаться нет возможности. Задача не обноразовая, экспор-импорт, copy из SQL не подходят.

Спасибо.
9 мар 10, 17:07    [8450890]     Ответить | Цитировать Сообщить модератору
 Re: BLOB to Long RAW  [new]
comphead
Member

Откуда: Киев
Сообщений: 3390
Sergey Sokolov,

я делал парсингом через строку.
utl_raw.cast_to_varchar2
и ржеешь по 32K
9 мар 10, 17:13    [8450939]     Ответить | Цитировать Сообщить модератору
 Re: BLOB to Long RAW  [new]
comphead
Member

Откуда: Киев
Сообщений: 3390
Sergey Sokolov,

https://www.sql.ru/forum/actualthread.aspx?tid=119831
9 мар 10, 17:20    [8451018]     Ответить | Цитировать Сообщить модератору
 Re: BLOB to Long RAW  [new]
Elic
Member

Откуда:
Сообщений: 29990
comphead
https://www.sql.ru/forum/actualthread.aspx?tid=119831
Ты туда-сюда попутал :)
9 мар 10, 17:23    [8451053]     Ответить | Цитировать Сообщить модератору
 Re: BLOB to Long RAW  [new]
comphead
Member

Откуда: Киев
Сообщений: 3390
Elic,

там два примера. в обе стороны.
9 мар 10, 17:25    [8451072]     Ответить | Цитировать Сообщить модератору
 Re: BLOB to Long RAW  [new]
comphead
Member

Откуда: Киев
Сообщений: 3390
Elic,
точно. два примера raw в блоб
9 мар 10, 17:26    [8451084]     Ответить | Цитировать Сообщить модератору
 Re: BLOB to Long RAW  [new]
D_i_m_a_Z
Member

Откуда: Тирасполь
Сообщений: 24
Посмотри тут...может поможет
https://www.sql.ru/forum/actualthread.aspx?tid=720530
9 мар 10, 17:37    [8451159]     Ответить | Цитировать Сообщить модератору
 Re: BLOB to Long RAW  [new]
Sergey Sokolov
Member

Откуда:
Сообщений: 76
comphead
Sergey Sokolov,

я делал парсингом через строку.
utl_raw.cast_to_varchar2
и ржеешь по 32K


А подробнее можно? И попутно вопрос, не будет ли потери при преобразовании в varchar2?
9 мар 10, 17:41    [8451178]     Ответить | Цитировать Сообщить модератору
 Re: BLOB to Long RAW  [new]
Sergey Sokolov
Member

Откуда:
Сообщений: 76
Так что, никто подобного не делал?
10 мар 10, 12:25    [8454643]     Ответить | Цитировать Сообщить модератору
 Re: BLOB to Long RAW  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Sergey Sokolov
Так что, никто подобного не делал?

серверным приложением в это сделать не сможете принципиально.
клиентским (~любым в т.ч. и живущим на сервере) - в полтычка, без проблем.

а вообще, бросьте вы это:
автор
От Long RAW отказаться нет возможности.
10 мар 10, 13:14    [8455119]     Ответить | Цитировать Сообщить модератору
 Re: BLOB to Long RAW  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7862
Sergey Sokolov
Возможно это уже и обсуждалось, но целостного решения я не нашел.
Помогите, как имея таблицу с BLOB данные перенести в таблицу с полем Long RAW
Скорее всего на Java, как я понимаю, но как ни крутил, не выходит.


create sequence SQ_TEST_LONG;

create table TEST_LONG (
    test_long_id number(9)
  , lrdata       long raw
  , constraint PK_TEST_LONG primary key (test_long_id)
);
create or replace and compile java source named "LongUtil" as
import oracle.jdbc.OracleDriver;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class LongUtil {

  public static void blob2LongRaw(Blob blob)
    throws SQLException, IOException {

    Connection con = null;
    PreparedStatement pst = null;
    try {
      con = new OracleDriver().defaultConnection();

      pst = con.prepareStatement(
        "insert into TEST_LONG (test_long_id, lrdata) values (SQ_TEST_LONG.nextval, ?)"
      );

      InputStream in = null;
      try {
        in = new BufferedInputStream(blob.getBinaryStream());
        pst.setBinaryStream(1, in, (int) blob.length());
        pst.execute();
      } finally {
        if (in != null) {in.close();}
      }
    } finally {
      if (pst != null) {pst.close();}
      if (con != null) {con.close();}
    }
  }
}
/
create or replace procedure blob2LongRaw (p_blob blob) as
  language java name 'LongUtil.blob2LongRaw(java.sql.Blob)';
/

declare
   b blob;
begin
  b := utl_raw.cast_to_raw(rpad('X', 2000, 'X'));
  blob2LongRaw(b);
  commit;
end;
/
select * from TEST_LONG;
10 мар 10, 13:21    [8455188]     Ответить | Цитировать Сообщить модератору
 Re: BLOB to Long RAW  [new]
Sergey Sokolov
Member

Откуда:
Сообщений: 76
Denis Popov - огромное спасибо, немного подточил под свои нужды и все заработало
10 мар 10, 14:44    [8455959]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: BLOB to Long RAW  [new]
Sten Rostov
Member

Откуда:
Сообщений: 12
здравствуйте,

не поможете решить проблему resultset (rs)?

В базе есть поле BLOB и LONG RAW. После SELECT * FROM поля BLOB rs.getBinaryStream(i) все ОК, но при попытке rs.getBinaryStream(i) на поле LONG RAW ошибка: Stream уже закрыт. Если селектировать только одно из полей BLOB или LONG, то проблем опять нет.

Значит resultset, как-то из не разделяет? Спасибо за люб7ую помощь или ссылку...
21 окт 13, 17:12    [15009800]     Ответить | Цитировать Сообщить модератору
 Re: BLOB to Long RAW  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7862
Sten Rostov
В базе есть поле BLOB и LONG RAW. После SELECT * FROM поля BLOB rs.getBinaryStream(i) все ОК, но при попытке rs.getBinaryStream(i) на поле LONG RAW ошибка: Stream уже закрыт. Если селектировать только одно из полей BLOB или LONG, то проблем опять нет.

Значит resultset, как-то из не разделяет? Спасибо за люб7ую помощь или ссылку...

Уверен? Вроде все работает:
+ LongRawTest
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;

public class LongRawTest {

  public static void main(String args[])
    throws Exception {
    DriverManager.registerDriver(new oracle.jdbc.OracleDriver());

    Connection con = DriverManager.getConnection(...);

    Statement st = con.createStatement();
    try {
      st.execute("drop table TEST_LOB");
    } catch (SQLException e) {}
    st.execute("create table TEST_LOB(bdata blob, lrdata long raw)");

    st.execute(
      "insert into TEST_LOB(bdata, lrdata)\n" +
      "values (utl_raw.cast_to_raw(rpad('q', 100, 'Q')), utl_raw.cast_to_raw(rpad('q', 200, 'Q')))"
    );

    ResultSet rs = st.executeQuery("select bdata, lrdata from TEST_LOB");
    while (rs.next()) {
      readStream(rs.getBinaryStream("bdata"));
      readStream(rs.getBinaryStream("lrdata"));
    }
    rs.close();
    st.close();
    con.close();
  }

  static void readStream(InputStream io)
    throws IOException {
    byte[] buffer = new byte[100];
    int length, sum = 0;
    while ((length = io.read(buffer)) >= 0) {
      sum += length;
    }
    System.out.println("Read bytes: " + sum);
    io.close();
  }
}
21 окт 13, 18:00    [15010154]     Ответить | Цитировать Сообщить модератору
 Re: BLOB to Long RAW  [new]
Sten Rostov
Member

Откуда:
Сообщений: 12
Denis Popov,

Попробовал тестить... не идет... ошибка та же... Может что-то с трайберами? С двумя BLOB полями - все без проблем.



java.sql.SQLException: Stream wurde schon geschlossen
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:113)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:147)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:209)
at oracle.jdbc.driver.LongRawAccessor.getBinaryStream(LongRawAccessor.java:341)
at oracle.jdbc.driver.OracleResultSetImpl.getBinaryStream(OracleResultSetImpl.java:892)
at oracle.jdbc.driver.OracleResultSet.getBinaryStream(OracleResultSet.java:1700)
21 окт 13, 18:13    [15010222]     Ответить | Цитировать Сообщить модератору
 Re: BLOB to Long RAW  [new]
Sten Rostov
Member

Откуда:
Сообщений: 12
Вырезал просто кусок кода:

while (rs.next()) {
readStream(rs.getBinaryStream("COL_BLOB"));
readStream(rs.getBinaryStream("COL_LONGRAW"));
}

с функцией, конечно...
21 окт 13, 18:14    [15010227]     Ответить | Цитировать Сообщить модератору
 Re: BLOB to Long RAW  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7862
Версия Oracle JDBC - драйвера какая?
21 окт 13, 18:26    [15010279]     Ответить | Цитировать Сообщить модератору
 Re: BLOB to Long RAW  [new]
Sten Rostov
Member

Откуда:
Сообщений: 12
причем rs != null и показывает size > 0, но в следующей строке rs.getBinaryStream все равно ошибка с этим закрытым stream

InputStream ISS = null;
if (!rs.wasNull()) {
LOG.debug("Size = " + rs.getMetaData().getPrecision(i));
ISS = rs.getBinaryStream(i);
}
21 окт 13, 18:31    [15010300]     Ответить | Цитировать Сообщить модератору
 Re: BLOB to Long RAW  [new]
Sten Rostov
Member

Откуда:
Сообщений: 12
Denis Popov,

ojdbc14-10.2.0.5.0.jar
21 окт 13, 18:33    [15010312]     Ответить | Цитировать Сообщить модератору
 Re: BLOB to Long RAW  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7862

On 21.10.2013 19:33, Sten Rostov wrote:

> ojdbc14-10.2.0.5.0.jar

Поновее можешь взять? Иди попробуй еще другие методы:

- ResultSet.getBytes()
- в оракловой реализации oracle.jdbc.OracleResultSet есть свои методы вроде getBLOB(), getRAW().

Posted via ActualForum NNTP Server 1.5

21 окт 13, 18:40    [15010350]     Ответить | Цитировать Сообщить модератору
 Re: BLOB to Long RAW  [new]
Sten Rostov
Member

Откуда:
Сообщений: 12
Denis Popov,

Понял. Спасибо.

Сейчас попробовал с трайбером ojdbc6_V12.jar, вероятно еще старее и с ним вроде бы идет. Значит все-таки проблеба из-за трайберов... а я на них и не грешил. LONG RAW вроде бы уже не используют, возможно как раз с новыми и не идет?
21 окт 13, 18:55    [15010396]     Ответить | Цитировать Сообщить модератору
 Re: BLOB to Long RAW  [new]
Sten Rostov
Member

Откуда:
Сообщений: 12
Вообще-то пишу tool, чтобы считать oracle базу на носителъ информации - .txt или binär чтобы потом загнать ее опять в базу у клиенты.

Может быть есть другой подход для передачи данных? Может есть какой-то общий совет?
21 окт 13, 18:58    [15010408]     Ответить | Цитировать Сообщить модератору
 Re: BLOB to Long RAW  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7862

On 21.10.2013 19:55, Sten Rostov wrote:

> Сейчас попробовал с трайбером ojdbc6_V12.jar, вероятно еще старее и с ним вроде бы идет. Значит все-таки проблеба из-за
> трайберов... а я на них и не грешил. LONG RAW вроде бы уже не используют, возможно как раз с новыми и не идет?

Кто такие "трайберы"? А ojdbc6_V12.jar наоборот может оказаться новее ojdbc14-10.2.0.5.0.jar, из-за смены именования:
ojdbc14 означает Java 1.4, которая была намного раньше Java 6.

Posted via ActualForum NNTP Server 1.5

21 окт 13, 19:02    [15010420]     Ответить | Цитировать Сообщить модератору
 Re: BLOB to Long RAW  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51786

Sten Rostov
Может быть есть другой подход для передачи данных?

exp тут - imp там пробовал?..

Posted via ActualForum NNTP Server 1.5

21 окт 13, 19:05    [15010428]     Ответить | Цитировать Сообщить модератору
 Re: BLOB to Long RAW  [new]
Sten Rostov
Member

Откуда:
Сообщений: 12
Dimitry Sibiryakov
exp тут - imp там пробовал?..


я не совсем понял о чем это? ))
21 окт 13, 19:14    [15010447]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить