sql >> Database teknologi >  >> RDS >> Oracle

Kopiering af data fra LOB-kolonne til Long Raw-kolonne

PL/SQL vil kun læse/skrive de første 32k af en LONG RAW, og SQL vil konvertere kolonnen som en RAW, så den vil kun omhandle de første 2000 bytes.

Du kan bruge java til at få adgang til LONG RAW-kolonner direkte fra DB, som vist i spørgsmålet "Få LENGDEN af en LANG RAW" .

Her er et lille eksempel, først opsætningen:

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-klassen:

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

Du kan kalde denne procedure fra 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. PHP-meddelelse:Udefineret offset

  2. psycopg2:Opdater flere rækker i en tabel med værdier fra en tupel af tupler

  3. Brug af mysql_real_escape_string med PDO (ingen forbindelse til localhost-server)

  4. Bedste måde at oprette konfigurationsfil (config.php) php