Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Memadankan Senarai Rentetan Besar dengan Pangkalan Data Oracle Dengan Cekap Hanya Menggunakan Keistimewaan Baca?

Bagaimana untuk Memadankan Senarai Rentetan Besar dengan Pangkalan Data Oracle Dengan Cekap Hanya Menggunakan Keistimewaan Baca?

Barbara Streisand
Barbara Streisandasal
2025-01-19 14:36:12569semak imbas

How to Efficiently Match Large String Lists with an Oracle Database Using Only Read Privileges?

Padankan senarai rentetan besar dengan cekap menggunakan pangkalan data Oracle

Pengenalan:

Apabila berurusan dengan set data yang besar, anda perlu memadankan rentetan dengan cekap dengan data yang disimpan dalam pangkalan data. Artikel ini meneroka alternatif kepada pendekatan tradisional dengan kebenaran pangkalan data terhad yang menghalang penciptaan jadual sementara atau manipulasi langsung struktur pangkalan data.

Pernyataan Masalah:

Bagaimana untuk memadankan senarai besar ID rentetan dengan cekap kepada jadual dalam pangkalan data Oracle apabila anda hanya mempunyai akses baca? Oleh kerana saiz senarai, ID pengekodan keras tidak boleh dilaksanakan.

Pilihan 1: Gunakan koleksi

Oracle menyediakan mekanisme yang dipanggil "set" yang boleh digunakan sebagai alternatif kepada jadual sementara. Koleksi ialah struktur data yang boleh menyimpan satu siri nilai. Dalam contoh ini, koleksi boleh diisi dengan ID rentetan. Coretan kod PL/SQL berikut menunjukkan cara menggunakan koleksi:

<code class="language-sql">VARIABLE cursor REFCURSOR;

DECLARE
  your_collection SYS.ODCIVARCHAR2LIST := SYS.ODCIVARCHAR2LIST();
BEGIN
  your_collection.EXTEND( 10000 );

  FOR i IN 1 .. 10000 LOOP
    -- 填充集合。
    your_collection(i) := DBMS_RANDOM.STRING( 'x', 20 );
  END LOOP;

  OPEN :cursor FOR
  SELECT t.*
  FROM   your_table t
         INNER JOIN
         TABLE( your_collection ) c
         ON t.id = c.COLUMN_VALUE;
END;
/

PRINT cursor;</code>

Pilihan 2: Gunakan tatasusunan Java

Jika Java tersedia, kaedah yang sama boleh dilaksanakan melalui kod Java. Coretan kod berikut menunjukkan cara menggunakan tatasusunan Java untuk menghantar senarai ID rentetan kepada pertanyaan SQL:

<code class="language-java">import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import oracle.jdbc.OraclePreparedStatement;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;

public class TestDatabase2 {
    public static void main(String args[]){
        try{
            Class.forName("oracle.jdbc.OracleDriver");

            Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","username","password");

            String[] ids = { "1", "2", "3" };

            ArrayDescriptor des = ArrayDescriptor.createDescriptor("SYS.ODCIVARCHAR2LIST", con);

            PreparedStatement st = con.prepareStatement("SELECT t.* FROM your_table t INNER JOIN TABLE( :your_collection ) c ON t.id = c.COLUMN_VALUE");

            // 将数组传递给过程 - 
            ((OraclePreparedStatement) st).setARRAYAtName( "your_collection", new ARRAY( des, con, ids ) );
            ResultSet cursor = st.executeQuery();

            while ( cursor.next() )
            {
                int id = cursor.getInt(1);
                double column1 = cursor.getDouble(2);
                double column2 = cursor.getDouble(3);

                System.out.println( String.format( "Id: %5d", id ) );
                System.out.println( String.format( "  Column1: %s", column1 ) );
                System.out.println( String.format( "  Column2: %s", column2 ) );
            }
        } catch(ClassNotFoundException | SQLException e) {
            System.out.println(e);
        }
    }
}</code>

Kedua-dua pilihan menyediakan cara yang cekap untuk memadankan senarai besar ID rentetan dengan data dalam pangkalan data Oracle tanpa memerlukan jadual sementara atau pengubahsuaian pada struktur pangkalan data.

Atas ialah kandungan terperinci Bagaimana untuk Memadankan Senarai Rentetan Besar dengan Pangkalan Data Oracle Dengan Cekap Hanya Menggunakan Keistimewaan Baca?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn