Maison >base de données >tutoriel mysql >Comment faire correspondre efficacement de grandes listes de chaînes avec une base de données Oracle en utilisant uniquement les privilèges de lecture ?

Comment faire correspondre efficacement de grandes listes de chaînes avec une base de données Oracle en utilisant uniquement les privilèges de lecture ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-19 14:36:12560parcourir

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

Faites correspondre efficacement de grandes listes de chaînes à l'aide de la base de données Oracle

Introduction :

Lorsque vous traitez de grands ensembles de données, vous devez faire correspondre efficacement les chaînes avec les données stockées dans la base de données. Cet article explore des alternatives aux approches traditionnelles avec des autorisations de base de données limitées qui empêchent la création de tables temporaires ou la manipulation directe des structures de bases de données.

Énoncé du problème :

Comment faire correspondre efficacement une grande liste d'ID de chaîne à une table dans une base de données Oracle lorsque vous n'avez qu'un accès en lecture ? En raison de la taille de la liste, le codage en dur des identifiants n'est pas réalisable.

Option 1 : Utiliser les collections

Oracle fournit un mécanisme appelé « ensembles » qui peut être utilisé comme alternative aux tables temporaires. Une collection est une structure de données pouvant contenir une série de valeurs. Dans cet exemple, la collection peut être remplie avec des ID de chaîne. L'extrait de code PL/SQL suivant montre comment utiliser les collections :

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

Option 2 : Utiliser des tableaux Java

Si Java est disponible, la même méthode peut être implémentée via le code Java. L'extrait de code suivant montre comment utiliser un tableau Java pour transmettre une liste d'ID de chaîne à une requête 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>

Les deux options offrent un moyen efficace de faire correspondre de grandes listes d'ID de chaîne aux données d'une base de données Oracle sans avoir besoin de tables temporaires ou de modifications de la structure de la base de données.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn