Rumah > pangkalan data > tutorial mysql > Bagaimanakah Saya Boleh Memadankan Senarai Rentetan Besar Dengan Cekap Berbanding Jadual Pangkalan Data Oracle?

Bagaimanakah Saya Boleh Memadankan Senarai Rentetan Besar Dengan Cekap Berbanding Jadual Pangkalan Data Oracle?

Barbara Streisand
Lepaskan: 2025-01-19 14:41:13
asal
510 orang telah melayarinya

How Can I Efficiently Match Large String Lists Against an Oracle Database Table?

Padanan cekap senarai rentetan besar dalam pangkalan data Oracle

Dalam Oracle SQL Developer, pemadanan dengan jadual pangkalan data menggunakan senarai besar rentetan boleh menjadi mencabar, terutamanya jika kebenaran dihadkan. Untuk mengatasi masalah ini, pertimbangkan teknik berikut:

Koleksi

Manfaatkan koleksi untuk menyimpan dan memanipulasi sejumlah besar nilai dalam ingatan dengan cekap. Dengan mencipta koleksi SYS.ODCIVARCHAR2LIST anda boleh memuatkan senarai ID anda dan melakukan operasi sertai menggunakan pertanyaan bersarang.

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

Kaedah Java

Untuk fleksibiliti yang lebih besar, anda boleh menggunakan Java untuk mengendalikan koleksi dan pelaksanaan pertanyaan. Pendekatan ini melibatkan mencipta objek ARRAY dan menghantarnya ke pernyataan yang disediakan.

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( ? ) 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

Walaupun dengan kebenaran baca sahaja, kaedah ini menyediakan penyelesaian yang cekap untuk memadankan senarai rentetan besar menggunakan pangkalan data Oracle.

Sila ambil perhatian bahawa kaedah setARRAYAtName dalam contoh Java menggunakan pemegang tempat ? dan bukannya nama koleksi berkod keras "koleksi_anda", yang lebih selaras dengan amalan terbaik. Selain itu, rentetan sambungan pangkalan data sebenar, nama pengguna dan kata laluan perlu diganti dengan nilai sebenar anda.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memadankan Senarai Rentetan Besar Dengan Cekap Berbanding Jadual Pangkalan Data Oracle?. 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