Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

LOB कॉलम से डेटा को लॉन्ग रॉ कॉलम में कॉपी करना

पीएल/एसक्यूएल केवल लंबे रॉ के पहले 32k को पढ़/लिखेगा और एसक्यूएल कॉलम को रॉ के रूप में परिवर्तित कर देगा, इसलिए केवल पहले 2000 बाइट्स से निपटेगा।

आप डीबी से सीधे लंबे रॉ कॉलम तक पहुंचने के लिए जावा का उपयोग कर सकते हैं, जैसा कि प्रश्न में दिखाया गया है "एक लंबी रॉ की लंबाई प्राप्त करें"

यहां एक छोटा सा उदाहरण दिया गया है, पहले सेटअप:

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

जावा क्लास:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पंक्ति की प्रतिलिपि बनाएँ और स्तंभों का एक छोटा उपसमूह बदलें?

  2. Oracle/SQL - नल को छोड़कर एक मान के साथ रिकॉर्ड ढूँढना

  3. रीड कॉल से माइनस वन मिला

  4. टॉप एन और बॉटम नंबर चुनें

  5. Oracle - एक varchar कॉलम में to_number फ़ंक्शन को लागू करना