sql >> データベース >  >> RDS >> Oracle

LOB列からLongRaw列へのデータのコピー

    PL /SQLはLONG​​RAWの最初の32kのみを読み取り/書き込みし、SQLは列をRAWとして変換するため、最初の2000バイトのみを処理します。

    質問「LONGRAWの長さを取得する」 。

    これが小さな例です。最初にセットアップを行います:

    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
    


    1. Laravel5のorderByDescで平均を取得する方法

    2. Laravel 4:多対多の関係で選択された/特定の列を取得する方法は?

    3. 孤立した行を削除するエレガントな方法は?

    4. 同じ名前の列を持つテーブルを結合するときのPHPの問題