引言:
处理大型数据集时,需要高效地将字符串与数据库中存储的数据进行匹配。本文探讨了在有限的数据库权限(妨碍创建临时表或直接操作数据库结构)下,对传统方法的替代方案。
问题陈述:
当只有读取权限时,如何高效地将大型字符串ID列表与Oracle数据库中的表进行匹配?由于列表大小的原因,硬编码ID不可行。
方案一:使用集合
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>
方案二:使用Java数组
如果可以使用Java,则可以通过Java代码实现相同的方法。以下代码片段演示了如何使用Java数组将字符串ID列表传递给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>
两种方案都提供了高效的方法来将大型字符串ID列表与Oracle数据库中的数据进行匹配,而无需临时表或修改数据库结构。
以上是如何仅使用读取权限将大型字符串列表与 Oracle 数据库有效匹配?的详细内容。更多信息请关注PHP中文网其他相关文章!