ホームページ >データベース >mysql チュートリアル >読み取り権限のみを使用して大規模な文字列リストをOracleデータベースと効率的に照合するにはどうすればよいですか?

読み取り権限のみを使用して大規模な文字列リストをOracleデータベースと効率的に照合するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-19 14:36:12569ブラウズ

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

Oracle データベースを使用して大きな文字列リストを効率的に照合します

紹介:

大規模なデータセットを扱う場合は、文字列とデータベースに保存されているデータを効率的に照合する必要があります。この記事では、一時テーブルの作成やデータベース構造の直接操作を妨げる、データベース権限が制限された従来のアプローチに代わる方法について説明します。

問題ステートメント:

読み取りアクセス権しかない場合に、文字列 ID の大きなリストを Oracle データベース内のテーブルと効率的に照合するにはどうすればよいでしょうか?リストのサイズが大きいため、ID をハードコーディングすることは現実的ではありません。

オプション 1: コレクションを使用する

Oracle は、一時テーブルの代わりに使用できる「セット」と呼ばれるメカニズムを提供しています。コレクションは、一連の値を保持できるデータ構造です。この例では、コレクションに文字列 ID を設定できます。次の PL/SQL コード スニペットは、コレクションの使用方法を示しています。

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

オプション 2: Java 配列を使用する

Java が利用可能な場合は、Java コードを通じて同じメソッドを実装できます。次のコード スニペットは、Java 配列を使用して文字列 ID のリストを SQL クエリに渡す方法を示しています。

どちらのオプションも、一時テーブルやデータベース構造の変更を必要とせずに、文字列 ID の大きなリストを Oracle データベース内のデータと照合する効率的な方法を提供します。
<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>

以上が読み取り権限のみを使用して大規模な文字列リストをOracleデータベースと効率的に照合するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。