首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何加载大量字符串以与oracle数据库匹配?

如何加载大量字符串以与oracle数据库匹配?
EN

Stack Overflow用户
提问于 2016-01-09 21:36:41
回答 3查看 4.9K关注 0票数 4

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

我的问题是,如果我有一个很大的ID列表,我必须加入数据库中的一个表,我怎么能这样做呢?

显然,我可以将ID加载到临时表中,然后执行联接,但这将非常繁琐,因为我只有读取权限。硬编码ID也不是一个选项,因为列表太大了。

还请注意,我知道临时表的概念。但不幸的是,我也没有创建这些的特权。

在中有什么解决方案可以加载ID列表,以便与数据库中的表匹配吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-09 22:40:30

使用集合

代码语言:javascript
运行
复制
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做同样的事情:

代码语言:javascript
运行
复制
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);
        }
    }
}
票数 4
EN

Stack Overflow用户

发布于 2016-01-09 21:46:13

您可以尝试通过构造如下的查询来执行搜索:

代码语言:javascript
运行
复制
SELECT * FROM YourTable WHERE ID IN (Id1, Id2, ...., Idn)

这是限制在1000个is,但它可以绕过使用这个小技巧显示的here

票数 0
EN

Stack Overflow用户

发布于 2016-01-09 23:04:18

友好的dba可以映射一个目录供您使用,这将使您可以将文件放入其中,并将其视为一个表。然后,基本上你加入了文件作为表。问问你的DBA关于EXTERNAL_TABLES的事。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34699223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档