Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Sao chép dữ liệu từ cột LOB sang cột dài thô

PL / SQL sẽ chỉ đọc / ghi 32k đầu tiên của RAW DÀI và SQL sẽ chuyển đổi cột dưới dạng RAW, do đó sẽ chỉ xử lý 2000 byte đầu tiên.

Bạn có thể sử dụng java để truy cập các cột LONG RAW trực tiếp từ DB, như được minh họa trong câu hỏi " Nhận CHIỀU DÀI CỦA NGUYÊN LIỆU DÀI " .

Đây là một ví dụ nhỏ, đầu tiên là thiết lập:

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

Lớp 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

Bạn có thể gọi thủ tục này từ 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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cập nhật một cột trong bảng bằng cách sử dụng các giá trị duy nhất được chọn ngẫu nhiên từ một bảng khác

  2. Oracle ADF trên JBoss:Vấn đề kết nối Jdbc bị quấn

  3. Có phải nhà cung cấp OraOLEDB trong .NET không đáng tin cậy trên các trường CLOB?

  4. Hàm REPEAT tương đương trong Oracle

  5. java.sql.SQLException:ORA-03115:kiểu dữ liệu hoặc đại diện mạng không được hỗ trợ