Dans Oracle SQL Developer, la correspondance avec des tables de base de données utilisant de grandes listes de chaînes peut être difficile, surtout si les autorisations sont restreintes. Pour surmonter ce problème, envisagez les techniques suivantes :
Exploitez les collections pour stocker et manipuler efficacement un grand nombre de valeurs en mémoire. En créant une collection SYS.ODCIVARCHAR2LIST
, vous pouvez charger votre liste d'identifiants et effectuer des opérations de jointure à l'aide de requêtes imbriquées.
<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>
Pour une plus grande flexibilité, vous pouvez utiliser Java pour gérer les collections et l'exécution des requêtes. Cette approche consiste à créer un objet ARRAY et à le transmettre à l'instruction préparée.
<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>
Même avec des autorisations en lecture seule, ces méthodes fournissent des solutions efficaces pour faire correspondre de grandes listes de chaînes à l'aide de bases de données Oracle.
Veuillez noter que la méthode setARRAYAtName
dans l'exemple Java utilise un espace réservé ?
au lieu du nom de collection codé en dur "votre_collection", ce qui est plus conforme aux meilleures pratiques. De plus, la chaîne de connexion à la base de données, le nom d'utilisateur et le mot de passe doivent être remplacés par vos valeurs réelles.
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!