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
Barbara Streisandasal
2025-01-19 14:41:13493semak imbas

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.

<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;
/</code>

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.

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

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:
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