Oracle 将数据从LOB列复制到长原始列
我正在寻找一个查询,该查询从具有Blob列的表中提取数据,并更新具有长原始列的表。Oracle似乎最多只支持4000个字符。是否有一种方法可以将完整数据从blob复制到long raw 我使用了下面的查询Oracle 将数据从LOB列复制到长原始列,oracle,blob,long-integer,Oracle,Blob,Long Integer,我正在寻找一个查询,该查询从具有Blob列的表中提取数据,并更新具有长原始列的表。Oracle似乎最多只支持4000个字符。是否有一种方法可以将完整数据从blob复制到long raw 我使用了下面的查询 insert into APPDBA.QA_SOFTWARE_DUMMY select SOFTWARE_ID, UPDATED_BY, CREATE_CHANGE_DATE, FILE_NAME, DBMS_LOB.SUBSTR(SOFTWARE_FILE
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个字符
非常感谢您提供的任何帮助。尽管您进行了反转(通常您应该从LOG转到LOB,因为LOG已过时) 您必须使用dbms_lob包,并制作一些plsql: 最终,您可以使用read、getlength 你可以在这里找到医生
或者在上,PL/SQL将只读取/写入长原始数据的前32k,SQL将该列转换为原始数据,因此只处理前2000个字节 您可以使用java直接从DB访问长原始列,如问题中所示 下面是一个小示例,首先是设置:
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
列支持高达2GB的数据。为什么你要从
LOB
转换到LONG RAW
,而你应该从另一个方向转换呢?我需要这个,因为我使用的数据库非常旧,我们必须使用它,除非长RAW转换为LOB。