Копирование данных из столбца больших объектов в длинный необработанный столбец - PullRequest
0 голосов
/ 01 сентября 2011

Я искал запрос, который выбирает данные из таблицы, содержащей столбец Blob, и обновляет таблицу, имеющую столбец LONG RAW. Похоже, Oracle поддерживает только до 4000 символов. Есть ли способ скопировать полные данные из блоба в длинное сырье.

Я использовал следующий запрос

insert into APPDBA.QA_SOFTWARE_DUMMY 
     select SOFTWARE_ID, UPDATED_BY, CREATE_CHANGE_DATE, FILE_NAME,
            DBMS_LOB.SUBSTR(SOFTWARE_FILE, 4000) SOFTWARE_FILE, SOFTWARE_TYPE 
       from APPDBA.QA_SOFTWARE_DUMMY_TEST ;

, но DBMS_LOB.SUBSTR поддерживает до 4000 символов.

Любая помощь высоко ценится.

Ответы [ 2 ]

3 голосов
/ 01 сентября 2011

PL / SQL будет считывать / записывать только первые 32 КБ LONG RAW, а SQL преобразует столбец как RAW, поэтому будет работать только с первыми 2000 байтами.

Вы можете использовать Java для доступа к LONGСтолбцы RAW непосредственно из БД, как показано в вопросе «ПОЛУЧИТЕ ДЛИНУ ДЛИННОГО СЫРЬЯ» .

Вот небольшой пример, сначала настройка:

SQL> CREATE TABLE t (ID NUMBER PRIMARY key, source BLOB, destination LONG RAW);

Table created

SQL> DECLARE
  2     l_lob BLOB;
  3  BEGIN
  4     INSERT INTO t VALUES (1, 'FF', '') RETURNING SOURCE INTO l_lob;
  5     FOR i IN 1..10 LOOP
  6        dbms_lob.writeappend(l_lob, 4000,
  7                             utl_raw.overlay('FF', 'FF', 1, 4000, 'FF'));
  8     END LOOP;
  9  END;
 10  /

PL/SQL procedure successfully completed

Java-класс:

SQL> CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "Raw" AS
  2  import java.io.*;
  3  import java.sql.*;
  4  import oracle.jdbc.driver.*;
  5  
  6  public class Raw {
  7  
  8     public static void updateRaw(int pk) throws SQLException,IOException {
  9  
 10        Connection conn = new OracleDriver().defaultConnection();
 11  
 12        PreparedStatement ps = conn.prepareStatement
 13           ( "SELECT dbms_lob.getlength(source) length, source "
 14           + "FROM t WHERE id = ? FOR UPDATE");
 15        ps.setInt( 1, pk);
 16        ResultSet rs = ps.executeQuery();
 17  
 18        rs.next();
 19        int len = rs.getInt(1);
 20        InputStream source = rs.getBinaryStream(2);
 21        byte[] destArray = new byte[len];
 22        int byteRead = source.read(destArray);
 23        ps = conn.prepareStatement(
 24           "UPDATE t SET destination = ? WHERE id = ?");
 25        ((OraclePreparedStatement) ps).setRAW(1,
 26                                             new oracle.sql.RAW(destArray));
 27        ps.setInt(2, pk);
 28        ps.execute();
 29     }
 30  }
 31  /

Java created

Вы можете вызвать эту процедуру из PL / SQL:

SQL> CREATE OR REPLACE
  2  PROCEDURE update_raw(p_id NUMBER)
  3  AS LANGUAGE JAVA NAME 'Raw.updateRaw(int)';
  4  /

Procedure created

SQL> exec update_raw(1);

PL/SQL procedure successfully completed
0 голосов
/ 01 сентября 2011

Несмотря на то, что вы делаете разворот (обычно вам следует перейти от LONG к LOB, LONG устарел) ...

Вы должны использовать пакет dbms_lob и сделать несколько plsql:

В конце концов, вы можете использовать read, getlength ...

Док вы можете найти здесь Psoug.org или Oracle doc

...