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
Lepaskan: 2025-01-19 14:36:12
asal
569 orang telah melayarinya

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:

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;
Salin selepas log masuk

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:

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);
        }
    }
}
Salin selepas log masuk

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan