2011-09-01 80 views
0

我正在查找从具有Blob列的表中选取数据并更新具有LONG RAW列的表的查询。看来Oracle只支持4000个字符。有没有办法将全部数据从blob复制到长生的。将数据从LOB列复制到Long Raw列

我用的是follwing查询

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个字符。

任何帮助,高度赞赏。

+1

['LONG RAW'](http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/datatype.htm#i4146)列最多支持2GB的数据。你为什么要从“LOB”到“LONG RAW”,而你应该走另一条路? – NullUserException

+0

我需要这个,因为我使用的数据库是非常古老的,我们必须使用这个,除非并且直到LONG RAW被convertrd转换为LOB。 –

回答

0

尽管你犯了一个逆转(normaly你应该从LONG移动到LOB,LONG是过时)...

必须使用DBMS_LOB包,并进行一些PLSQL:

Eventualy你可以使用阅读,对GetLength ...

文件,你可以在这里找到Psoug.orgOracle doc

3

PL/SQL将只读取/写入LONG RAW和SQL的第一个32k数据将CONVER将该列作为RAW,因此只能处理前2000个字节。

您可以使用java直接从DB访问LONG RAW列,如问题"Get the LENGTH of a 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

+1如果这个工程,很酷。 –

相关问题