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