如何加载大量的string来匹配oracle数据库?

我目前正在学习PL / SQL,所以我仍然是一个新手。 假设您有一个生产数据库,您使用Oracle SQL开发人员连接到该数据库。 您只能读取该数据库的权限。 因此您不能创build或编辑任何表格。

我的问题是,如果我有一个大的ID列表,我必须join该数据库中的一个表,我该怎么做呢?

显然,我可以将ID加载到临时表中,然后进行连接,但是由于我只有READ权限,所以这将非常繁琐。 硬编码的ID也不是一个选项,因为列表太大。

另外请注意,我知道TEMPORARY表的概念。 但不幸的是,我也没有创build这些的权限。

SQL开发人员有什么解决scheme,我可以加载的ID列表,以匹配数据库中的表?

使用集合

VARIABLE cursor REFCURSOR; DECLARE your_collection SYS.ODCIVARCHAR2LIST := SYS.ODCIVARCHAR2LIST(); BEGIN your_collection.EXTEND( 10000 ); FOR i IN 1 .. 10000 LOOP -- Populate the collection. 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; 

或者通过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"); // Passing an array to the procedure - ((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); } } } 

您可以尝试通过构build像这样的查询来进行search:

 SELECT * FROM YourTable WHERE ID IN (Id1, Id2, ...., Idn) 

这是限制在1000 Ids,但它可以通过这里显示的这个小技巧绕过。

你的友好的dba可以映射一个目录给你使用,这将让你把文件放在那里,并把它当作一张表。 那么基本上,你join了文件的表格。 询问你的DBA关于EXTERNAL_TABLES。