如何加载大量字符串与oracle数据库匹配?
How to load a large number of strings to match with oracle database?
我目前正在学习PL/SQL所以我还是个新手。假设您有一个生产数据库,您使用 Oracle SQL developer 连接到该数据库。您只有对该数据库的读取权限。因此您不能创建或编辑任何 tables.
我的问题是,如果我有一个很大的 ID 列表,我必须在该数据库中加入一个 table,我该怎么做?
显然,我可以将 ID 加载到临时 table 上,然后进行连接,但这真的很乏味,因为我只有 READ 权限。对 ID 进行硬编码也不是一种选择,因为列表太大。
还要注意,我知道临时 table 的概念。但不幸的是,我也没有创建这些的权限。
SQL 开发人员是否有任何解决方案,我可以在其中加载 ID 列表,以与数据库中的 table 相匹配?
您可以尝试通过构建如下查询来进行搜索:
SELECT * FROM YourTable WHERE ID IN (Id1, Id2, ...., Idn)
这限制为 1000 个 ID,但可以使用显示的这个小技巧来绕过它 here。
使用集合
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);
}
}
}
您友好的 dba 可以映射一个目录供您使用,这样您就可以将文件放在那里,并将其视为 table。然后基本上你加入了file-as-table。询问您的 DBA 关于 EXTERNAL_TABLES.
我目前正在学习PL/SQL所以我还是个新手。假设您有一个生产数据库,您使用 Oracle SQL developer 连接到该数据库。您只有对该数据库的读取权限。因此您不能创建或编辑任何 tables.
我的问题是,如果我有一个很大的 ID 列表,我必须在该数据库中加入一个 table,我该怎么做?
显然,我可以将 ID 加载到临时 table 上,然后进行连接,但这真的很乏味,因为我只有 READ 权限。对 ID 进行硬编码也不是一种选择,因为列表太大。
还要注意,我知道临时 table 的概念。但不幸的是,我也没有创建这些的权限。
SQL 开发人员是否有任何解决方案,我可以在其中加载 ID 列表,以与数据库中的 table 相匹配?
您可以尝试通过构建如下查询来进行搜索:
SELECT * FROM YourTable WHERE ID IN (Id1, Id2, ...., Idn)
这限制为 1000 个 ID,但可以使用显示的这个小技巧来绕过它 here。
使用集合
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);
}
}
}
您友好的 dba 可以映射一个目录供您使用,这样您就可以将文件放在那里,并将其视为 table。然后基本上你加入了file-as-table。询问您的 DBA 关于 EXTERNAL_TABLES.